基于K8s的Harbor镜像仓库在线部署全攻略

基于K8s的Harbor镜像仓库在线部署全攻略

一、技术选型背景与核心价值

在容器化技术普及的今天,Harbor作为CNCF毕业项目,已成为企业级镜像管理的首选方案。相较于传统Docker Registry,Harbor提供RBAC权限控制、镜像扫描、P2P分发加速等核心功能,特别适合多团队协同开发的场景。通过Kubernetes部署Harbor,可实现资源弹性伸缩、高可用架构及自动化运维,显著提升DevOps效率。

二、环境准备与前置条件

1. 集群基础要求

  • Kubernetes版本建议≥1.22(支持IngressClass等新特性)
  • 节点资源需求:3节点集群(建议配置4核8G+)
  • 存储类型选择:推荐使用CSI驱动的持久化存储(如NFS、Ceph或云存储)
  • 网络要求:确保NodePort/LoadBalancer正常工作,建议配置MetalLB

2. 依赖组件安装

  1. # 安装Helm3(推荐方式)
  2. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
  3. chmod 700 get_helm.sh
  4. ./get_helm.sh
  5. # 验证安装
  6. helm version

3. 存储类配置示例

  1. # nfs-storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: nfs-client
  6. provisioner: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner
  7. parameters:
  8. archiveOnDelete: "false"

三、Harbor核心组件部署

1. Helm Chart定制化配置

通过values.yaml文件进行精细控制:

  1. expose:
  2. type: ingress
  3. tls:
  4. enabled: true
  5. certSource: secret
  6. secret:
  7. secretName: "harbor-tls"
  8. names: ["harbor.example.com"]
  9. ingress:
  10. hosts:
  11. - host: harbor.example.com
  12. paths:
  13. - path: /
  14. pathType: ImplementationSpecific
  15. annotations:
  16. kubernetes.io/ingress.class: nginx
  17. nginx.ingress.kubernetes.io/proxy-body-size: "0"
  18. persistence:
  19. persistentVolumeClaim:
  20. registry:
  21. storageClass: "nfs-client"
  22. accessMode: ReadWriteOnce
  23. size: 50Gi
  24. chartmuseum:
  25. storageClass: "nfs-client"
  26. size: 5Gi

2. 部署命令与验证流程

  1. # 添加Bitnami仓库
  2. helm repo add bitnami https://charts.bitnami.com/bitnami
  3. helm repo update
  4. # 安装Harbor(指定命名空间)
  5. kubectl create ns harbor
  6. helm install harbor bitnami/harbor -n harbor -f values.yaml
  7. # 验证部署状态
  8. kubectl get pods -n harbor
  9. kubectl get ingress -n harbor

3. 关键端口说明

组件 协议 端口范围 用途
Core HTTP 80/443 Web控制台与API接口
Registry HTTP 5000 兼容Docker Registry协议
Notary HTTPS 4443 签名验证服务
Database TCP 5432 PostgreSQL数据库连接

四、高可用架构设计

1. 多节点部署方案

采用StatefulSet管理核心组件,确保数据持久性:

  1. # registry-statefulset.yaml示例
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5. name: harbor-registry
  6. spec:
  7. serviceName: harbor-registry
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: harbor-registry
  12. template:
  13. spec:
  14. containers:
  15. - name: registry
  16. image: registry.containers.cn/library/registry:2.8.1
  17. volumeMounts:
  18. - name: registry-data
  19. mountPath: /storage
  20. volumeClaimTemplates:
  21. - metadata:
  22. name: registry-data
  23. spec:
  24. accessModes: [ "ReadWriteOnce" ]
  25. storageClassName: "nfs-client"
  26. resources:
  27. requests:
  28. storage: 20Gi

2. 数据库高可用配置

推荐使用外部数据库(如RDS):

  1. # values.yaml数据库配置段
  2. database:
  3. type: external
  4. external:
  5. host: "rds.example.com"
  6. port: "5432"
  7. username: "harbor"
  8. password: "securepassword"
  9. coreDatabase: "registry"
  10. notaryServerDatabase: "notaryserver"
  11. notarySignerDatabase: "notarysigner"

五、运维管理最佳实践

1. 日常监控方案

  1. # prometheus-serviceMonitor.yaml
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: ServiceMonitor
  4. metadata:
  5. name: harbor-monitor
  6. spec:
  7. selector:
  8. matchLabels:
  9. app.kubernetes.io/name: harbor
  10. endpoints:
  11. - port: http
  12. interval: 30s
  13. path: /metrics

2. 备份恢复策略

  1. # 数据库备份示例
  2. pg_dump -h rds.example.com -U harbor -d registry > registry_backup.sql
  3. # 存储卷快照(需云厂商支持)
  4. kubectl create snapshot registry-pv-snapshot --namespace=harbor \
  5. --source=PersistentVolumeClaim/registry-data

3. 性能优化建议

  • 启用Redis缓存:在values.yaml中配置cache.enabled=true
  • 调整JVM参数:修改core.javaOpts增加堆内存
  • 开启P2P加速:配置trivy.ignoreUnfixed=true减少扫描时间

六、常见问题解决方案

1. Ingress证书配置失败

检查步骤:

  1. 确认Secret已创建:kubectl get secret harbor-tls -n harbor
  2. 验证证书内容:kubectl get secret harbor-tls -n harbor -o yaml
  3. 检查Ingress注解是否包含正确的class

2. 存储卷挂载异常

诊断流程:

  1. # 查看PVC状态
  2. kubectl describe pvc registry-data -n harbor
  3. # 检查PV绑定情况
  4. kubectl get pv
  5. # 查看节点存储插件日志
  6. kubectl logs -n kube-system <csi-driver-pod-name>

3. 镜像推送权限错误

解决方案:

  1. 确认已创建项目并设置公开/私有属性
  2. 检查Robot Account权限配置
  3. 验证config.json中的auth字段是否正确

七、升级与扩展指南

1. 版本升级流程

  1. # 获取当前版本
  2. helm list -n harbor
  3. # 备份配置
  4. helm get values harbor -n harbor > backup-values.yaml
  5. # 执行升级(示例从2.3.3升到2.4.1)
  6. helm upgrade harbor bitnami/harbor -n harbor -f backup-values.yaml \
  7. --set image.tag=2.4.1-debian-10-r0

2. 水平扩展操作

  1. # 修改values.yaml中的replicaCount
  2. replicaCount:
  3. core: 3
  4. registry: 3
  5. jobservice: 3
  6. # 应用变更
  7. helm upgrade harbor bitnami/harbor -n harbor -f values.yaml

八、安全合规建议

  1. 定期轮换管理员密码:kubectl exec -n harbor <core-pod> -- htpasswd -bB /etc/core/passwd admin newpassword
  2. 启用自动签名:配置notary.enabled=true并设置notary.server.secretName
  3. 实施网络策略:使用Calico限制Pod间通信
  4. 定期扫描漏洞:配置trivy.enabled=true并设置扫描计划

通过上述方案,开发者可在Kubernetes环境中快速构建企业级镜像仓库,实现从开发到生产的全流程容器镜像管理。实际部署时,建议先在测试环境验证配置,再逐步推广到生产环境。