直接回答:ImagePullBackOff 是“拉镜像失败后进入退避重试”的状态,原因看 kubectl describe pod 的 Events 里那条原始错误。五类高频原因:镜像名或 tag 写错(manifest not found);私有仓库认证缺失或失效(imagePullSecret 未配、token 过期);网络问题(节点到仓库不通、DNS 解析失败、代理没配);仓库限流(Docker Hub 匿名配额);节点磁盘满(无法落盘镜像层)。
展开解析:定位套路:Events 报错文本基本直给原因;拿镜像名到节点上手动 crictl pull 或 nerdctl pull 复现,可绕开 K8s 看真实错误。私有仓库认证注意 imagePullSecret 必须在 Pod 所在 namespace 创建并被 ServiceAccount 引用,多 namespace 部署时常漏。tag 的坑:用 latest 或可变 tag 加上 imagePullPolicy: IfNotPresent,节点缓存了旧镜像后“代码更新了但 Pod 没更新”,排障时浪费大量时间,规范做法是不可变 tag(版本号或摘要)。磁盘满的根治是 kubelet 的镜像 GC 阈值(imageGCHighThresholdPercent)调低、CI 别往节点推无用大镜像。大规模 rollout 时还要考虑仓库带宽:几百节点同时拉几个 GB 的镜像会拖垮仓库,预热(prepull DaemonSet)或镜像加速(P2P 分发如 Dragonfly、Spegel)是规模化解法。
追问方向:ErrImagePull 与 ImagePullBackOff 是什么关系?containerd 的镜像存储目录在哪?
(约 460 字)