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

一、环境准备与架构设计

在K8s集群中部署Docker与Harbor私有仓库需完成三项基础准备:

  1. K8s集群搭建:建议采用3节点高可用架构(1主2从),通过kubeadmRancher等工具快速部署。验证集群状态需执行kubectl get nodes,确保所有节点处于Ready状态。
  2. 存储卷配置:Harbor需持久化存储镜像数据,推荐使用NFS或云存储(如AWS EBS)。以NFS为例,需在所有节点安装NFS客户端并挂载共享目录:
    1. # 节点端安装NFS客户端
    2. sudo apt install nfs-common
    3. # 创建本地挂载点
    4. sudo mkdir /mnt/harbor-storage
    5. # 挂载NFS共享目录
    6. sudo mount -t nfs 192.168.1.100:/nfs/harbor /mnt/harbor-storage
  3. 网络策略规划:需开放443(HTTPS)、80(HTTP重定向)、22(SSH管理)端口,并通过Ingress或NodePort暴露服务。建议使用MetalLB实现裸金属环境的负载均衡。

二、Harbor私有仓库安装与配置

Harbor作为企业级镜像仓库,提供RBAC权限控制、镜像扫描等高级功能,安装步骤如下:

1. 依赖环境安装

  1. # 安装Docker与Docker Compose
  2. curl -fsSL https://get.docker.com | sh
  3. sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  4. sudo chmod +x /usr/local/bin/docker-compose
  5. # 验证安装
  6. docker --version
  7. docker-compose --version

2. Harbor部署

从GitHub获取最新版本(以v2.6.2为例):

  1. wget https://github.com/goharbor/harbor/releases/download/v2.6.2/harbor-online-installer-v2.6.2.tgz
  2. tar xvf harbor-online-installer-v2.6.2.tgz
  3. cd harbor

修改harbor.yml配置文件关键参数:

  1. hostname: harbor.example.com # 需配置DNS解析
  2. http:
  3. port: 80
  4. https:
  5. port: 443
  6. certificate: /data/cert/server.crt
  7. private_key: /data/cert/server.key
  8. storage_driver:
  9. name: filesystem
  10. fs_driver:
  11. rootdirectory: /mnt/harbor-storage
  12. harbor_admin_password: Harbor12345 # 默认管理员密码

执行安装脚本:

  1. sudo ./install.sh

安装完成后,通过docker-compose ps验证服务状态,确保coredatabaseportal等容器均处于Up状态。

3. 客户端配置

在开发环境配置Docker信任Harbor证书:

  1. # 将证书复制至Docker证书目录
  2. sudo mkdir -p /etc/docker/certs.d/harbor.example.com
  3. sudo cp server.crt /etc/docker/certs.d/harbor.example.com/
  4. # 重启Docker服务
  5. sudo systemctl restart docker

登录Harbor仓库:

  1. docker login harbor.example.com

三、SpringBoot应用容器化与部署

以典型SpringBoot应用为例,演示从代码到K8s部署的全流程:

1. 应用Docker化

创建Dockerfile

  1. FROM openjdk:17-jdk-slim
  2. WORKDIR /app
  3. COPY target/demo-app-0.0.1-SNAPSHOT.jar app.jar
  4. EXPOSE 8080
  5. ENTRYPOINT ["java", "-jar", "app.jar"]

构建镜像并推送至Harbor:

  1. # 构建镜像(标签需包含Harbor地址)
  2. docker build -t harbor.example.com/library/demo-app:v1 .
  3. # 推送镜像
  4. docker push harbor.example.com/library/demo-app:v1

2. K8s部署配置

创建Deployment与Service的YAML文件:

  1. # deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: demo-app
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: demo-app
  11. template:
  12. metadata:
  13. labels:
  14. app: demo-app
  15. spec:
  16. containers:
  17. - name: demo-app
  18. image: harbor.example.com/library/demo-app:v1
  19. ports:
  20. - containerPort: 8080
  21. resources:
  22. requests:
  23. cpu: "100m"
  24. memory: "256Mi"
  25. limits:
  26. cpu: "500m"
  27. memory: "512Mi"
  28. # service.yaml
  29. apiVersion: v1
  30. kind: Service
  31. metadata:
  32. name: demo-app-service
  33. spec:
  34. selector:
  35. app: demo-app
  36. ports:
  37. - protocol: TCP
  38. port: 80
  39. targetPort: 8080
  40. type: NodePort

应用配置并验证:

  1. kubectl apply -f deployment.yaml
  2. kubectl apply -f service.yaml
  3. # 验证部署状态
  4. kubectl get pods
  5. kubectl get svc

四、高级配置与运维建议

  1. 镜像安全策略

    • 启用Harbor的镜像扫描功能(集成Clair或Trivy)
    • 在K8s中配置ImagePullSecrets
      1. kubectl create secret docker-registry regcred \
      2. --docker-server=harbor.example.com \
      3. --docker-username=admin \
      4. --docker-password=Harbor12345 \
      5. --docker-email=admin@example.com

      在Deployment中引用:
      ```yaml
      spec:
      containers:

    • name: demo-app
      image: harbor.example.com/library/demo-app:v1
      imagePullSecrets:
    • name: regcred
      ```
  2. 自动部署流水线
    结合Jenkins或GitLab CI实现自动化构建-推送-部署流程:

    1. // Jenkinsfile示例
    2. pipeline {
    3. agent any
    4. stages {
    5. stage('Build') {
    6. steps {
    7. sh 'mvn clean package'
    8. }
    9. }
    10. stage('Docker Build & Push') {
    11. steps {
    12. script {
    13. docker.withRegistry('https://harbor.example.com', 'harbor-credentials') {
    14. def image = docker.build("harbor.example.com/library/demo-app:${env.BUILD_ID}")
    15. image.push()
    16. }
    17. }
    18. }
    19. }
    20. stage('Deploy to K8s') {
    21. steps {
    22. sh 'kubectl set image deployment/demo-app demo-app=harbor.example.com/library/demo-app:${BUILD_ID}'
    23. }
    24. }
    25. }
    26. }
  3. 监控与日志

    • 集成Prometheus监控Harbor仓库指标
    • 通过EFK(Elasticsearch-Fluentd-Kibana)栈收集应用日志

五、常见问题解决方案

  1. 镜像推送失败

    • 检查证书配置:curl -v https://harbor.example.com
    • 验证存储空间:df -h /mnt/harbor-storage
  2. K8s Pod启动失败

    • 查看事件日志:kubectl describe pod <pod-name>
    • 检查镜像拉取权限:kubectl logs <pod-name>
  3. Harbor性能优化

    • 数据库调优:修改harbor.yml中的database配置
    • 启用Redis缓存:部署独立Redis服务并修改配置

六、总结与最佳实践

  1. 安全加固

    • 定期轮换Harbor管理员密码
    • 启用项目级RBAC权限控制
    • 配置镜像签名验证(Notary)
  2. 高可用设计

    • Harbor集群部署(需共享存储)
    • K8s多区域部署应对节点故障
  3. 成本优化

    • 镜像分层存储优化
    • 合理设置Pod资源请求/限制

通过本文的完整流程,开发者可在K8s环境中快速构建企业级Docker+Harbor私有仓库体系,实现SpringBoot应用的自动化部署与高效运维。实际生产环境中,建议结合具体业务需求调整存储、网络和安全配置,并建立完善的CI/CD流程以提升交付效率。