Pod状态排障指南:Pending、ImagePullBackOff、CrashLoopBackOff与OOMKilled怎么查

来自AI助手的总结
了 Kubernetes Pod 常见状态及系统化排查方法。
Pod状态排障指南:Pending、ImagePullBackOff、CrashLoopBackOff与OOMKilled怎么查

一、先理解 Pod 常见状态

日常最常见的 Pod 状态包括:

  • Pending
  • Running
  • Succeeded
  • Failed
  • Unknown
  • ImagePullBackOff / ErrImagePull
  • CrashLoopBackOff
  • OOMKilled
  • Terminating
  • SysctlForbidden
  • Completed
  • ContainerCreating

虽然状态很多,但真正排查时,抓住“调度、镜像、启动、资源、删除”这几个方向就够了。

二、Kubernetes 官方 phase 只有五种

严格来说,Pod 的 status.phase 只有五种:

  • Pending
  • Running
  • Succeeded
  • Failed
  • Unknown

而像 ImagePullBackOffCrashLoopBackOffContainerCreating 这些更常见的显示值,通常是更细粒度的容器状态或等待原因。

所以排查时不要只盯着列表里的字面值,更要继续往下看 describe 和日志。

三、最常见的异常状态怎么排查

3.1 Pending

含义:Pod 已被系统接受,但一个或多个容器还没有成功创建。

优先排查:

kubectl describe po xxx -n xxx

最常见原因通常是:

  • 调度不到合适节点
  • 镜像尚未拉取完成
  • PVC、配额或节点资源有问题

3.2 Running

含义:Pod 已经运行,但这不一定代表业务一定正常。

尤其要注意:Running 不等于真正可用,还要继续看 READY 是否为 N/N

排查日志:

kubectl logs xxx -n xxx

3.3 Succeeded / Completed

这类状态常见于一次性任务,比如 Job。它表示容器执行成功并正常退出。

需要复盘执行结果时,直接看日志:

kubectl logs xxx -n xxx

3.4 Failed

表示 Pod 中至少有一个容器以失败方式结束。

常用排查方式:

kubectl logs xxx -n xxx
kubectl describe po xxx -n xxx

3.5 ImagePullBackOff / ErrImagePull

这通常表示镜像拉取失败。

常见原因包括:

  • 镜像地址错误
  • 镜像不存在
  • 网络不通
  • 私有仓库认证失败

优先查看:

kubectl describe po xxx -n xxx

3.6 CrashLoopBackOff

这是最典型也最常见的异常状态之一,表示容器启动后很快退出,并不断重启。

常见原因:

  • 启动命令写错
  • 主进程启动失败
  • 健康检查不通过
  • 配置缺失

先看日志:

kubectl logs xxx -n xxx
kubectl logs xxx -n xxx --previous

3.7 OOMKilled

表示容器因为内存不足被系统杀掉。

常见原因:

  • limits.memory 设置过小
  • 程序自身出现内存泄漏或异常占用

排查日志:

kubectl logs xxx -n xxx

3.8 Terminating

表示 Pod 正在被删除。

如果长时间停留在这里,可以继续看:

kubectl describe po xxx -n xxx

常见原因通常和终止流程、挂载资源释放、finalizer 或节点状态有关。

3.9 SysctlForbidden

表示 Pod 自定义了内核参数,但节点上的 kubelet 没有允许相关配置,或者参数本身不受支持。

优先还是看:

kubectl describe po xxx -n xxx

3.10 ContainerCreating

表示 Pod 正在创建中。

如果持续时间过长,常见原因通常有:

  • 镜像下载慢或拉取失败
  • 卷挂载异常
  • CNI 网络初始化有问题

同样先看:

kubectl describe po xxx -n xxx

四、排查 Pod 的一套通用思路

如果你不想在每次故障时都临场猜,可以固定按下面这套顺序排查:

4.1 先看状态和节点

kubectl get po -o wide

确认 Pod 在哪个节点、当前状态是什么、是否已经分配 IP。

4.2 再看详细事件

kubectl describe po xxx -n xxx

这一步通常能直接看到调度失败、镜像拉取失败、挂载失败、探针失败等关键信息。

4.3 再看当前和上一次日志

kubectl logs xxx -n xxx
kubectl logs xxx -n xxx --previous

特别是 CrashLoopBackOff 场景,--previous 很有价值。

4.4 最后再回到配置本身

重点检查:

  • 镜像地址是否正确
  • 启动命令和参数是否正确
  • 探针配置是否合理
  • 资源限制是否过紧
  • Secret、ConfigMap、Volume 是否挂载成功

五、学会看状态,本质上是在学会看系统信号

Pod 排障的核心并不是背熟所有状态名,而是建立一种系统化判断方式:

  • 调度问题先看 describe
  • 启动问题先看 logs
  • 重启问题结合 --previous
  • 资源问题重点看 OOMKilled
  • 删除卡住重点看终止流程和对象依赖

当你把 Pod 状态看作系统给出的信号,而不是一串英文单词时,排障效率会提升很多。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容