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

一、环境准备与架构概述

1.1 基础环境要求

在K8s集群中部署Docker+Harbor私有镜像仓库前,需确保以下基础条件:

  • K8s集群:建议使用1.20+版本,可通过kubeadm、minikube或云服务商提供的托管服务搭建
  • 存储类:配置动态存储供应(StorageClass),推荐使用NFS、Ceph或云存储
  • 网络插件:确保Calico、Flannel等网络插件正常运行
  • Docker环境:所有节点需安装Docker CE 19.03+版本

1.2 架构设计

典型部署架构包含:

  • Harbor核心组件
    • Proxy服务(Nginx反向代理)
    • Core服务(API接口)
    • Database(PostgreSQL)
    • Registry(Docker镜像存储)
    • Clair(漏洞扫描,可选)
  • K8s集成点
    • 通过NodePort或Ingress暴露Harbor服务
    • 使用Secret管理镜像仓库认证
    • 配置ImagePullSecrets实现私有镜像拉取

二、Harbor私有仓库搭建

2.1 安装前配置

2.1.1 准备持久化存储

  1. # 创建NFS共享目录(示例)
  2. mkdir -p /data/harbor
  3. # 在K8s中创建PV(PersistentVolume)
  4. cat <<EOF | kubectl apply -f -
  5. apiVersion: v1
  6. kind: PersistentVolume
  7. metadata:
  8. name: harbor-pv
  9. spec:
  10. capacity:
  11. storage: 100Gi
  12. accessModes:
  13. - ReadWriteOnce
  14. nfs:
  15. path: /data/harbor
  16. server: 192.168.1.100
  17. EOF

2.1.2 配置HTTPS证书

生成自签名证书(生产环境建议使用CA签发):

  1. openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  2. -keyout harbor.key -out harbor.crt \
  3. -subj "/CN=harbor.example.com"

2.2 Harbor部署流程

2.2.1 使用Helm安装

  1. # 添加Harbor Helm仓库
  2. helm repo add harbor https://helm.goharbor.io
  3. # 创建values.yaml定制配置
  4. cat <<EOF > values.yaml
  5. expose:
  6. type: ingress
  7. tls:
  8. enabled: true
  9. certSource: secret
  10. secret:
  11. secretName: harbor-tls
  12. certificate: harbor.crt
  13. key: harbor.key
  14. ingress:
  15. hosts:
  16. - host: harbor.example.com
  17. paths:
  18. - path: /
  19. pathType: ImplementationSpecific
  20. persistence:
  21. persistentVolumeClaim:
  22. registry:
  23. storageClass: "nfs-client"
  24. accessMode: ReadWriteOnce
  25. size: 50Gi
  26. EOF
  27. # 安装Harbor
  28. helm install harbor harbor/harbor -f values.yaml

2.2.2 验证部署

  1. # 获取服务状态
  2. kubectl get pods -n default | grep harbor
  3. # 访问Web界面
  4. https://harbor.example.com

2.3 安全配置

2.3.1 用户权限管理

  • 创建项目时启用内容信任(Content Trust)
  • 配置RBAC策略:
    1. # 示例:创建只读用户
    2. harbor-cli user create --username reader --password ReadOnly123!
    3. harbor-cli project create --name devops --public false
    4. harbor-cli project add-member --name devops --username reader --role guest

2.3.2 镜像签名配置

  1. 安装Notary客户端
  2. 在项目中启用”Enable Content Trust”
  3. 推送镜像时使用--disable-content-trust=false

三、SpringBoot应用部署

3.1 镜像构建与推送

3.1.1 Dockerfile优化

  1. # 多阶段构建示例
  2. FROM maven:3.8.4-jdk-11 AS build
  3. WORKDIR /app
  4. COPY pom.xml .
  5. RUN mvn dependency:go-offline
  6. COPY src ./src
  7. RUN mvn package -DskipTests
  8. FROM openjdk:11-jre-slim
  9. WORKDIR /app
  10. COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
  11. EXPOSE 8080
  12. ENTRYPOINT ["java","-jar","app.jar"]

