K8s 环境下 Docker+Harbor 私有仓库实战:SpringBoot 应用部署全流程指南

一、环境准备与架构设计

1.1 基础设施规划

在 Kubernetes 集群中部署私有镜像仓库需考虑高可用架构,典型方案包括:

  • 节点分布:Harbor 组件(Core、Database、JobService、Registry)应分散部署在至少3个工作节点
  • 存储配置:推荐使用 PersistentVolumeClaim 绑定云存储(如 AWS EBS、阿里云盘)或 Ceph 分布式存储
  • 网络要求:需开放 80(HTTP)、443(HTTPS)、22(SSH)端口,建议通过 Ingress 统一暴露服务

1.2 组件版本兼容性

组件 推荐版本 兼容性说明
Kubernetes 1.24+ 支持 StatefulSet 动态扩容
Docker 20.10+ 需启用 BuildKit 加速构建
Harbor 2.6+ 集成 Clair 漏洞扫描组件
SpringBoot 2.7.x/3.0.x 提供标准化 Dockerfile 模板

二、Harbor 私有仓库搭建

2.1 安装方式对比

方案 适用场景 部署复杂度
Helm Chart 生产环境,需高可用 ★★★☆
离线包 内网环境,无互联网访问 ★★☆☆
Operator 自动化运维,需 CRD 管理 ★★★★

推荐方案:使用 Helm Chart 部署(需提前安装 Helm v3.10+)

  1. # 添加 Bitnami 仓库
  2. helm repo add bitnami https://charts.bitnami.com/bitnami
  3. # 创建命名空间
  4. kubectl create ns harbor
  5. # 部署 Harbor(带 HTTPS 配置)
  6. helm install harbor bitnami/harbor \
  7. --namespace harbor \
  8. --set expose.type=ingress \
  9. --set expose.tls.enabled=true \
  10. --set expose.tls.certSource=secret \
  11. --set expose.tls.secretName=harbor-tls

2.2 核心配置项

  • 存储类配置

    1. # storageclass.yaml 示例
    2. apiVersion: storage.k8s.io/v1
    3. kind: StorageClass
    4. metadata:
    5. name: harbor-sc
    6. provisioner: kubernetes.io/aws-ebs # 根据云厂商调整
    7. parameters:
    8. type: gp3
    9. fsType: xfs
  • 数据库持久化

    1. # 创建 PostgreSQL PVC
    2. kubectl apply -f - <<EOF
    3. apiVersion: v1
    4. kind: PersistentVolumeClaim
    5. metadata:
    6. name: postgresql-pv-claim
    7. namespace: harbor
    8. spec:
    9. accessModes:
    10. - ReadWriteOnce
    11. resources:
    12. requests:
    13. storage: 50Gi
    14. storageClassName: harbor-sc
    15. EOF

三、Docker 镜像构建优化

3.1 SpringBoot 应用标准化

推荐 Dockerfile 模板

  1. # 使用多阶段构建减小镜像体积
  2. FROM eclipse-temurin:17-jdk-jammy as builder
  3. WORKDIR /app
  4. COPY gradlew build.gradle.kts settings.gradle.kts ./
  5. COPY src src/
  6. RUN ./gradlew bootJar --no-daemon
  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"]

