基于K8s在线部署Harbor镜像仓库:从零到一的完整指南

基于K8s在线部署Harbor镜像仓库:从零到一的完整指南

一、Harbor在K8s环境中的核心价值

Harbor作为企业级私有镜像仓库,在Kubernetes生态中承担着镜像安全存储与分发的重要角色。其核心优势体现在三方面:

  1. 安全加固:支持RBAC权限控制、镜像签名与漏洞扫描,满足金融、政务等高安全场景需求
  2. 性能优化:通过P2P镜像加速与存储分层技术,将镜像拉取效率提升3-5倍
  3. 多云兼容:原生支持K8s的CRD扩展机制,可无缝对接Prometheus、Grafana等监控组件

典型应用场景包括:

  • 混合云环境下的镜像统一管理
  • 离线环境中的镜像本地化存储
  • 开发测试环境的镜像版本控制

二、部署前环境准备

2.1 基础设施要求

组件 最低配置 推荐配置
K8s版本 1.19+ 1.24+(支持StatefulSet自动扩容)
存储类 支持ReadWriteOnce 分布式存储(如Ceph、Longhorn)
网络策略 允许节点间通信(30000-32767端口) 启用NetworkPolicy隔离
负载均衡 NodePort或Ingress 专用LB(如MetalLB)

2.2 依赖工具安装

  1. # 安装Helm 3.x(以v3.12.3为例)
  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 --version v3.12.3
  5. # 验证Helm版本
  6. helm version --client

三、Harbor部署实施步骤

3.1 添加Bitnami Helm仓库

  1. helm repo add bitnami https://charts.bitnami.com/bitnami
  2. helm repo update

3.2 创建命名空间与持久卷

  1. # harbor-namespace.yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: harbor-system
  6. labels:
  7. app.kubernetes.io/name: harbor
  1. kubectl apply -f harbor-namespace.yaml

3.3 定制化Values配置

关键参数说明:

  1. # values-custom.yaml
  2. expose:
  3. type: ingress
  4. tls:
  5. enabled: true
  6. certSource: secret
  7. secret:
  8. secretName: harbor-tls
  9. namespace: harbor-system
  10. ingress:
  11. hosts:
  12. - host: harbor.example.com
  13. paths:
  14. - path: /
  15. pathType: ImplementationSpecific
  16. annotations:
  17. nginx.ingress.kubernetes.io/proxy-body-size: "0"
  18. nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
  19. persistence:
  20. persistentVolumeClaim:
  21. registry:
  22. storageClass: "longhorn" # 根据实际存储类调整
  23. accessModes: [ "ReadWriteOnce" ]
  24. size: 100Gi
  25. chartmuseum:
  26. enabled: true
  27. storageClass: "longhorn"
  28. size: 10Gi
  29. core:
  30. replicas: 2
  31. resources:
  32. requests:
  33. cpu: "500m"
  34. memory: "1Gi"
  35. limits:
  36. cpu: "1000m"
  37. memory: "2Gi"

3.4 执行部署命令

  1. helm install harbor bitnami/harbor \
  2. --namespace harbor-system \
  3. -f values-custom.yaml \
  4. --set adminPassword=StrongPass123! \
  5. --set service.type=ClusterIP

四、部署后验证与优化

4.1 服务状态检查

  1. kubectl get pods -n harbor-system
  2. # 预期输出:
  3. # NAME READY STATUS RESTARTS AGE
  4. # harbor-core-xxxxxx-xxx 1/1 Running 0 2m
  5. # harbor-database-0 1/1 Running 0 2m
  6. # harbor-portal-xxxxxx-xxx 1/1 Running 0 2m

4.2 存储卷验证

  1. kubectl get pvc -n harbor-system
  2. # 预期输出:
  3. # NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  4. # data-harbor-database-0 Bound pvc-xxxxxx-xxx-xxx-xxxxxxxxxxxx 10Gi RWO longhorn 2m
  5. # data-harbor-registry Bound pvc-xxxxxx-xxx-xxx-xxxxxxxxxxxx 100Gi RWO longhorn 2m

4.3 性能调优建议

  1. 水平扩展配置

    1. # 在values.yaml中添加
    2. core:
    3. autoscaling:
    4. enabled: true
    5. minReplicas: 2
    6. maxReplicas: 5
    7. metrics:
    8. - type: Resource
    9. resource:
    10. name: cpu
    11. target:
    12. type: Utilization
    13. averageUtilization: 70
  2. 缓存优化

  • 在Ingress配置中添加缓存头:
    1. ingress:
    2. annotations:
    3. nginx.ingress.kubernetes.io/configuration-snippet: |
    4. proxy_cache_valid 200 302 1h;
    5. proxy_cache_valid 404 10m;

五、常见问题解决方案

5.1 证书配置错误

现象:浏览器访问显示”NET::ERR_CERT_INVALID”
解决

  1. 生成自签名证书:

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

    1. kubectl create secret tls harbor-tls \
    2. --namespace harbor-system \
    3. --key tls.key \
    4. --cert tls.crt

5.2 存储卷挂载失败

现象:Pod状态显示”ContainerCreating”且事件中有”MountVolume.SetUp failed”
解决步骤

  1. 检查存储类状态:

    1. kubectl get sc
  2. 验证PVC绑定状态:

    1. kubectl describe pvc data-harbor-registry -n harbor-system
  3. 手动创建PV(如使用hostPath):

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: pv-harbor-registry
    5. spec:
    6. capacity:
    7. storage: 100Gi
    8. accessModes:
    9. - ReadWriteOnce
    10. hostPath:
    11. path: /mnt/data/harbor-registry
    12. nodeAffinity:
    13. required:
    14. nodeSelectorTerms:
    15. - matchExpressions:
    16. - key: kubernetes.io/hostname
    17. operator: In
    18. values:
    19. - node1.example.com

六、最佳实践建议

  1. 备份策略

    • 每日自动备份配置到对象存储
    • 使用Velero进行集群级备份
      1. velero backup create harbor-backup \
      2. --include-namespaces harbor-system \
      3. --ttl 72h0m0s
  2. 升级路径

    • 先升级数据库(PostgreSQL)
    • 再升级核心组件
      1. helm upgrade harbor bitnami/harbor \
      2. --namespace harbor-system \
      3. -f values-custom.yaml
  3. 监控集成

    • 配置Prometheus抓取指标
      1. # 在values.yaml中添加
      2. metrics:
      3. enabled: true
      4. serviceMonitor:
      5. enabled: true
      6. interval: 30s
      7. labels:
      8. release: prometheus-operator

通过上述完整流程,开发者可在K8s环境中快速构建高可用的Harbor镜像仓库。实际部署时需根据具体集群环境调整存储类、网络策略等参数,建议先在测试环境验证配置后再应用于生产环境。