3.1.2 推送到Harbor

  1. # 登录Harbor
  2. docker login harbor.example.com --username admin --password Harbor12345
  3. # 标记并推送镜像
  4. docker tag demo-app:latest harbor.example.com/devops/demo-app:v1
  5. docker push harbor.example.com/devops/demo-app:v1

3.2 K8s部署配置

3.2.1 创建ImagePullSecret

  1. kubectl create secret docker-registry harbor-secret \
  2. --docker-server=harbor.example.com \
  3. --docker-username=admin \
  4. --docker-password=Harbor12345 \
  5. --docker-email=admin@example.com

3.2.2 Deployment配置示例

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

3.2.3 Service与Ingress配置

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: demo-service
  5. spec:
  6. selector:
  7. app: demo-app
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 8080
  12. ---
  13. apiVersion: networking.k8s.io/v1
  14. kind: Ingress
  15. metadata:
  16. name: demo-ingress
  17. spec:
  18. rules:
  19. - host: demo.example.com
  20. http:
  21. paths:
  22. - path: /
  23. pathType: Prefix
  24. backend:
  25. service:
  26. name: demo-service
  27. port:
  28. number: 80

四、运维与监控

4.1 日志管理

配置EFK(Elasticsearch-Fluentd-Kibana)栈收集容器日志,示例Fluentd配置:

  1. <match harbor.**>
  2. @type elasticsearch
  3. host elasticsearch
  4. port 9200
  5. logstash_format true
  6. <buffer>
  7. @type file
  8. path /var/log/fluentd-buffers/harbor.buffer
  9. timekey 1d
  10. timekey_wait 10m
  11. </buffer>
  12. </match>

4.2 性能监控

使用Prometheus+Grafana监控Harbor指标:

  1. 启用Harbor的Prometheus端点
  2. 配置ServiceMonitor:
    1. apiVersion: monitoring.coreos.com/v1
    2. kind: ServiceMonitor
    3. metadata:
    4. name: harbor-monitor
    5. spec:
    6. selector:
    7. matchLabels:
    8. app: harbor
    9. endpoints:
    10. - port: http
    11. path: /metrics
    12. interval: 30s

4.3 备份策略

  1. 数据库备份:

    1. # 定期备份PostgreSQL
    2. kubectl exec -it harbor-core -- pg_dump -U postgres -F c registry > registry_backup.dump
  2. 镜像备份:

    1. # 使用skopeo同步镜像
    2. skopeo copy docker://harbor.example.com/devops/demo-app:v1 \
    3. docker://backup-registry.example.com/devops/demo-app:v1

五、常见问题处理

5.1 镜像拉取失败

  • 现象Failed to pull image "harbor.example.com/devops/demo-app:v1": rpc error: code = Unknown desc = Error response from daemon: Get https://harbor.example.com/v2/: x509: certificate signed by unknown authority
  • 解决方案
    1. 在所有节点添加CA证书到/etc/docker/certs.d/harbor.example.com
    2. 或在K8s中配置Insecure Registry(仅测试环境)

5.2 Harbor性能优化

  • 数据库调优
    1. -- 修改PostgreSQL配置
    2. ALTER SYSTEM SET max_connections = 300;
    3. ALTER SYSTEM SET shared_buffers = 256MB;
  • Registry存储优化
    • 启用存储驱动分层(overlay2)
    • 配置定期垃圾回收:
      1. # 每周日凌晨执行
      2. 0 0 * * 0 kubectl exec -it harbor-registry -- /usr/local/bin/registry garbage-collect /etc/registry/config.yml

六、最佳实践建议

  1. 镜像命名规范

    • 采用<项目>/<应用>:<版本>-<环境>格式
    • 示例:devops/demo-app:1.2.0-prod
  2. CI/CD集成

    • 在Jenkins/GitLab CI中配置Harbor凭证
    • 使用docker buildx实现多平台镜像构建
  3. 安全加固

    • 定期轮换管理员密码
    • 启用审计日志(Audit Log)
    • 限制外部网络访问
  4. 高可用方案

    • 使用Harbor集群模式(需共享存储)
    • 配置多个副本的Registry服务

通过以上完整流程,开发者可以在K8s环境中构建安全、高效的私有镜像仓库,并实现SpringBoot应用的自动化部署。实际生产环境中,建议结合具体业务需求进行定制化配置,并建立完善的运维监控体系。