本文目录导读:

我来详细介绍如何将Spring Boot应用部署到Kubernetes集群中。
准备工作
1 Spring Boot应用准备
首先确保你的Spring Boot应用已经准备好,并创建Dockerfile:
# Dockerfile FROM openjdk:17-jdk-slim AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN ./mvnw package -DskipTests FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=build /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
2 构建Docker镜像
# 构建镜像 docker build -t my-spring-boot-app:1.0 . # 推送到镜像仓库(如Docker Hub) docker tag my-spring-boot-app:1.0 yourusername/my-spring-boot-app:1.0 docker push yourusername/my-spring-boot-app:1.0
Kubernetes配置清单
1 创建Deployment
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-app
labels:
app: spring-boot-app
spec:
replicas: 3
selector:
matchLabels:
app: spring-boot-app
template:
metadata:
labels:
app: spring-boot-app
spec:
containers:
- name: app
image: yourusername/my-spring-boot-app:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "production"
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: app-config
key: database-url
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 20
periodSeconds: 5
2 创建Service
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: spring-boot-app-service
spec:
selector:
app: spring-boot-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP
3 创建ConfigMap和Secret
# configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: database-url: "jdbc:mysql://mysql-service:3306/mydb" app.name: "My Spring Boot App" logging.level: "INFO" --- # secret.yaml apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque stringData: username: "dbuser" password: "dbpassword123"
4 创建Ingress(可选)
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: spring-boot-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: spring-boot-app-service
port:
number: 80
部署到Kubernetes
1 创建资源
# 创建命名空间(可选) kubectl create namespace myapp # 应用配置 kubectl apply -f configmap.yaml kubectl apply -f secret.yaml # 部署应用 kubectl apply -f deployment.yaml kubectl apply -f service.yaml # 创建Ingress(如果需要) kubectl apply -f ingress.yaml # 指定命名空间 kubectl apply -f deployment.yaml -n myapp
2 验证部署
# 查看Pod状态 kubectl get pods kubectl get pods -n myapp # 查看详细信息 kubectl describe pod spring-boot-app-xxxxx # 查看日志 kubectl logs -f deployment/spring-boot-app # 查看服务 kubectl get svc kubectl get endpoints # 查看部署状态 kubectl rollout status deployment/spring-boot-app
Spring Boot配置优化
1 application.yml配置
# application.yml
spring:
application:
name: my-spring-boot-app
datasource:
url: ${DATABASE_URL:jdbc:h2:mem:testdb}
username: ${DATABASE_USERNAME:sa}
password: ${DATABASE_PASSWORD:}
driver-class-name: ${DATABASE_DRIVER:org.h2.Driver}
jpa:
hibernate:
ddl-auto: update
show-sql: false
management:
endpoints:
web:
exposure:
include: health,info,metrics,env
endpoint:
health:
show-details: always
server:
port: 8080
shutdown: graceful
2 健康检查端点配置
@RestController
@RequestMapping("/actuator")
public class HealthController {
@GetMapping("/health/readiness")
public ResponseEntity<String> readiness() {
// 自定义就绪检查逻辑
return ResponseEntity.ok("OK");
}
}
高级配置
1 水平自动伸缩
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: spring-boot-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: spring-boot-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
2 持久化存储
# persistent-volume-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
# deployment中挂载
volumeMounts:
- name: app-data
mountPath: /data/app
volumes:
- name: app-data
persistentVolumeClaim:
claimName: app-data-pvc
管理和监控
1 常用管理命令
# 更新镜像 kubectl set image deployment/spring-boot-app app=yourusername/my-spring-boot-app:2.0 # 回滚版本 kubectl rollout undo deployment/spring-boot-app # 查看历史版本 kubectl rollout history deployment/spring-boot-app # 扩缩容 kubectl scale deployment/spring-boot-app --replicas=5 # 端口转发(本地调试) kubectl port-forward service/spring-boot-app-service 8080:80
2 监控配置
# pod-monitor.yaml (适用于Prometheus Operator)
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: spring-boot-app-monitor
spec:
selector:
matchLabels:
app: spring-boot-app
podMetricsEndpoints:
- port: metrics
interval: 15s
最佳实践
1 镜像优化
- 使用多阶段构建减小镜像体积
- 使用Jlink创建自定义JRE
- 启用Spring Boot分层JAR
2 配置管理
- 敏感信息使用Secrets
- 环境相关配置使用ConfigMaps
- 使用Spring Cloud Config或Kubernetes ConfigMap
3 性能优化
- 合理设置资源限制
- 启用缓存(如Redis)
- 使用连接池
- 配置合适的JVM参数
4 安全考虑
- 使用ServiceAccount控制权限
- 实施网络策略
- 启用TLS/SSL
- 定期更新依赖版本
故障排查
# 查看Pod日志 kubectl logs deployment/spring-boot-app --tail=100 -f # 进入Pod容器 kubectl exec -it pod/spring-boot-app-xxxxx -- /bin/sh # 查看事件 kubectl describe pod spring-boot-app-xxxxx # 查看资源使用 kubectl top pod spring-boot-app-xxxxx # 性能分析 kubectl exec pod/spring-boot-app-xxxxx -- jcmd 1 VM.native_memory
这样,你的Spring Boot应用就成功部署到Kubernetes集群中了,记得根据实际需求调整配置参数。