构建优化技巧

  1. 使用 --build-arg 动态传递版本号
  2. 启用 BuildKit 加速(DOCKER_BUILDKIT=1
  3. 通过 .dockerignore 排除无关文件

3.2 镜像安全加固

  • 漏洞扫描:集成 Clair 或 Trivy

    1. # 使用 Trivy 扫描镜像
    2. trivy image --severity CRITICAL,HIGH your-image:tag
  • 签名验证:配置 Cosign 进行镜像签名
    ```bash

    生成密钥对

    cosign generate-key-pair

签名镜像

cosign sign —key cosign.key your-image:tag

  1. # 四、K8s 部署 SpringBoot 应用
  2. ## 4.1 标准化部署清单
  3. **deployment.yaml 示例**:
  4. ```yaml
  5. apiVersion: apps/v1
  6. kind: Deployment
  7. metadata:
  8. name: springboot-app
  9. spec:
  10. replicas: 3
  11. selector:
  12. matchLabels:
  13. app: springboot
  14. template:
  15. metadata:
  16. labels:
  17. app: springboot
  18. spec:
  19. containers:
  20. - name: springboot
  21. image: harbor.example.com/library/springboot:1.0.0
  22. ports:
  23. - containerPort: 8080
  24. resources:
  25. requests:
  26. cpu: "500m"
  27. memory: "512Mi"
  28. limits:
  29. cpu: "1000m"
  30. memory: "1Gi"
  31. livenessProbe:
  32. httpGet:
  33. path: /actuator/health
  34. port: 8080
  35. initialDelaySeconds: 30
  36. periodSeconds: 10

4.2 持续集成流程

  1. 代码提交:触发 GitLab CI/CD 流水线
  2. 镜像构建

    1. # .gitlab-ci.yml 片段
    2. build:
    3. stage: build
    4. script:
    5. - docker build -t $HARBOR_HOST/$PROJECT_NAME/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA .
    6. - docker push $HARBOR_HOST/$PROJECT_NAME/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
  3. 滚动更新策略

    1. # 部署策略配置
    2. strategy:
    3. type: RollingUpdate
    4. rollingUpdate:
    5. maxSurge: 25%
    6. maxUnavailable: 25%

五、运维监控体系

5.1 日志收集方案

  • EFK 栈部署

    1. # 使用 Helm 部署 Elasticsearch
    2. helm install elasticsearch elastic/elasticsearch --namespace logging \
    3. --set replicas=3 \
    4. --set minimumMasterNodes=2
  • Fluentd 配置

    1. <match springboot.**>
    2. @type elasticsearch
    3. host "elasticsearch-master"
    4. port 9200
    5. index_name "springboot-${tag}"
    6. </match>

5.2 性能监控指标

  • 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. interval: 30s
    13. path: /actuator/prometheus

六、故障排查指南

6.1 常见问题处理

现象 排查步骤
镜像拉取失败 检查 kubectl describe pod 中的 Events,验证 Harbor 证书配置
容器频繁重启 查看日志 kubectl logs -f <pod-name>,检查内存限制是否合理
健康检查失败 确认 /actuator/health 端点是否暴露,调整 initialDelaySeconds 参数

6.2 性能调优建议

  1. JVM 参数优化

    1. ENV JAVA_OPTS="-XX:MaxRAMPercentage=75.0 -XX:+UseG1GC"
    2. ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar app.jar"]
  2. K8s 资源限制

  • CPU 请求值建议设为容器实际使用的120%
  • 内存限制需包含 JVM 堆外内存(建议比 Xmx 大20%)

七、安全最佳实践

  1. 网络策略

    1. # 限制 Pod 间通信
    2. apiVersion: networking.k8s.io/v1
    3. kind: NetworkPolicy
    4. metadata:
    5. name: restrict-springboot
    6. spec:
    7. podSelector:
    8. matchLabels:
    9. app: springboot
    10. policyTypes:
    11. - Ingress
    12. ingress:
    13. - from:
    14. - namespaceSelector:
    15. matchLabels:
    16. name: ingress-nginx
    17. ports:
    18. - protocol: TCP
    19. port: 8080
  2. 镜像推送权限

    1. # 创建 Harbor 机器人账号
    2. curl -X POST "https://harbor.example.com/api/v2.0/robots" \
    3. -H "accept: application/json" \
    4. -H "Content-Type: application/json" \
    5. -d '{
    6. "name": "k8s-robot",
    7. "description": "Used for CI/CD",
    8. "expires_in": 86400,
    9. "permissions": [
    10. {"project_id": 1, "access": ["push"]}]
    11. }'

通过本文提供的完整方案,开发者可在 Kubernetes 环境中快速构建企业级 Docker+Harbor 镜像管理体系,实现 SpringBoot 应用的安全、高效部署。实际实施时建议先在测试环境验证所有组件的兼容性,再逐步推广到生产环境。