首页/云/Kubernetes 速查/imagePullSecrets 拉取私有镜像
配置与存储54 条

imagePullSecrets 拉取私有镜像

私有仓库凭据存在 docker-registry 类型 Secret 中,通过 Pod 的 imagePullSecrets 或 ServiceAccount 交给 kubelet。

Kubernetes 速查云更新于 2026-10-13

机制定位

拉取私有仓库镜像需要凭据,凭据存在 docker-registry 类型(即 kubernetes.io/dockerconfigjson)的 Secret 里,由 kubelet 在拉取镜像时使用。适用平台是 Kubernetes。凭据有两处引用方式:写在工作负载 Pod 模板的 imagePullSecrets 上,或绑到 ServiceAccount 上让该账号下的 Pod 自动继承。前者便于逐个工作负载控制,后者适合整命名空间统一生效。

基本信息

适用平台Kubernetes,Secret 类型 kubernetes.io/dockerconfigjson
创建命令kubectl create secret docker-registry <名称> --docker-server/--docker-username/--docker-password
引用方式Pod 模板的 spec.imagePullSecrets,或 ServiceAccount 的 imagePullSecrets
作用范围Secret 为命名空间级,每个命名空间需各建一份或做同步

典型使用场景

  • 拉取企业私有仓库镜像:CI 推送后由 kubelet 凭凭据拉取
  • 多命名空间隔离:每个命名空间各建一份凭据并绑定到该空间的 ServiceAccount
  • 临时排查镜像拉取失败:用同一凭据在节点上手工验证仓库可达性
  • Token 轮换:更新 Secret 内容后,新创建的 Pod 使用新凭据
  • 多仓库并存:为不同仓库分别创建命名清晰的凭据对象

创建与引用

创建与引用
kubectl create secret docker-registry regcred -n prod \
  --docker-server=registry.example.com \
  --docker-username=robot-ci \
  --docker-password=<token> \
  --docker-email=ci@example.com

kubectl patch deploy web -n prod --type merge \
  -p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"regcred"}]}}}}'
kubectl patch sa default -n prod --type merge -p '{"imagePullSecrets":[{"name":"regcred"}]}'   # 或绑到 ServiceAccount

排查拉取失败

排查拉取失败
kubectl describe pod web-x | grep -A5 -i -E 'pull|failed'     # 事件里的原始报错
kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 -d | head -c 200
kubectl get deploy web -o jsonpath='{.spec.template.spec.imagePullSecrets}'
kubectl get sa default -o jsonpath='{.imagePullSecrets}'

报错与原因

事件提示原因处理
pull access denied / unauthorized凭据无效或无权访问该仓库路径核对用户名密码与仓库权限
manifest unknown镜像名或 tag 不存在核对 tag 与仓库项目名
i/o timeout节点到仓库网络不通查节点出网与仓库白名单
ImagePullBackOff综合失败状态先看 Events 原文再定位
多命名空间各自维护一份凭据;也可以把 Secret 绑到工作负载使用的 ServiceAccount 上,让该命名空间的新 Pod 自动继承。
已有本地镜像缓存的节点不会立刻暴露凭据失效问题,因此轮换 Token 后务必在无缓存的节点或新节点上验证一次。

落地建议

  • 按仓库分别建凭据对象:一个 Secret 只对应一个 server 地址,镜像来源多时命名要能一眼看出用途
  • 优先绑到 ServiceAccount:命名空间内所有工作负载自动继承,减少逐个 Deployment 配置的遗漏
  • 轮换后用零缓存节点验证:老节点有镜像缓存,凭据失效不一定立刻暴露
  • 把凭据更新纳入发布流程:Token 有有效期,过期时间要有人盯,避免扩容当天才发现拉不动

易错点

  • ImagePullBackOff 先核对 Secret 里的 server 与镜像地址前缀是否完全一致,前缀写错时凭据不会被使用
  • Token 轮换后忘记更新 Secret:老节点有本地镜像缓存仍能跑,新节点立刻拉不动,问题会在扩容时才暴露
  • 只在 Deployment 上配 imagePullSecrets 而漏掉 Job、CronJob 等其他控制器,新任务同样会拉取失败
  • 把凭据写在镜像仓库地址不同的 Secret 里混用:一个 Secret 只对应一个 server,跨仓库需要分别创建

数据来源与参考

  • Kubernetes 官方文档 · 从私有仓库拉取镜像
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