Kubernetes部署SpringBootPod

wen java案例 1

本文目录导读:

Kubernetes部署SpringBootPod

  1. 准备工作
  2. Kubernetes配置清单
  3. 部署到Kubernetes
  4. Spring Boot配置优化
  5. 高级配置
  6. 管理和监控
  7. 最佳实践
  8. 故障排查

我来详细介绍如何将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集群中了,记得根据实际需求调整配置参数。

抱歉,评论功能暂时关闭!