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

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

一、Harbor与K8s的协同价值

Harbor作为CNCF毕业项目,提供企业级镜像仓库功能,包括镜像复制、RBAC权限控制、漏洞扫描等特性。在K8s环境中部署Harbor具有显著优势:

  1. 镜像分发加速:通过本地镜像仓库减少拉取时间,提升CI/CD流水线效率
  2. 安全管控:内置漏洞扫描与镜像签名验证,保障容器镜像安全
  3. 资源隔离:利用K8s Namespace实现多租户镜像管理
  4. 高可用架构:通过StatefulSet实现有状态服务管理,结合StorageClass提供持久化存储

典型应用场景包括:私有云环境镜像管理、跨集群镜像同步、DevOps流水线集成等。

二、环境准备与前提条件

2.1 基础设施要求

  • Kubernetes集群版本≥1.19
  • 可用存储类(如NFS/Ceph/AWS EBS)
  • 节点资源要求:
    • CPU:≥2核
    • 内存:≥4GB
    • 磁盘:≥20GB(用于镜像存储)

2.2 依赖组件安装

  1. Helm安装(v3.0+):

    1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    2. chmod 700 get_helm.sh
    3. ./get_helm.sh
  2. Ingress Controller配置(以Nginx为例):

    1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    2. helm install ingress-nginx ingress-nginx/ingress-nginx \
    3. --namespace ingress-nginx --create-namespace
  3. 存储类配置示例(NFS)

    1. # nfs-storageclass.yaml
    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"

三、Harbor安装实施步骤

3.1 Helm Chart配置

  1. 添加Bitnami Helm仓库:

    1. helm repo add bitnami https://charts.bitnami.com/bitnami
    2. helm repo update
  2. 创建自定义values文件(harbor-values.yaml):
    ```yaml
    expose:
    type: ingress
    tls:
    enabled: true
    certSource: secret
    secret:
    secretName: “harbor-tls”
    ingress:
    hosts:
    core: harbor.example.com
    annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-body-size: “0”

persistence:
enabled: true
persistentVolumeClaim:
registry:
storageClass: “nfs-storage”
accessModes: [ “ReadWriteOnce” ]
size: 10Gi
chartmuseum:
storageClass: “nfs-storage”
size: 5Gi
database:
storageClass: “nfs-storage”
size: 1Gi
redis:
storageClass: “nfs-storage”
size: 1Gi

database:
type: internal
internal:
password: “Harbor12345”

harborAdminPassword: “AdminPass123”

  1. ### 3.2 证书配置(生产环境必需)
  2. 1. 生成自签名证书(测试环境):
  3. ```bash
  4. openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  5. -keyout tls.key -out tls.crt \
  6. -subj "/CN=harbor.example.com/O=harbor"
  1. 创建K8s Secret:
    1. kubectl create secret tls harbor-tls \
    2. --cert=tls.crt --key=tls.key \
    3. -n harbor-namespace

3.3 安装执行

  1. kubectl create namespace harbor-namespace
  2. helm install harbor bitnami/harbor \
  3. --namespace harbor-namespace \
  4. -f harbor-values.yaml

四、安装后验证与配置

4.1 服务状态检查

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

4.2 访问验证

  1. 添加DNS解析(测试环境可修改/etc/hosts):

    1. <K8S_NODE_IP> harbor.example.com
  2. 浏览器访问https://harbor.example.com,使用默认账号admin/AdminPass123登录

4.3 客户端配置

  1. 配置Docker信任证书:

    1. mkdir -p /etc/docker/certs.d/harbor.example.com
    2. cp tls.crt /etc/docker/certs.d/harbor.example.com/ca.crt
    3. systemctl restart docker
  2. 登录Harbor:

    1. docker login harbor.example.com

五、高级配置与运维

5.1 镜像复制配置

  1. 创建目标仓库规则:

    1. # replication-rule.yaml
    2. apiVersion: goharbor.io/v1alpha1
    3. kind: ReplicationRule
    4. metadata:
    5. name: my-replication
    6. spec:
    7. name: my-rule
    8. project: library
    9. targetFilter:
    10. name: my-target
    11. trigger:
    12. type: manual
    13. filters:
    14. tagFilter:
    15. mode: "regexp"
    16. value: ".*"
  2. 通过Harbor Web界面或API创建复制端点

5.2 备份恢复策略

  1. 数据库备份:

    1. kubectl exec -n harbor-namespace \
    2. $(kubectl get pods -n harbor-namespace -l app.kubernetes.io/component=database -o jsonpath='{.items[0].metadata.name}') \
    3. -- pg_dump -U postgres harbor > backup.sql
  2. 持久化卷快照:

    1. # 根据存储类型选择相应工具(如velero)

六、常见问题解决方案

6.1 Ingress 502错误排查

  1. 检查后端服务状态:

    1. kubectl get endpoints -n harbor-namespace harbor-core
  2. 查看Nginx日志:

    1. kubectl logs -n ingress-nginx \
    2. $(kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}')

6.2 存储空间不足处理

  1. 扩展PVC容量:

    1. kubectl patch pvc registry-pvc -n harbor-namespace \
    2. --type='json' \
    3. -p='[{"op": "replace", "path": "/spec/resources/requests/storage", "value":"20Gi"}]'
  2. 配置垃圾回收策略:

    1. # 在values.yaml中添加
    2. garbageCollection:
    3. enabled: true
    4. threshold: 50
    5. timeWindow: 24h

七、最佳实践建议

  1. 安全加固

    • 启用自动TLS证书轮换
    • 配置RBAC权限最小化原则
    • 定期更新Harbor版本
  2. 性能优化

    • 为Registry服务配置HPA(水平自动扩缩)
    • 使用缓存代理加速镜像拉取
    • 分离数据库到独立节点
  3. 监控集成

    • 配置Prometheus监控指标
    • 设置镜像推送/拉取告警规则
    • 集成日志收集系统(如ELK)

通过上述完整流程,开发者可在K8s环境中快速部署生产级Harbor镜像仓库。实际部署时应根据具体业务需求调整存储配置、安全策略和复制规则等参数,建议先在测试环境验证配置后再应用于生产环境。