现场是这样的。K8s 1.26 集群换成 containerd 运行时,节点上 Pod 全部停在 ContainerCreating,describe 事件里反复出现 failed to get sandbox image registry.k8s.io/pause:3.9,节点本身能正常访问外网。

中间走过弯路,把「配置了 mirrors 但只对 docker.io 生效,k8s.io 这一类没覆盖」当成主因,改完现象没变。

把日志和配置对完,能解释这个现象的基本就这几处。节点没有配置镜像加速,registry.k8s.io 在境内被墙;containerd 的 config.toml 里 sandbox_image 指向了一个不存在的 tag;节点磁盘满,镜像层解压失败,报错被事件层吞掉了。

第一件事是看到底是拉取超时还是 404

crictl pull registry.k8s.io/pause:3.9

然后改 containerd 的 sandbox 镜像地址

grep -n sandbox_image /etc/containerd/config.toml

接着换成可访问的仓库地址并重启

systemctl restart containerd && systemctl restart kubelet

末了确认 pause 镜像已在本地

crictl images | grep pause

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

怎么算真的好了,看的是同一批现象。crictl images 里能看到 pause 3.9,节点上新建的 Pod 能在两分钟内进入 Running,describe 里不再出现 sandbox 相关报错。

提醒一点。改 sandbox_image 时 tag 要和 kubelet 期望的一致,版本对不上会一直重试;配置改完要 containerd 和 kubelet 一起重启才干净。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189