logo

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

作者:rousong2025.10.10 18:46浏览量:0

简介:本文详细讲解在 Kubernetes 环境下搭建 Docker 与 Harbor 私有镜像仓库的完整流程,包括 Harbor 安装配置、Docker 镜像推送及 SpringBoot 应用的 K8s 部署实践,帮助开发者实现安全的镜像管理与自动化应用发布。

一、环境准备与前置条件

1.1 Kubernetes 集群基础要求

部署 Harbor 私有仓库前需确保 Kubernetes 集群满足以下条件:

  • 节点资源:至少 3 个工作节点(推荐配置:4核CPU/8GB内存/100GB存储)
  • 存储类:已配置动态存储供应(如 NFS、Ceph 或云存储)
  • 网络插件:支持 ServiceType 为 LoadBalancer 或 NodePort
  • Ingress 控制器:推荐使用 Nginx 或 Traefik

通过 kubectl get nodes 验证节点状态,确保所有节点处于 Ready 状态。若使用云厂商托管集群,需额外检查安全组规则是否放行 80/443/6443 端口。

1.2 Docker 环境配置

在所有节点安装 Docker CE 20.10+ 版本:

  1. # 添加 Docker 官方 GPG 密钥
  2. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  3. # 添加稳定版仓库
  4. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. # 安装 Docker
  6. sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io

配置 Docker 镜像加速(以阿里云为例):

  1. {
  2. "registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]
  3. }

将配置写入 /etc/docker/daemon.json 后重启服务:

  1. sudo systemctl daemon-reload && sudo systemctl restart docker

二、Harbor 私有仓库搭建

2.1 Harbor 安装方式选择

Harbor 提供三种部署方式:
| 方式 | 适用场景 | 复杂度 |
|——————|———————————————|————|
| 在线安装 | 公网环境,依赖外部仓库 | 低 |
| 离线安装 | 内网环境,需提前下载离线包 | 中 |
| Helm Chart | 已有 Kubernetes 集群 | 高 |

推荐使用 Helm Chart 方式部署,可实现与 K8s 的深度集成。

2.2 Helm 部署 Harbor 详细步骤

  1. 添加 Bitnami 仓库

    1. helm repo add bitnami https://charts.bitnami.com/bitnami
    2. helm repo update
  2. 创建持久化存储

    1. # storage-class.yaml
    2. apiVersion: storage.k8s.io/v1
    3. kind: StorageClass
    4. metadata:
    5. name: harbor-sc
    6. provisioner: kubernetes.io/nfs
    7. parameters:
    8. archiveOnDelete: "false"

    应用配置后验证 PVC 绑定状态:

    1. kubectl get pvc -n harbor
  3. 部署 Harbor

    1. helm install harbor bitnami/harbor \
    2. --namespace harbor --create-namespace \
    3. --set persistence.storageClass=harbor-sc \
    4. --set expose.type=ingress \
    5. --set expose.ingress.hosts.core=harbor.example.com \
    6. --set expose.tls.enabled=true \
    7. --set expose.tls.secretName=harbor-tls
  4. 访问配置

  • 获取 Ingress 地址:kubectl get ingress -n harbor
  • 浏览器访问 https://harbor.example.com
  • 默认管理员账号:admin/Harbor12345

2.3 Harbor 核心功能配置

2.3.1 项目与用户管理

  • 创建项目时勾选「内容信任」可启用镜像签名
  • 用户权限分为:
    • 系统管理员:全量权限
    • 项目管理员:项目级操作权限
    • 开发者:仅可推送/拉取镜像
    • 访客:仅可拉取公开镜像

2.3.2 复制策略配置

示例:将 library 项目镜像同步至阿里云 CR:

  1. {
  2. "name": "sync-to-aliyun",
  3. "src_registry": {
  4. "url": "https://harbor.example.com",
  5. "username": "admin",
  6. "password": "encrypted-password"
  7. },
  8. "dest_registry": {
  9. "url": "https://registry.cn-hangzhou.aliyuncs.com",
  10. "username": "aliyun-user",
  11. "password": "aliyun-token"
  12. },
  13. "trigger": {
  14. "type": "manual",
  15. "schedule": null
  16. },
  17. "filters": [
  18. {
  19. "type": "name",
  20. "value": "library/*"
  21. }
  22. ]
  23. }

