基于K8s环境在线部署Harbor镜像仓库全攻略
一、Harbor与K8s的协同价值
Harbor作为CNCF毕业项目,提供企业级镜像仓库功能,包括镜像复制、RBAC权限控制、漏洞扫描等特性。在K8s环境中部署Harbor具有显著优势:
- 镜像分发加速:通过本地镜像仓库减少拉取时间,提升CI/CD流水线效率
- 安全管控:内置漏洞扫描与镜像签名验证,保障容器镜像安全
- 资源隔离:利用K8s Namespace实现多租户镜像管理
- 高可用架构:通过StatefulSet实现有状态服务管理,结合StorageClass提供持久化存储
典型应用场景包括:私有云环境镜像管理、跨集群镜像同步、DevOps流水线集成等。
二、环境准备与前提条件
2.1 基础设施要求
- Kubernetes集群版本≥1.19
- 可用存储类(如NFS/Ceph/AWS EBS)
- 节点资源要求:
- CPU:≥2核
- 内存:≥4GB
- 磁盘:≥20GB(用于镜像存储)
2.2 依赖组件安装
-
Helm安装(v3.0+):
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3chmod 700 get_helm.sh./get_helm.sh
-
Ingress Controller配置(以Nginx为例):
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm install ingress-nginx ingress-nginx/ingress-nginx \--namespace ingress-nginx --create-namespace
-
存储类配置示例(NFS):
# nfs-storageclass.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: nfs-storageprovisioner: k8s-sigs.io/nfs-subdir-external-provisionerparameters:archiveOnDelete: "false"
三、Harbor安装实施步骤
3.1 Helm Chart配置
-
添加Bitnami Helm仓库:
helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update
-
创建自定义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”
### 3.2 证书配置(生产环境必需)1. 生成自签名证书(测试环境):```bashopenssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout tls.key -out tls.crt \-subj "/CN=harbor.example.com/O=harbor"
- 创建K8s Secret:
kubectl create secret tls harbor-tls \--cert=tls.crt --key=tls.key \-n harbor-namespace
3.3 安装执行
kubectl create namespace harbor-namespacehelm install harbor bitnami/harbor \--namespace harbor-namespace \-f harbor-values.yaml
四、安装后验证与配置
4.1 服务状态检查
kubectl get pods -n harbor-namespace# 预期输出:# NAME READY STATUS RESTARTS AGE# harbor-core-... 1/1 Running 0 2m# harbor-database-... 1/1 Running 0 2m# harbor-portal-... 1/1 Running 0 2m
4.2 访问验证
-
添加DNS解析(测试环境可修改/etc/hosts):
<K8S_NODE_IP> harbor.example.com
-
浏览器访问
https://harbor.example.com,使用默认账号admin/AdminPass123登录
4.3 客户端配置
-
配置Docker信任证书:
mkdir -p /etc/docker/certs.d/harbor.example.comcp tls.crt /etc/docker/certs.d/harbor.example.com/ca.crtsystemctl restart docker
-
登录Harbor:
docker login harbor.example.com
五、高级配置与运维
5.1 镜像复制配置
-
创建目标仓库规则:
# replication-rule.yamlapiVersion: goharbor.io/v1alpha1kind: ReplicationRulemetadata:name: my-replicationspec:name: my-ruleproject: librarytargetFilter:name: my-targettrigger:type: manualfilters:tagFilter:mode: "regexp"value: ".*"
-
通过Harbor Web界面或API创建复制端点
5.2 备份恢复策略
-
数据库备份:
kubectl exec -n harbor-namespace \$(kubectl get pods -n harbor-namespace -l app.kubernetes.io/component=database -o jsonpath='{.items[0].metadata.name}') \-- pg_dump -U postgres harbor > backup.sql
-
持久化卷快照:
# 根据存储类型选择相应工具(如velero)
六、常见问题解决方案
6.1 Ingress 502错误排查
-
检查后端服务状态:
kubectl get endpoints -n harbor-namespace harbor-core
-
查看Nginx日志:
kubectl logs -n ingress-nginx \$(kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}')
6.2 存储空间不足处理
-
扩展PVC容量:
kubectl patch pvc registry-pvc -n harbor-namespace \--type='json' \-p='[{"op": "replace", "path": "/spec/resources/requests/storage", "value":"20Gi"}]'
-
配置垃圾回收策略:
# 在values.yaml中添加garbageCollection:enabled: truethreshold: 50timeWindow: 24h
七、最佳实践建议
-
安全加固:
- 启用自动TLS证书轮换
- 配置RBAC权限最小化原则
- 定期更新Harbor版本
-
性能优化:
- 为Registry服务配置HPA(水平自动扩缩)
- 使用缓存代理加速镜像拉取
- 分离数据库到独立节点
-
监控集成:
- 配置Prometheus监控指标
- 设置镜像推送/拉取告警规则
- 集成日志收集系统(如ELK)
通过上述完整流程,开发者可在K8s环境中快速部署生产级Harbor镜像仓库。实际部署时应根据具体业务需求调整存储配置、安全策略和复制规则等参数,建议先在测试环境验证配置后再应用于生产环境。