必须显式配置 imagepullsecrets,因 kubernetes 不复用节点凭据且仅支持 kubernetes.io/dockerconfigjson 类型 secret;需在 pod 模板 spec 层级引用,并注意 harbor 项目权限与证书配置。

直接用 Deployment 拉取私有镜像会失败,核心原因是 Kubernetes 默认不带认证凭据——必须显式提供 imagePullSecrets,否则 Pod 会卡在 ImagePullBackOff 状态。
为什么 imagePullSecrets 是唯一可靠方式
公有镜像(如 nginx:latest)可直拉,但私有仓库(Harbor、Registry、Nexus)要求 HTTP Basic Auth 或 token 认证。Kubernetes 不会复用节点上 docker login 的凭据,所有 Pod 拉取行为都依赖其自身声明的 Secret。
-
imagePullSecrets是官方定义的、被 kubelet 原生支持的机制,其他方式(如修改/var/lib/kubelet/config.yaml或全局配置 dockerd)在现代 K8s(v1.24+)中已被弃用或无效 - Secret 必须是
kubernetes.io/dockerconfigjson类型,不能用普通OpaqueSecret 替代 - Secret 需与 Pod 在同一 namespace;跨 namespace 引用需额外配置
serviceAccount绑定
创建 regcred Secret 的实操要点
别手写 base64,也别手动拼 config.json ——容易因换行、空格、协议前缀出错。用 kubectl create secret docker-registry 最稳:
kubectl create secret docker-registry regcred \ --docker-server=https://harbor.example.com \ --docker-username=admin \ --docker-password=Harbor12345 \ --docker-email=admin@example.com \ -n default
注意几个关键点:
-
--docker-server必须带协议(https://或http://),Harbor 默认启 TLS,填错成harbor.example.com会导致认证 401 - 如果仓库用的是自签名证书,
kubelet会拒绝连接,需提前将 CA 证书注入每个节点的/etc/ssl/certs并重启 kubelet - Secret 创建后,可用
kubectl get secret regcred -o yaml检查.dockerconfigjson字段是否为合法 base64(解码后应是 JSON 格式)
在 Deployment 中正确引用 imagePullSecrets
不是加在 spec.containers 下,而是加在 spec.template.spec 层级:
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 2
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: app-container
image: harbor.example.com/project/app:v1.2
ports:
- containerPort: 8080
imagePullSecrets: # ← 这里,和 containers 同级
- name: regcred
常见错误:
- 写成
imagePullSecret: regcred(少个 s),K8s 不报错但无效 - 把
imagePullSecrets放到spec顶层(即 Deployment 对象根层级),它只对 Pod 生效,必须在 Pod 模板内 - 镜像地址没写全仓库域名,比如只写
project/app:v1.2,K8s 会默认去 Docker Hub 拉,而非你的私有库
ServiceAccount 绑定实现免重复声明
每个 Deployment 都写一遍 imagePullSecrets 很麻烦。更可持续的做法是绑定到 default ServiceAccount:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "regcred"}]}' -n default
之后该 namespace 下所有未显式指定 imagePullSecrets 的 Pod,都会自动继承这个 Secret。
但要注意:这种全局绑定只适用于单一私有仓库场景。如果集群要同时拉 Harbor 和 Nexus 的镜像,就必须按 namespace 或 Pod 级别单独配置,因为一个 ServiceAccount 只能关联一组凭据。
最易忽略的一点:Harbor 项目(Project)权限默认是 private,即使 Secret 正确,如果账号没被授予对应项目的 pull 权限,Pod 仍会卡在 ErrImagePull,错误日志里显示 unauthorized: authentication required ——这时候得去 Harbor UI 检查项目成员角色,而不是调 K8s 配置。










