基于K8s的Harbor镜像仓库在线部署指南

基于K8s的Harbor镜像仓库在线部署指南

一、环境准备与前置条件

在Kubernetes集群中部署Harbor镜像仓库前,需完成以下环境配置:

  1. K8s集群要求:建议使用K8s 1.19+版本,确保集群具备3个以上工作节点,每个节点配置不低于4核CPU、8GB内存及100GB存储空间。通过kubectl get nodes验证集群状态,确保所有节点处于Ready状态。
  2. 存储类配置:Harbor需要持久化存储支持,推荐使用云厂商提供的块存储(如AWS EBS、阿里云云盘)或分布式存储(如Rook-Ceph)。通过kubectl get storageclass确认可用存储类,例如:
    1. # 示例:创建NFS存储类(需提前部署NFS服务端)
    2. apiVersion: storage.k8s.io/v1
    3. kind: StorageClass
    4. metadata:
    5. name: nfs-storage
    6. provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
    7. parameters:
    8. archiveOnDelete: "false"
  3. Ingress控制器部署:Harbor默认通过Ingress暴露服务,需提前部署Nginx Ingress或Traefik。以Nginx为例:
    1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    2. helm install ingress-nginx ingress-nginx/ingress-nginx
  4. 证书管理:若使用HTTPS,需准备TLS证书。可通过Let’s Encrypt自动签发:
    1. helm repo add jetstack https://charts.jetstack.io
    2. helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace

二、Helm部署Harbor核心流程

1. 添加Harbor Helm仓库

  1. helm repo add harbor https://helm.goharbor.io
  2. helm repo update

2. 创建命名空间

  1. kubectl create namespace harbor

3. 自定义Values配置

创建harbor-values.yaml文件,关键配置项如下:

  1. expose:
  2. type: ingress
  3. tls:
  4. enabled: true
  5. certSource: secret
  6. secret:
  7. secretName: harbor-tls
  8. namespace: harbor
  9. ingress:
  10. hosts:
  11. - core: harbor.example.com
  12. - notary: notary.example.com
  13. annotations:
  14. nginx.ingress.kubernetes.io/proxy-body-size: "0"
  15. persistence:
  16. persistentVolumeClaim:
  17. registry:
  18. storageClass: "nfs-storage"
  19. accessMode: ReadWriteOnce
  20. size: 100Gi
  21. chartmuseum:
  22. storageClass: "nfs-storage"
  23. size: 10Gi
  24. jobservice:
  25. storageClass: "nfs-storage"
  26. size: 1Gi
  27. database:
  28. storageClass: "nfs-storage"
  29. size: 1Gi
  30. redis:
  31. storageClass: "nfs-storage"
  32. size: 1Gi

4. 执行部署命令

  1. helm install harbor harbor/harbor -f harbor-values.yaml -n harbor

5. 验证部署状态

  1. kubectl get pods -n harbor
  2. # 预期输出:所有Pod处于Running状态
  3. NAME READY STATUS RESTARTS AGE
  4. harbor-core-xxxxxxxxx-xxxxx 1/1 Running 0 2m
  5. harbor-database-0 1/1 Running 0 2m
  6. harbor-jobservice-xxxxxxxxx-xx 1/1 Running 0 2m
  7. harbor-notary-server-xxxxxxxxx 1/1 Running 0 2m
  8. harbor-portal-xxxxxxxxx-xxxxx 1/1 Running 0 2m
  9. harbor-redis-0 1/1 Running 0 2m
  10. harbor-registry-xxxxxxxxx-xx 1/1 Running 0 2m
  11. harbor-trivy-xxxxxxxxx-xxxxx 1/1 Running 0 2m

三、关键配置优化

1. 高可用架构设计

  • 数据库高可用:修改Values文件启用外部数据库:
    1. database:
    2. type: external
    3. external:
    4. host: "mysql-master.example.com"
    5. port: "3306"
    6. username: "harbor"
    7. password: "Harbor12345"
    8. coreDatabase: "registry"
    9. notaryDatabase: "notaryserver"
    10. notarySignerDatabase: "notarysigner"
  • Redis集群配置
    1. redis:
    2. type: external
    3. external:
    4. addr: "redis-cluster.example.com:6379"
    5. password: ""

2. 性能调优参数

  • JVM内存设置:修改Jobservice资源限制:
    1. jobservice:
    2. resources:
    3. requests:
    4. cpu: 500m
    5. memory: 1Gi
    6. limits:
    7. cpu: 1000m
    8. memory: 2Gi
  • 并发工作线程
    1. jobservice:
    2. workerPool:
    3. workerCount: 10
    4. backlogQueueDepth: 1000

3. 安全加固方案

  • 网络策略:限制Pod间通信:
    1. networkPolicy:
    2. enabled: true
    3. egress:
    4. - to:
    5. - podSelector:
    6. matchLabels:
    7. app: redis
    8. ports:
    9. - protocol: TCP
    10. port: 6379
  • 审计日志
    1. core:
    2. auditLog:
    3. enabled: true
    4. path: /var/log/harbor/audit.log
    5. maxSize: 1024
    6. maxBackups: 30
    7. maxAge: 30

四、运维管理实践

1. 备份恢复策略

  • 定期备份:使用Velero进行集群级备份:
    1. velero backup create harbor-backup --include-namespaces harbor
  • 数据库备份
    1. kubectl exec -n harbor harbor-database-0 -- mysqldump -uharbor -pHarbor12345 registry > registry_backup.sql

2. 监控告警配置

  • Prometheus监控
    1. metrics:
    2. enabled: true
    3. serviceMonitor:
    4. enabled: true
    5. interval: 30s
  • 告警规则示例
    ```yaml
    groups:
  • name: harbor.rules
    rules:
    • alert: HarborRegistryHighLatency
      expr: histogram_quantile(0.99, sum(rate(harbor_registry_request_duration_seconds_bucket[5m])) by (le)) > 1
      for: 10m
      labels:
      severity: warning
      annotations:
      summary: “Harbor registry experiencing high latency”
      ```

3. 升级维护流程

  • Helm升级命令
    1. helm upgrade harbor harbor/harbor -f harbor-values.yaml -n harbor
  • 回滚策略
    1. helm history harbor -n harbor
    2. helm rollback harbor --revision 2 -n harbor

五、常见问题解决方案

  1. Ingress 502错误:检查后端服务是否就绪,验证Pod日志:
    1. kubectl logs -n harbor harbor-core-xxxxxxxxx-xxxxx
  2. 存储卷挂载失败:确认PVC状态,检查StorageClass配置:
    1. kubectl get pvc -n harbor
    2. kubectl describe sc nfs-storage
  3. 数据库连接超时:验证网络策略,测试数据库连通性:
    1. kubectl exec -n harbor harbor-core-xxxxxxxxx-xxxxx -- nc -zv mysql-master.example.com 3306

通过以上完整部署方案,开发者可在Kubernetes环境中快速构建企业级Harbor镜像仓库,实现镜像管理、安全扫描、签名验证等核心功能。建议定期进行性能测试(如使用Locust进行压力测试),持续优化资源配置参数。