文章背景图

Kubernetes Pod 出现 ImagePullBackOff:镜像、认证、DNS 与运行时排查

2026-08-09
1
-
- 分钟

ImagePullBackOff 表示节点拉取镜像失败并进入退避重试。问题可能来自镜像名称、仓库认证、节点 DNS、网络、证书、限流或容器运行时。排查应以事件中的原始错误为入口。

一、确认具体 Pod 与事件

kubectl get pod -A | grep -E 'ImagePullBackOff|ErrImagePull'
kubectl describe pod <pod-name> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp | tail -n 50

记录 Pod 所在节点、完整镜像地址、ServiceAccount、imagePullSecrets 和 Events 最后一条错误。

  • manifest unknown:镜像名或 tag 不存在。

  • unauthorized / denied:凭据、权限或项目路径错误。

  • no such host:节点 DNS 解析失败。

  • i/o timeout:网络、代理、防火墙或仓库响应慢。

  • x509: certificate signed by unknown authority:私有 CA 未被信任。

  • toomanyrequests:仓库限流。

  • no space left on device:节点磁盘或 inode 耗尽。

二、确认工作负载引用的镜像

kubectl get pod <pod-name> -n <namespace> \
  -o jsonpath='{range .spec.containers[*]}{.name}{" => "}{.image}{"\n"}{end}'
kubectl get deploy <deploy-name> -n <namespace> -o yaml | grep -A3 'image:'

检查仓库域名、项目、镜像名、tag 和大小写。生产环境建议使用不可变 digest,避免同一个 tag 被覆盖。

三、检查镜像仓库凭据

kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.spec.imagePullSecrets[*].name}'
kubectl get sa <service-account> -n <namespace> -o yaml
kubectl get secret <secret-name> -n <namespace> -o jsonpath='{.type}'

Secret 必须位于 Pod 同一个 namespace,类型通常为 kubernetes.io/dockerconfigjson。不要在终端或工单中输出解码后的密码。凭据过期时应创建新 Secret、更新引用,再删除旧凭据。

四、从故障节点验证 DNS 与网络

kubectl get pod <pod-name> -n <namespace> -o wide
kubectl get node <node-name> -o wide

登录对应节点后:

getent hosts registry.example.com
curl -vkI https://registry.example.com/v2/
timedatectl status
df -hT
df -ih

仓库 /v2/ 返回 401 往往说明网络和 TLS 已通,应继续查认证。所有节点都失败时检查仓库、出口或凭据;只有单节点失败,则重点查该节点 DNS、代理、CA、磁盘和运行时。

五、使用容器运行时复现

crictl pull registry.example.com/team/app:tag
crictl info
journalctl -u containerd --since '-30 min' --no-pager
journalctl -u kubelet --since '-30 min' --no-pager

直接复现可以得到比 Event 更完整的错误。不要在生产节点随意使用另一套工具写入不同的镜像存储。

六、代理与私有 CA

systemctl show containerd -p Environment
systemctl show kubelet -p Environment

节点通过代理访问仓库时,应检查 containerd 和 kubelet 的 systemd 环境,而不是只看当前 shell。企业 CA 应安装到操作系统和运行时要求的位置,不要通过关闭 TLS 验证长期绕过证书错误。

七、应急恢复

  1. tag 错误:发布正确镜像并更新工作负载。

  2. 凭据过期:轮换 Secret,触发重新拉取。

  3. 单节点故障:先 cordon 节点,将关键 Pod 调度到健康节点。

  4. 仓库故障:切换经过验证的灾备仓库。

  5. 磁盘不足:通过运行时工具清理确认无用的镜像,不要直接删除运行时目录。

  6. 修复后重启工作负载并观察 rollout。

kubectl rollout restart deployment/<name> -n <namespace>
kubectl rollout status deployment/<name> -n <namespace>

八、长期治理

  • CI 发布后验证镜像 digest、可拉取性和多架构清单。

  • 仓库凭据在到期前告警并自动轮换。

  • 节点统一配置 DNS、代理和企业 CA。

  • 监控仓库可用性、限流、节点磁盘及拉取耗时。

  • 关键镜像同步到灾备仓库,并定期演练切换。

  • 减少超大镜像,优化镜像层缓存和发布节奏。

排查时最重要的是围绕“具体节点返回的具体错误”推进,不要只反复删除 Pod 等待运气。

原创

Kubernetes Pod 出现 ImagePullBackOff:镜像、认证、DNS 与运行时排查

本文链接: Kubernetes Pod 出现 ImagePullBackOff:镜像、认证、DNS 与运行时排查

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录