首页/云/Kubernetes 速查/CrashLoopBackOff 排查
集群运维与排障54 条

CrashLoopBackOff 排查

容器反复退出、kubelet 按退避节奏重启后呈现的稳定状态:先看上一实例日志与退出原因,再核对启动命令、依赖与探针配置。

Kubernetes 速查云更新于 2026-10-13

CrashLoopBackOff 是什么

CrashLoopBackOff 是容器反复退出后呈现的稳定状态:进程启动、失败、退出,kubelet 按指数退避的节奏再次拉起,等待时间逐次增长并封顶。它不是一个原因,而是一个结果——真正的原因要从上一次终止的退出码、被杀前的日志与配置里找。

状态里那个时间说明什么

状态列里跟着的时间后缀是下一次重启前的等待时长,随连续失败次数增长。它反映的是「已经失败了很多次」,而不是故障持续时间。看到等待时间已经很长,说明问题从一开始就存在且没有被解决,此时反复删除重建只会重新走一遍同样的循环。

基本信息

适用环境任何 Kubernetes 发行版,与容器运行时和 kubelet 的重启策略共同作用
触发条件容器进程退出且重启策略为总是或失败时重启
退避机制等待时间随失败次数增长并有上限
关键证据上一次终止的退出码与原因、被杀前的日志、对象事件
常见后果副本长期不可用,滚动更新与自动扩缩一起被拖住
排查入口先看描述信息的终止段,再读上一个实例的日志

典型使用场景

  • 发布后服务起不来:新版本镜像或配置有问题,全部副本同时进入循环
  • 配置缺失:依赖的密钥或配置文件没有挂载导致进程启动即退出
  • 命令写错:启动命令指向不存在的可执行文件,进程立刻返回
  • 依赖不可达:启动阶段连接数据库失败,进程选择直接退出
  • 内存超限:容器被反复终止,表现为重启计数持续增长
  • 探针配置错误:存活检查过严导致进程被反复重启

标准三件套

标准三件套
kubectl get pod web-x -o wide                     # 确认状态与重启次数
kubectl describe pod web-x | sed -n '/State:/,/Events:/p'   # 看当前与上一次状态
kubectl logs web-x --previous --tail=200            # 上次退出前的日志,关键证据
kubectl logs web-x --tail=100                       # 当前实例的日志
kubectl get events --field-selector involvedObject.name=web-x --sort-by=.lastTimestamp

退出码线索

退出码常见含义下一步
1应用自身报错:异常抛出、配置缺失读上一次日志找异常
126命令存在但不可执行:权限或格式问题检查文件权限与可执行位
127找不到命令:镜像内没有该程序核对启动命令与镜像内容
137被强制终止:常见于内存超限看内存上限与用量
143收到终止信号后退出确认是否为探针或缩容触发

按阶段缩小范围

  • 启动阶段就退出:重点看启动命令、配置文件与挂载是否就绪
  • 运行一段时间后退出:重点看内存、依赖连接与探针设置
  • 所有副本同时异常:指向镜像、配置或依赖,而不是单个实例
  • 只有部分副本异常:指向该实例的节点、本地卷或调度约束
等待时间后缀随失败次数增长,是排查时判断「已经失败多次」的重要信号,也说明问题具有确定性而非偶发。
容器从未成功启动过时上一个实例的日志可能为空,此时应转向查看对象事件与挂载情况。

易错点

  • 只看当前日志:容器已经重启,报错几乎总在上一个实例的日志里,不看它等于放弃最直接的证据
  • 反复删除重建 Pod:问题出在镜像或配置时,重建只是重走一遍失败流程,还会丢掉重启计数与事件
  • 把探针失败当业务异常:存活检查超时会直接终止进程,先核对检查路径与超时参数
  • 只看单个副本就下结论:需要确认是全部副本异常还是个别异常,两者的排查方向完全不同

数据来源与参考

  • Kubernetes 官方文档 · Pod 生命周期
  • Kubernetes 官方文档 · 调试 Pod
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