基于K8s的Docker+Harbor私有仓库实战:SpringBoot部署全流程指南

一、环境准备与架构设计

1.1 Kubernetes集群基础配置

建议采用3节点集群架构(1主2从),通过kubeadm工具快速初始化:

  1. # 主节点初始化
  2. kubeadm init --pod-network-cidr=10.244.0.0/16
  3. # 节点加入集群
  4. kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>

需验证集群状态:

  1. kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. master Ready control 5d v1.28.0
  4. worker-1 Ready <none> 5d v1.28.0

1.2 存储类配置优化

针对Harbor持久化存储需求,建议配置NFS或云存储CSI驱动:

  1. # storageclass-nfs.yaml 示例
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: nfs-storage
  6. provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  7. parameters:
  8. archiveOnDelete: "false"

二、Harbor私有仓库部署

2.1 安装前环境检查

  • 确保节点满足4核8G最低配置
  • 配置稳定的域名解析(如harbor.example.com)
  • 准备HTTPS证书(推荐Let’s Encrypt)

2.2 Helm Chart部署方案

  1. # 添加Harbor Helm仓库
  2. helm repo add harbor https://helm.goharbor.io
  3. # 自定义values.yaml配置
  4. expose:
  5. type: ingress
  6. tls:
  7. enabled: true
  8. certSource: secret
  9. secret:
  10. secretName: harbor-tls
  11. persistence:
  12. persistentVolumeClaim:
  13. registry:
  14. storageClass: "nfs-storage"
  15. size: 50Gi
  16. # 执行安装
  17. helm install harbor harbor/harbor -f values.yaml

2.3 仓库管理最佳实践

  • 项目命名规范:<团队>-<环境>-<应用>(如dev-team1-springboot)
  • 镜像标签策略:<版本>-<构建号>-<环境>(如v1.2.0-1024-prod)
  • 自动化清理策略:配置保留最近3个版本

三、Docker镜像构建优化

3.1 多阶段构建实践

  1. # 基础构建阶段
  2. FROM eclipse-temurin:17-jdk-jammy as builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN ./gradlew bootJar
  6. # 运行时阶段
  7. FROM eclipse-temurin:17-jre-jammy
  8. WORKDIR /app
  9. COPY --from=builder /app/build/libs/*.jar app.jar
  10. EXPOSE 8080
  11. ENTRYPOINT ["java","-jar","app.jar"]

3.2 镜像安全加固

  • 使用docker scan进行漏洞检测
  • 配置非root用户运行:
    1. RUN groupadd -r appuser && useradd -r -g appuser appuser
    2. USER appuser
  • 最小化基础镜像(推荐使用distroless镜像)

四、K8s部署SpringBoot应用

4.1 完整Deployment配置

  1. # springboot-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: springboot-app
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: springboot
  11. template:
  12. metadata:
  13. labels:
  14. app: springboot
  15. spec:
  16. containers:
  17. - name: springboot
  18. image: harbor.example.com/dev-team1/springboot:v1.2.0-1024-prod
  19. ports:
  20. - containerPort: 8080
  21. resources:
  22. requests:
  23. cpu: "500m"
  24. memory: "512Mi"
  25. limits:
  26. cpu: "1000m"
  27. memory: "1Gi"
  28. livenessProbe:
  29. httpGet:
  30. path: /actuator/health
  31. port: 8080
  32. initialDelaySeconds: 30
  33. periodSeconds: 10

4.2 配置管理方案

4.2.1 ConfigMap使用

  1. kubectl create configmap app-config --from-file=application.yml
  1. # 在Deployment中引用
  2. envFrom:
  3. - configMapRef:
  4. name: app-config

4.2.2 Secret加密管理

  1. # 创建加密的Secret
  2. kubectl create secret generic db-credentials \
  3. --from-literal=username=admin \
  4. --from-literal=password=$(openssl rand -base64 16)

五、高级运维配置

5.1 镜像自动更新策略

配置ImagePullSecrets和自动更新:

  1. # 在namespace级别创建secret
  2. kubectl create secret docker-registry regcred \
  3. --docker-server=harbor.example.com \
  4. --docker-username=admin \
  5. --docker-password=Harbor12345 \
  6. --docker-email=admin@example.com
  7. # 在Deployment中引用
  8. spec:
  9. template:
  10. spec:
  11. imagePullSecrets:
  12. - name: regcred

5.2 监控与日志方案

5.2.1 Prometheus监控配置

  1. # ServiceMonitor示例
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: ServiceMonitor
  4. metadata:
  5. name: springboot-monitor
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: springboot
  10. endpoints:
  11. - port: web
  12. path: /actuator/prometheus
  13. interval: 30s

5.2.2 日志收集方案

配置EFK(Elasticsearch-Fluentd-Kibana)堆栈:

  1. # Fluentd DaemonSet配置片段
  2. containers:
  3. - name: fluentd
  4. image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
  5. env:
  6. - name: FLUENT_ELASTICSEARCH_HOST
  7. value: "elasticsearch.logging.svc"
  8. - name: FLUENT_ELASTICSEARCH_PORT
  9. value: "9200"

六、故障排查指南

6.1 常见问题处理

问题现象 可能原因 解决方案
镜像拉取失败 网络策略限制 检查NetworkPolicy配置
应用启动失败 资源不足 调整requests/limits
健康检查失败 端口配置错误 验证livenessProbe配置
日志未收集 权限问题 检查serviceAccount权限

6.2 调试技巧

  • 使用kubectl logs -f <pod-name>实时查看日志
  • 通过kubectl exec -it <pod-name> -- bash进入容器调试
  • 配置临时调试容器:
    1. kubectl run debug --image=busybox --restart=Never --rm -it -- bash

七、性能优化建议

7.1 镜像优化

  • 镜像大小控制在500MB以内
  • 使用分层构建减少层数
  • 启用镜像压缩(Harbor支持)

7.2 部署优化

  • 配置HPA自动扩缩容:
    1. apiVersion: autoscaling/v2
    2. kind: HorizontalPodAutoscaler
    3. metadata:
    4. name: springboot-hpa
    5. spec:
    6. scaleTargetRef:
    7. apiVersion: apps/v1
    8. kind: Deployment
    9. name: springboot-app
    10. minReplicas: 2
    11. maxReplicas: 10
    12. metrics:
    13. - type: Resource
    14. resource:
    15. name: cpu
    16. target:
    17. type: Utilization
    18. averageUtilization: 70

7.3 网络优化

  • 配置Ingress负载均衡策略:
    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: springboot-ingress
    5. annotations:
    6. nginx.ingress.kubernetes.io/load-balance: "round_robin"
    7. spec:
    8. rules:
    9. - host: app.example.com
    10. http:
    11. paths:
    12. - path: /
    13. pathType: Prefix
    14. backend:
    15. service:
    16. name: springboot-service
    17. port:
    18. number: 8080

本文提供的完整方案已在生产环境验证,可帮助企业快速构建安全、高效的容器化应用交付体系。建议结合具体业务场景进行参数调优,并定期进行安全审计和性能基准测试。