K8s环境下Docker+Harbor私有仓库部署SpringBoot全指南

一、引言:私有镜像仓库的必要性

在Kubernetes(K8s)环境中,使用私有镜像仓库(如Harbor)是保障应用安全性和提升部署效率的关键措施。相较于公共仓库(如Docker Hub),私有仓库能够:

  1. 控制访问权限:通过RBAC策略限制镜像拉取/推送权限;
  2. 提升镜像分发速度:减少跨网络传输延迟;
  3. 实现镜像安全扫描:自动检测漏洞,降低安全风险;
  4. 符合合规要求:满足金融、政府等行业的敏感数据存储规范。

本文将以SpringBoot应用为例,完整演示从Harbor部署到K8s集群中应用运行的全流程。

二、环境准备与前置条件

1. 基础环境要求

  • K8s集群:1.20+版本(推荐使用kubeadm部署的3节点集群)
  • Docker:19.03+版本(需支持BuildKit)
  • Helm:3.x版本(用于Harbor快速部署)
  • 存储类:已配置持久化存储(如NFS、Ceph或云存储)

2. 网络规划建议

  • Harbor域名:建议使用harbor.example.com等子域名
  • NodePort/Ingress:根据集群类型选择暴露方式(生产环境推荐Ingress+TLS)
  • 网络策略:限制Harbor仅允许内网访问(除非需开放公网)

三、Harbor私有仓库部署指南

1. Helm安装Harbor(推荐方式)

  1. # 添加Bitnami Helm仓库
  2. helm repo add bitnami https://charts.bitnami.com/bitnami
  3. # 创建命名空间
  4. kubectl create ns harbor
  5. # 部署Harbor(带持久化存储)
  6. helm install harbor bitnami/harbor \
  7. --namespace harbor \
  8. --set persistence.enabled=true \
  9. --set persistence.storageClass="nfs-client" \
  10. --set expose.type=ingress \
  11. --set expose.tls.enabled=true \
  12. --set expose.ingress.hosts[0].name="harbor.example.com" \
  13. --set expose.ingress.hosts[0].path="/"

2. 关键配置说明

  • 持久化存储:必须配置以避免数据丢失
  • HTTPS配置:生产环境必须启用TLS(可使用Let’s Encrypt证书)
  • 资源限制:建议为Harbor核心组件设置资源请求/限制
    1. # values.yaml示例片段
    2. core:
    3. resources:
    4. requests:
    5. cpu: "500m"
    6. memory: "512Mi"
    7. limits:
    8. cpu: "1000m"
    9. memory: "1Gi"

3. 部署后验证

  1. # 获取Harbor服务状态
  2. kubectl get pods -n harbor
  3. # 访问控制台(需配置hosts或DNS)
  4. echo "访问 https://harbor.example.com"

四、Docker镜像构建与推送

1. SpringBoot应用Docker化

以典型SpringBoot项目为例,创建Dockerfile

  1. FROM eclipse-temurin:17-jdk-alpine
  2. VOLUME /tmp
  3. ARG JAR_FILE=target/*.jar
  4. COPY ${JAR_FILE} app.jar
  5. ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像时指定Harbor仓库地址:

  1. docker build -t harbor.example.com/library/springboot-demo:v1 .

2. 镜像推送配置

2.1 登录Harbor仓库

  1. docker login harbor.example.com
  2. # 输入Harbor管理员或项目成员账号

2.2 推送镜像

  1. docker push harbor.example.com/library/springboot-demo:v1

3. 常见问题处理

  • 证书错误:若Harbor使用自签名证书,需配置Docker信任:
    1. # 在/etc/docker/daemon.json中添加
    2. {
    3. "insecure-registries": ["harbor.example.com"]
    4. }
    5. # 然后重启docker
    6. systemctl restart docker

五、K8s集群配置与部署

1. 创建ImagePullSecret

  1. kubectl create secret docker-registry regcred \
  2. --namespace=default \
  3. --docker-server=harbor.example.com \
  4. --docker-username=<harbor-user> \
  5. --docker-password=<harbor-password> \
  6. --docker-email=user@example.com

2. SpringBoot应用Deployment示例

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: springboot-demo
  5. spec:
  6. replicas: 2
  7. selector:
  8. matchLabels:
  9. app: springboot-demo
  10. template:
  11. metadata:
  12. labels:
  13. app: springboot-demo
  14. spec:
  15. imagePullSecrets:
  16. - name: regcred
  17. containers:
  18. - name: springboot
  19. image: harbor.example.com/library/springboot-demo:v1
  20. ports:
  21. - containerPort: 8080
  22. resources:
  23. requests:
  24. cpu: "250m"
  25. memory: "512Mi"

3. 服务暴露配置

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: springboot-service
  5. spec:
  6. selector:
  7. app: springboot-demo
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 8080
  12. type: ClusterIP # 或LoadBalancer/NodePort

六、高级配置与优化

1. Harbor镜像自动扫描

在Harbor的values.yaml中启用Trivy扫描:

  1. trivy:
  2. enabled: true
  3. ignoreUnfixed: false
  4. severity: "CRITICAL,HIGH"

2. K8s镜像缓存优化

配置imagePullPolicy: IfNotPresent减少重复拉取:

  1. containers:
  2. - name: springboot
  3. image: harbor.example.com/library/springboot-demo:v1
  4. imagePullPolicy: IfNotPresent

3. 多环境镜像管理策略

建议采用以下命名规范:

  • 开发环境:harbor.example.com/dev/springboot-demo:v1-20230801
  • 测试环境:harbor.example.com/test/springboot-demo:v1-20230801
  • 生产环境:harbor.example.com/prod/springboot-demo:v1

七、运维与监控建议

1. Harbor监控指标

通过Prometheus采集Harbor指标:

  1. # 在Prometheus的values.yaml中添加
  2. additionalScrapeConfigs:
  3. - job_name: 'harbor'
  4. static_configs:
  5. - targets: ['harbor-core.harbor.svc.cluster.local:8001']

2. 镜像生命周期管理

设置Harbor的垃圾回收策略:

  1. # 手动触发垃圾回收
  2. kubectl exec -n harbor <harbor-core-pod> -- /harbor/harbor_core --gc

3. 日志集中管理

配置Fluentd收集Harbor容器日志:

  1. <source>
  2. @type tail
  3. path /var/log/containers/harbor-core*.log
  4. pos_file /var/log/harbor-core.log.pos
  5. tag harbor.core.*
  6. format json
  7. </source>

八、总结与最佳实践

  1. 安全优先:始终启用HTTPS和镜像扫描
  2. 存储冗余:为Harbor数据配置多副本存储
  3. 网络隔离:限制Harbor仅允许必要节点访问
  4. 自动化流水线:集成Jenkins/GitLab CI实现镜像自动构建推送
  5. 版本控制:采用语义化版本标签管理镜像

通过本文的完整流程,开发者可以在K8s环境中快速搭建安全高效的私有镜像仓库,并实现SpringBoot应用的自动化部署。实际生产环境中,建议结合企业级CI/CD平台(如ArgoCD、Tekton)构建完整的DevOps流水线。