k8s-pod-containercreating
sidebar_position: 1 title: K8S生产排查台账:Pod卡在ContainerCreating description: FailedCreatePodSandBox 通用排查指南与面试话术
K8S 生产排查台账:Pod 卡在 ContainerCreating(FailedCreatePodSandBox 通用排查指南)
01 前置理论与核心机制
1. PodSandbox 的生命周期与 CNI 交互机制
- 基础架构容器:Pod 在 K8S 中以多容器共享环境形式存在。在拉起业务容器前,容器运行时(CRI,如 containerd)会优先调用底层的
pause镜像拉起基础架构容器,初始化并持有专用的 Linux Namespace(Network、IPC、UTS 等)。 - CNI 调用标准流程:
- CRI 接收到 Kubelet 的
RunPodSandboxRPC 请求。 - CRI 在宿主机创建 Network Namespace。
- CRI 按照标准 CNI 规范,解析配置并同步调用网络插件二进制(执行
ADD动作)。 - CNI 插件分配 IP、配置网卡对(veth pair)、设置宿主机与容器内的路由规则。
- CNI 将网络配置结果(IP、DNS、路由)以标准 JSON 返回给 CRI,沙箱创建完成。
- CRI 接收到 Kubelet 的
- 报错本质:
FailedCreatePodSandBox代表在上述调用链中,系统命名空间创建、CRI 内部流程或 CNI 插件的ADD执行失败,导致沙箱未就绪,业务容器因此无法进入拉取镜像与启动流程。
2. Node Ready 状态与网络健康的判定边界
- 节点状态上报链路:
kubelet标记节点为Ready,核心考量是节点的系统基础健康状况(心跳上报、未触碰 DiskPressure/MemoryPressure/PIDPressure 驱逐线,以及 CRI 守护进程处于连接可用状态)。 - 为什么 CNI 异常时节点通常仍维持 Ready:
- 在主流 CRI 架构下,节点的网络就绪判定(
NetworkReady)主要由底层的 CRI 插件通过检查网络配置目录(如/etc/cni/net.d/)是否存在合法配置,向 Kubelet 进行状态同步与汇报。 - 在常规心跳周期中,运行时与 Kubelet 通常不会主动调用 CNI 二进制去发起真实的端到端网络分配探测。
- 这种解耦设计意味着“静态配置存在”并不等同于“具备动态网络分配能力”;真实的沙箱网络分配只有在 Pod 被实际调度并触发
RunPodSandbox时才会验证。
- 在主流 CRI 架构下,节点的网络就绪判定(
02 故障排查与恢复闭环 SOP
1. 现场止血与范围界定
# 1. 发现单机批量异常时,优先封锁节点,防止新任务继续落盘扩散影响
kubectl cordon <target-node>
# 2. 查看目标 Pod 事件及报错堆栈
kubectl describe pod <pod-name> -n <namespace>
# 3. 检查异常 Pod 的宿主机分布,判断是单机故障还是集群全局故障
kubectl get pods -A --field-selector spec.nodeName=<target-node>
- 全局故障:集群多个节点均报
FailedCreatePodSandBox。排查重心:CNI 控制面组件(如kube-system下的 DaemonSet/Operator)、IPAM 全局地址池耗尽、APIServer 证书或集群鉴权凭证异常。 - 单机故障:故障仅集中在特定节点。排查重心:宿主机 CRI 运行环境、本地 CNI 二进制/配置文件、节点 IPBlock 配额、本地系统资源限制。
2. 节点现场排查流程
单机 FailedCreatePodSandBox
│
├─ 1. 提取精准底层报错 (containerd / kubelet)
├─ 2. 检查 CNI 本机守护容器与路由建立状态
├─ 3. 检查 IPAM 资源池与虚拟网络接口
├─ 4. 核验 CNI 配置加载规则及二进制完整性与权限
└─ 5. 检查宿主机内核限制 (Inode / file-max / inotify)
步骤一:提取精准错误日志
Kubelet 事件多为顶层概括,深层堆栈需在目标宿主机调取 CRI 运行日志:
# 1. 优先查看 containerd 最近 10 分钟内包含 CNI 报错的上下文(重点关注 error 级别)
journalctl -u containerd --since "10 minutes ago" --no-pager | grep -C 5 -i "cni"
# 2. 若 containerd 无明确报错,查看 kubelet 针对该 Pod 的沙箱调用记录
journalctl -u kubelet --since "10 minutes ago" --no-pager | grep -i "FailedCreatePodSandBox"
步骤二:检查 CNI 节点守护进程
# 查看本机 CNI 容器状态
crictl ps -a | grep -E 'calico|flannel|cilium'
# 查看 CNI 容器日志
crictl logs <cni-container-id> --tail 100
- 排查重点:容器是否存在频繁重启(CrashLoopBackOff)、OOMKilled、与集群控制面的通信超时。
🔒 本部分核心干货已锁定
包含:后续高危场景避坑、四大生产真实案例复盘与面试预案。扫码获取暗号解锁全文。