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+版本
# Ubuntu示例sudo apt-get updatesudo apt-get install -y docker-ce docker-ce-cli containerd.io
- Kubernetes客户端:确保
kubectl可访问集群 - Helm(可选):推荐使用Helm Chart部署Harbor
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3chmod 700 get_helm.sh./get_helm.sh
二、Harbor部署方式对比
2.1 在线部署(推荐生产环境)
使用Helm Chart自动化部署,支持高可用和持久化存储:
# 添加Bitnami仓库helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update# 创建命名空间kubectl create namespace harbor# 部署Harbor(示例参数)helm install harbor bitnami/harbor \--namespace harbor \--set persistence.enabled=true \--set persistence.storageClass="nfs-client" \--set harborAdminPassword="Admin@123" \--set expose.type=ingress \--set expose.tls.enabled=true \--set expose.ingress.hosts.core="harbor.example.com"
关键参数说明:
persistence.storageClass:指定存储类(如NFS、CephFS)expose.type:选择ingress或nodePort暴露服务harborAdminPassword:初始管理员密码
2.2 离线部署(测试环境)
下载Harbor离线包并手动配置:
# 下载Harbor离线安装包wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgztar xvf harbor-offline-installer-v2.5.0.tgzcd harbor# 修改harbor.yml配置文件vim harbor.yml# 示例配置:hostname: harbor.example.comhttp:port: 80https:port: 443certificate: /path/to/cert.pemprivate_key: /path/to/key.pemstorage_driver:name: filesystemsettings:rootdirectory: /data
运行安装脚本:
sudo ./install.sh
三、Harbor与k8s的深度集成
3.1 配置k8s集群信任Harbor
在所有节点修改/etc/docker/daemon.json,添加Harbor为信任仓库:
{"insecure-registries": [],"registry-mirrors": [],"debug": true,"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://<mirror-url>"],"insecure-registries": ["harbor.example.com"] # 若未使用HTTPS}
重启Docker服务:
sudo systemctl restart docker
3.2 创建k8s Secret用于镜像拉取
生成Base64编码的认证信息:
echo -n "admin:Admin@123" | base64# 输出示例:YWRtaW46QWRtaW5AMTIz
创建Secret YAML:
apiVersion: v1kind: Secretmetadata:name: harbor-registry-secretnamespace: defaulttype: kubernetes.io/dockerconfigjsondata:.dockerconfigjson: |{"auths": {"harbor.example.com": {"auth": "YWRtaW46QWRtaW5AMTIz"}}}
应用Secret:
kubectl apply -f harbor-secret.yaml
3.3 在Pod中引用Harbor镜像
修改Deployment的image字段为Harbor地址:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-demospec:template:spec:containers:- name: nginximage: harbor.example.com/library/nginx:latestimagePullSecrets:- name: harbor-registry-secret # 引用Secret
四、Harbor高级功能实践
4.1 镜像漏洞扫描
启用Clair扫描器(需在Harbor配置中启用):
# harbor.yml示例clair:enabled: trueurl: http://clair:6060interval: 6h
扫描结果可在Web控制台的Projects > Repository > Tags中查看,标记为Critical的镜像会被阻止运行。
4.2 自动化镜像清理
配置垃圾回收策略:
# 进入Harbor容器kubectl exec -it harbor-harbor-core-xxxx --namespace harbor -- /bin/sh# 执行垃圾回收/harbor/gc.sh
或通过API触发:
curl -X POST "https://harbor.example.com/api/v2.0/system/gc" \-H "accept: application/json" \-u "admin:Admin@123"
4.3 多租户管理
创建项目并分配权限:
- 登录Harbor控制台
- 新建项目(如
team-a) - 在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服务不可用
排查步骤:
- 检查Pod状态:
kubectl get pods -n harbor
- 查看日志:
kubectl logs harbor-harbor-core-xxxx -n harbor
- 常见原因:
- 存储卷空间不足
- 数据库连接失败
- Ingress配置错误
六、最佳实践建议
- 定期备份:使用
pg_dump备份Harbor数据库,存储至对象存储 - 监控告警:通过Prometheus监控Harbor指标(如
harbor_project_count) - 升级策略:每季度升级Harbor至最新稳定版,测试环境先行
- 镜像保留策略:设置自动删除旧版本镜像(如保留最近3个版本)
结语
通过Harbor与k8s的集成,企业可构建完整的容器化交付流水线,从代码构建到镜像存储再到集群部署形成闭环。本文介绍的部署方法、安全配置及故障排查技巧,能够帮助开发者快速落地生产级镜像仓库。建议结合CI/CD工具(如Jenkins、GitLab CI)进一步自动化镜像推送流程,提升DevOps效率。