系统学习 故障排查学习路径:从方法论到系统、网络、数据库与 K8s

pod-sandbox-failed

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 时,优先查节点资源。

常见根因

  1. 容器运行时没有启动、崩溃或卡住,CRI socket 不可达,kubelet 无法创建沙箱。
  2. CNI 插件未就绪、配置缺失或冲突,Pod 网络命名空间和 IP 分配失败。
  3. pause/sandbox 镜像缺失、拉取失败,或运行时配置的镜像地址不可访问。
  4. 节点磁盘或 inode 耗尽,无法创建容器快照、rootfs 或写入元数据。
  5. kubelet 与运行时的 cgroup driver 不一致,systemd 与 cgroupfs 混用导致 cgroup 创建失败。
  6. overlayfs、br_netfilter 等内核模块缺失,或 /var/lib/containerd 状态损坏。
  7. SELinux/AppArmor 拒绝挂载、写目录或创建命名空间。
  8. 节点 PID、线程或文件描述符耗尽,触发 pids.max 或内核限制。
  9. 节点升级后 kubelet 与运行时 CRI 版本不兼容,或 socket 路径配置错误。
  10. 残留的网络命名空间、CNI 状态文件或旧沙箱与本次创建冲突。
  11. kubelet 自身配置错误、证书过期或与 API server 通信异常,导致创建流程半途失败。
  12. Pod 的 securityContext、sysctl 或设备请求与节点内核能力冲突,在沙箱阶段被拒绝。

修复

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 看到 failed to create pod sandbox,应先区分哪几个失败层次?
  2. pause 镜像缺失会表现成什么,如何确认并修复?
  3. 哪些节点资源或内核问题会导致沙箱创建失败?
答案
  1. 先区分运行时层、CNI 网络层和节点资源层:看 Events 的完整错误、kubelet/运行时日志、crictl info 是否可用,以及 /etc/cni/net.d 和节点容量。
  2. Pod 会卡在 ContainerCreating,事件可能报镜像不存在或拉取失败。用 crictl images | grep pause 确认,检查运行时配置的 sandbox 镜像和仓库连通性,预拉取或修正镜像地址后重建 Pod。
  3. 磁盘/inode 耗尽、PID 或文件描述符耗尽、cgroup driver 不一致、overlayfs/内核模块缺失、SELinux/AppArmor 拒绝以及运行时状态目录损坏,都会导致沙箱创建失败。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令