2.3.3 漏洞扫描配置

Harbor 集成 Clair 实现自动化漏洞扫描:

  1. values.yaml 中启用:
    1. clair:
    2. enabled: true
    3. image:
    4. repository: bitnami/clair
    5. tag: 4.3.0-debian-11-r0
  2. 部署后访问 https://harbor.example.com/clair 查看扫描报告

三、SpringBoot 应用 Docker 化

3.1 优化 Dockerfile 编写

示例多阶段构建的 SpringBoot Dockerfile:

  1. # 构建阶段
  2. FROM maven:3.8.6-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. # 运行阶段
  9. FROM openjdk:11-jre-slim
  10. WORKDIR /app
  11. COPY --from=build /app/target/*.jar app.jar
  12. EXPOSE 8080
  13. ENTRYPOINT ["java","-jar","app.jar"]

关键优化点:

  • 使用多阶段构建减少镜像体积(从 1.2GB 降至 300MB)
  • 添加 .dockerignore 文件排除无关文件
  • 指定非 root 用户运行(安全加固

3.2 镜像构建与推送

  1. 构建镜像

    1. docker build -t harbor.example.com/library/springboot-demo:v1 .
  2. 登录 Harbor

    1. docker login harbor.example.com -u admin -p Harbor12345
  3. 推送镜像

    1. docker push harbor.example.com/library/springboot-demo:v1
  4. 验证镜像

    1. curl -X GET "https://harbor.example.com/api/v2.0/projects/library/repositories/springboot-demo/artifacts" \
    2. -H "accept: application/json" \
    3. -u admin:Harbor12345

四、K8s 部署 SpringBoot 应用

4.1 部署文件编写

示例 deployment.yaml

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

4.2 配置 Service 与 Ingress

  1. # service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: springboot-demo
  6. spec:
  7. selector:
  8. app: springboot-demo
  9. ports:
  10. - protocol: TCP
  11. port: 80
  12. targetPort: 8080
  13. type: ClusterIP
  14. # ingress.yaml
  15. apiVersion: networking.k8s.io/v1
  16. kind: Ingress
  17. metadata:
  18. name: springboot-demo
  19. annotations:
  20. nginx.ingress.kubernetes.io/rewrite-target: /
  21. spec:
  22. rules:
  23. - host: demo.example.com
  24. http:
  25. paths:
  26. - path: /
  27. pathType: Prefix
  28. backend:
  29. service:
  30. name: springboot-demo
  31. port:
  32. number: 80
  33. tls:
  34. - hosts:
  35. - demo.example.com
  36. secretName: demo-tls

4.3 部署与验证

  1. 应用配置

    1. kubectl apply -f deployment.yaml
    2. kubectl apply -f service.yaml
    3. kubectl apply -f ingress.yaml
  2. 验证部署
    ```bash

    查看 Pod 状态

    kubectl get pods -l app=springboot-demo

测试服务可用性

curl -H “Host: demo.example.com” http://

查看日志

kubectl logs -f

  1. # 五、高级配置与最佳实践
  2. ## 5.1 镜像拉取策略优化
  3. Deployment 中配置镜像拉取策略:
  4. ```yaml
  5. spec:
  6. template:
  7. spec:
  8. imagePullSecrets:
  9. - name: harbor-secret
  10. containers:
  11. - name: springboot
  12. image: harbor.example.com/library/springboot-demo:v1
  13. imagePullPolicy: IfNotPresent # 或 Always

创建 Secret:

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

5.2 自动更新策略

结合 ArgoCD 实现 GitOps 持续部署:

  1. 安装 ArgoCD:

    1. kubectl create namespace argocd
    2. kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  2. 创建 Application 资源:

    1. apiVersion: argoproj.io/v1alpha1
    2. kind: Application
    3. metadata:
    4. name: springboot-demo
    5. namespace: argocd
    6. spec:
    7. project: default
    8. source:
    9. repoURL: https://github.com/your-repo/springboot-demo.git
    10. targetRevision: HEAD
    11. path: k8s
    12. destination:
    13. server: https://kubernetes.default.svc
    14. namespace: default
    15. syncPolicy:
    16. automated:
    17. selfHeal: true
    18. prune: true
    19. syncOptions:
    20. - CreateNamespace=true

5.3 监控与日志方案

5.3.1 Prometheus 监控配置

values.yaml 中启用 SpringBoot Actuator 指标:

  1. management:
  2. endpoints:
  3. web:
  4. exposure:
  5. include: health,info,metrics,prometheus
  6. endpoint:
  7. prometheus:
  8. enabled: true

配置 ServiceMonitor:

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

5.3.2 日志收集方案

使用 FluentBit 收集日志:

  1. # fluentbit-config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: fluentbit-config
  6. data:
  7. fluent-bit.conf: |
  8. [SERVICE]
  9. Flush 1
  10. Log_Level info
  11. Parsers_File parsers.conf
  12. [INPUT]
  13. Name tail
  14. Path /var/log/containers/*.log
  15. Parser docker
  16. Tag kube.*
  17. Mem_Buf_Limit 5MB
  18. Skip_Long_Lines On
  19. [OUTPUT]
  20. Name es
  21. Match *
  22. Host elasticsearch.logging.svc
  23. Port 9200
  24. Logstash_Format On
  25. Replace_Dots On
  26. Retry_Limit False

六、常见问题解决方案

6.1 镜像推送失败处理

现象Error response from daemon: Get https://harbor.example.com/v2/: x509: certificate signed by unknown authority

解决方案

  1. 将自签名证书添加到 Docker 信任链:

    1. sudo mkdir -p /etc/docker/certs.d/harbor.example.com
    2. sudo cp harbor.crt /etc/docker/certs.d/harbor.example.com/ca.crt
    3. sudo systemctl restart docker
  2. 或在 ~/.docker/config.json 中配置:

    1. {
    2. "auths": {
    3. "harbor.example.com": {
    4. "auth": "base64-encoded-credentials",
    5. "insecure-registries": ["harbor.example.com"]
    6. }
    7. }
    8. }

6.2 Harbor 性能优化

6.2.1 数据库调优

修改 PostgreSQL 配置(postgresql.conf):

  1. max_connections = 200
  2. shared_buffers = 256MB
  3. work_mem = 4MB
  4. maintenance_work_mem = 512MB

6.2.2 缓存配置

values.yaml 中启用 Redis 缓存:

  1. redis:
  2. enabled: true
  3. usePassword: false
  4. master:
  5. persistence:
  6. enabled: true
  7. storageClass: "harbor-sc"

6.3 K8s 节点镜像拉取失败

现象Failed to pull image "harbor.example.com/library/springboot-demo:v1": rpc error: code = Unknown desc = Error response from daemon: Head "https://harbor.example.com/v2/library/springboot-demo/manifests/v1": unauthorized: authentication required

解决方案

  1. 检查节点时间同步:

    1. timedatectl status
  2. 验证 imagePullSecrets 是否正确应用:

    1. kubectl get pod <pod-name> -o yaml | grep imagePullSecrets
  3. 手动测试镜像拉取:

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

七、总结与展望

本文系统阐述了在 Kubernetes 环境下搭建 Harbor 私有镜像仓库并部署 SpringBoot 应用的完整流程,涵盖从环境准备、Harbor 部署、镜像管理到 K8s 部署的全生命周期管理。通过实施本方案,企业可实现:

  • 镜像安全管控:通过私有仓库实现镜像集中管理
  • 部署效率提升:结合 CI/CD 实现自动化发布
  • 资源利用率优化:通过容器化实现弹性伸缩

未来可进一步探索:

  • Harbor 与 Vault 集成实现镜像加密
  • 基于 Service Mesh 的应用流量管理
  • AI 驱动的自动化运维方案

建议开发者定期进行以下维护工作:

  1. 每月执行 Harbor 数据库备份
  2. 每季度更新基础镜像版本
  3. 每年进行安全审计与合规检查

相关文章推荐

发表评论

活动