Pod 创建沙箱失败(failed to create pod sandbox)的定位与修复
Pod 长时间停在 ContainerCreating,kubectl describe pod 的 Events 出现 failed to create pod sandbox,后面通常跟一段运行时错误,例如连接 CRI socket 失败、创建 pause 容器失败、网络命名空间配置失败或 cgroup 设置失败。kubelet 日志里也能看到同一错误的完整堆栈。
沙箱是 Pod 的基础环境,包含 pause 容器、网络命名空间、IPC 命名空间和 cgroup。沙箱没有建好,业务容器就不会开始拉镜像。排查时要先分清失败发生在运行时层、CNI 网络层还是节点资源层。Events 里的错误经常被截断,完整堆栈在 kubelet 日志中,定位时不要只复制第一行。同一节点所有新 Pod 都失败时优先怀疑节点级问题;只有个别 Pod 失败时,优先检查 Pod 配置和安全策略。
先看 Pod 事件和节点:
kubectl describe pod <pod> -n <ns>
kubectl get events -n <ns> --sort-by=.lastTimestamp | tail -30
kubectl get node <node> -o wide
登录节点查看 kubelet 与运行时日志:
journalctl -u kubelet --since '30 min ago' | grep -i -E 'sandbox|runtime|containerd|cni'
systemctl status containerd
crictl info
crictl pods
crictl images | grep -i pause
检查 CNI 和节点资源:
ls -l /etc/cni/net.d/ /opt/cni/bin/
df -h
df -i
dmesg -T | tail -50
如果 crictl info 连不上,先确认运行时 endpoint 和 socket 权限:
crictl --runtime-endpoint unix:///run/containerd/containerd.sock info
ls -l /run/containerd/containerd.sock
再核对 kubelet 与运行时的 cgroup driver 是否一致:
grep -i cgroup /var/lib/kubelet/config.yaml
containerd config dump | grep -i -E 'cgroup|sandbox'
同时确认节点没有 NotReady、DiskPressure、MemoryPressure 等 Condition,并检查 kubelet 是否在持续重启。
事件里出现 network plugin is not ready、failed to setup network for sandbox 时,优先查 CNI;出现 failed to create containerd container、no such image、context deadline exceeded 时,优先查运行时和 pause 镜像;出现 no space left on device、too many open files、cannot allocate memory 时,优先查节点资源。
/var/lib/containerd 状态损坏。pids.max 或内核限制。crictl info、crictl pods、dmesg 和存储目录状态,避免问题复现后证据丢失。systemctl status containerd 和 journal,修复配置后重启运行时;重启会影响节点容器管理,应在维护窗口评估。crictl info 正常但创建仍失败时,检查运行时配置、sandbox 镜像和存储目录;必要时清理无主的沙箱、容器和快照。crictl images 确认镜像已存在。/etc/cni/net.d 配置,检查 IP 池、路由和 NetworkPolicy。dmesg,修复模块和存储;状态目录损坏且无法恢复时,drain 节点后重建。合上页面,先回答,再展开对照。
failed to create pod sandbox,应先区分哪几个失败层次?crictl info 是否可用,以及 /etc/cni/net.d 和节点容量。ContainerCreating,事件可能报镜像不存在或拉取失败。用 crictl images | grep pause 确认,检查运行时配置的 sandbox 镜像和仓库连通性,预拉取或修正镜像地址后重建 Pod。
小程序版
微信扫码,随时查命令