优先用helm安装harbor,因它预置多组件依赖、健康检查、rbac及ingress规则;生产环境必须设expose.type=ingress且tls.enabled=true;imagepullsecrets须显式配置在pod或serviceaccount级,node级docker配置无效。

直接上结论:在 Kubernetes 中部署 Harbor,**优先用 Helm 安装**,别手写全套 YAML;用 expose.type=ingress + tls.enabled=true 是生产环境最低安全门槛;imagePullSecrets 必须配在 Pod 或 ServiceAccount 级,全局改 Node 上的 /etc/docker/daemon.json 在 K8s 里基本无效。
为什么 Helm 部署比 docker-compose 或裸 YAML 更可靠
Harbor 不是单容器服务,它由 core、registry、trivy、database、redis 等至少 6 个组件协同工作。手动维护它们的健康探针、就绪检查、存储卷绑定、服务发现和启动顺序,极容易漏掉依赖项(比如 jobservice 启动前 core 就开始报 503)。
- Helm chart(如
harbor/harbor)已预置各组件间依赖关系、默认资源限制、RBAC 规则和 Ingress 路由规则 - 所有配置项都通过
values.yaml统一注入,比如persistence.persistentVolumeClaim.registry.storageClass指定 NFS 存储类,避免手动创建 PVC 出错 - 升级/回滚只需
helm upgrade或helm rollback,不用逐个删 Pod 再等 StatefulSet 重建 - 不推荐用
docker-compose部署到 K8s —— 它生成的是单机容器,无法被 K8s 调度或扩缩容
imagePullSecrets 必须显式声明,Node 级配置不起作用
Kubernetes 的 Pod 拉取镜像时,**完全不读取所在 Node 上的 /etc/docker/daemon.json 或 ~/.docker/config.json**。这是常见误解,也是私有仓库拉取失败的第一大原因。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 必须为每个需要拉取私有镜像的
Pod或其所属ServiceAccount显式挂载imagePullSecrets - Secret 类型必须是
kubernetes.io/dockerconfigjson,不是generic;内容是 base64 编码后的.dockerconfigjson文件(含auths字段) - 若用
helm install harbor部署 Harbor 自身,它的registry组件默认监听5000端口且不启用 TLS,但 K8s 默认拒绝非 HTTPS 仓库 —— 所以必须同时配insecure-registries(不推荐)或强制走 HTTPS(推荐) - 验证是否生效:进 Pod 执行
curl -I https://harbor.example.com/v2/,返回401 Unauthorized表示路由通、认证层起作用;返回Connection refused则是 Ingress 或 Service 没暴露对
HTTPS 证书不能省,自签名也得配全链
Harbor 的 Web UI、API、Docker CLI 推送都强依赖 HTTPS。用自签名证书时,K8s 内部组件(如 core 调用 registry)和外部客户端(如开发机 docker login)都会因证书校验失败而中断。
- 证书必须包含完整域名(如
harbor.example.com),不能只用 IP 或localhost - 若用
cert-manager,需确保 Issuer 已就绪,且values.yaml中expose.tls.certSource=secret并指定secret.name - 若用自签名,把
ca.crt同时挂载进 Harbor 的core和registry容器的/etc/ssl/certs/,并重启它们(否则内部组件间调用仍会报 x509: certificate signed by unknown authority) - 测试命令:
openssl s_client -connect harbor.example.com:443 -servername harbor.example.com 2>/dev/null | openssl x509 -noout -text查看证书 Subject 和 SAN 是否匹配
最容易被忽略的一点:Harbor 的 trivy 漏洞扫描器默认每 24 小时全量扫描一次,如果镜像多、CPU 少,会导致 jobservice 长时间卡住,连带 core 接口响应变慢甚至超时 —— 生产环境务必调低扫描频率或关闭非关键项目自动扫描,而不是等 Pod 全部 Pending 才去查日志。










