k8s集群Harbor镜像仓库实战指南

k8s学习—k8s集群使用容器镜像仓库Harbor

引言:为什么需要Harbor?

在Kubernetes(k8s)生态中,容器镜像的管理是核心环节。公有云提供的镜像仓库(如Docker Hub、阿里云ACR)虽方便,但存在网络依赖、数据安全、权限控制不足等问题。Harbor作为开源的企业级私有镜像仓库,通过以下特性解决痛点:

  • 镜像安全:支持漏洞扫描、镜像签名、权限分级
  • 高可用架构:支持多节点部署、分布式存储
  • 合规性:符合GDPR、HIPAA等数据保护标准
  • 集成能力:与k8s、CI/CD工具无缝对接

本文将详细讲解如何在k8s集群中部署Harbor,并实现镜像的推送、拉取及自动化管理。

一、Harbor部署前的准备工作

1.1 硬件与网络规划

  • 节点要求:建议至少2核4G内存的虚拟机,存储空间根据镜像量预估(如100GB起)
  • 网络配置
    • 开放端口:80(HTTP)、443(HTTPS)、4443(控制台)
    • 若使用Ingress,需配置TLS证书
  • 存储选择
    • 本地存储:适用于测试环境(如/data目录)
    • 分布式存储:生产环境推荐(如Ceph、NFS)

1.2 依赖服务安装

  • Docker:Harbor基于Docker运行,需安装19.03+版本
    1. # Ubuntu示例
    2. sudo apt-get update
    3. sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  • Kubernetes客户端:确保kubectl可访问集群
  • Helm(可选):推荐使用Helm Chart部署Harbor
    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

二、Harbor部署方式对比

2.1 在线部署(推荐生产环境)

使用Helm Chart自动化部署,支持高可用和持久化存储:

  1. # 添加Bitnami仓库
  2. helm repo add bitnami https://charts.bitnami.com/bitnami
  3. helm repo update
  4. # 创建命名空间
  5. kubectl create namespace harbor
  6. # 部署Harbor(示例参数)
  7. helm install harbor bitnami/harbor \
  8. --namespace harbor \
  9. --set persistence.enabled=true \
  10. --set persistence.storageClass="nfs-client" \
  11. --set harborAdminPassword="Admin@123" \
  12. --set expose.type=ingress \
  13. --set expose.tls.enabled=true \
  14. --set expose.ingress.hosts.core="harbor.example.com"

关键参数说明

  • persistence.storageClass:指定存储类(如NFS、CephFS)
  • expose.type:选择ingressnodePort暴露服务
  • harborAdminPassword:初始管理员密码

2.2 离线部署(测试环境)

下载Harbor离线包并手动配置:

  1. # 下载Harbor离线安装包
  2. wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz
  3. tar xvf harbor-offline-installer-v2.5.0.tgz
  4. cd harbor
  5. # 修改harbor.yml配置文件
  6. vim harbor.yml
  7. # 示例配置:
  8. hostname: harbor.example.com
  9. http:
  10. port: 80
  11. https:
  12. port: 443
  13. certificate: /path/to/cert.pem
  14. private_key: /path/to/key.pem
  15. storage_driver:
  16. name: filesystem
  17. settings:
  18. rootdirectory: /data

运行安装脚本:

  1. sudo ./install.sh

三、Harbor与k8s的深度集成

3.1 配置k8s集群信任Harbor

在所有节点修改/etc/docker/daemon.json,添加Harbor为信任仓库:

  1. {
  2. "insecure-registries": [],
  3. "registry-mirrors": [],
  4. "debug": true,
  5. "exec-opts": ["native.cgroupdriver=systemd"],
  6. "registry-mirrors": ["https://<mirror-url>"],
  7. "insecure-registries": ["harbor.example.com"] # 若未使用HTTPS
  8. }

重启Docker服务:

  1. sudo systemctl restart docker

3.2 创建k8s Secret用于镜像拉取

生成Base64编码的认证信息:

  1. echo -n "admin:Admin@123" | base64
  2. # 输出示例:YWRtaW46QWRtaW5AMTIz

创建Secret YAML:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: harbor-registry-secret
  5. namespace: default
  6. type: kubernetes.io/dockerconfigjson
  7. data:
  8. .dockerconfigjson: |
  9. {
  10. "auths": {
  11. "harbor.example.com": {
  12. "auth": "YWRtaW46QWRtaW5AMTIz"
  13. }
  14. }
  15. }

应用Secret:

  1. kubectl apply -f harbor-secret.yaml

3.3 在Pod中引用Harbor镜像

修改Deployment的image字段为Harbor地址:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-demo
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: harbor.example.com/library/nginx:latest
  11. imagePullSecrets:
  12. - name: harbor-registry-secret # 引用Secret

四、Harbor高级功能实践

4.1 镜像漏洞扫描

启用Clair扫描器(需在Harbor配置中启用):

  1. # harbor.yml示例
  2. clair:
  3. enabled: true
  4. url: http://clair:6060
  5. interval: 6h

扫描结果可在Web控制台的Projects > Repository > Tags中查看,标记为Critical的镜像会被阻止运行。

4.2 自动化镜像清理

配置垃圾回收策略:

  1. # 进入Harbor容器
  2. kubectl exec -it harbor-harbor-core-xxxx --namespace harbor -- /bin/sh
  3. # 执行垃圾回收
  4. /harbor/gc.sh

或通过API触发:

  1. curl -X POST "https://harbor.example.com/api/v2.0/system/gc" \
  2. -H "accept: application/json" \
  3. -u "admin:Admin@123"

4.3 多租户管理

创建项目并分配权限:

  1. 登录Harbor控制台
  2. 新建项目(如team-a
  3. Members标签页添加用户,分配Guest/Developer/ProjectAdmin角色

五、常见问题与解决方案

5.1 镜像拉取失败

现象Failed to pull image "harbor.example.com/library/nginx:latest": rpc error: code = Unknown desc = Error response from daemon: Head "https://harbor.example.com/v2/library/nginx/manifests/latest": x509: certificate signed by unknown authority

解决方案

  • 方案1:在节点添加Harbor证书到/etc/docker/certs.d/harbor.example.com/
  • 方案2:若使用自签名证书,在daemon.json中添加"insecure-registries": ["harbor.example.com"]

5.2 Harbor服务不可用

排查步骤

  1. 检查Pod状态:
    1. kubectl get pods -n harbor
  2. 查看日志:
    1. kubectl logs harbor-harbor-core-xxxx -n harbor
  3. 常见原因:
    • 存储卷空间不足
    • 数据库连接失败
    • Ingress配置错误

六、最佳实践建议

  1. 定期备份:使用pg_dump备份Harbor数据库,存储至对象存储
  2. 监控告警:通过Prometheus监控Harbor指标(如harbor_project_count
  3. 升级策略:每季度升级Harbor至最新稳定版,测试环境先行
  4. 镜像保留策略:设置自动删除旧版本镜像(如保留最近3个版本)

结语

通过Harbor与k8s的集成,企业可构建完整的容器化交付流水线,从代码构建到镜像存储再到集群部署形成闭环。本文介绍的部署方法、安全配置及故障排查技巧,能够帮助开发者快速落地生产级镜像仓库。建议结合CI/CD工具(如Jenkins、GitLab CI)进一步自动化镜像推送流程,提升DevOps效率。