本文目录导读:

我来详细介绍如何将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集群中了,记得根据实际需求调整配置参数。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播