首页/云/Kubernetes 速查/容器重启退避(backoff)
集群运维与排障54 条

容器重启退避(backoff)

反复失败的容器由 kubelet 按退避节奏重启:初始间隔约 10 秒并逐步翻倍,稳定运行一段时间后计时重置。

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

重启退避是什么

容器进程退出后,kubelet 不会立刻无限次重试,而是按指数退避节奏重启:首次失败后等待约 10 秒,随后逐次翻倍,最长间隔约 5 分钟;容器稳定运行约 10 分钟后计时重置。连续快速失败的表现就是 pod 状态列出现 CrashLoopBackOff。理解退避机制才能读懂 RESTARTS 计数与 STATUS 列随时间的配合关系。

基本信息

执行者节点 kubelet,按 Pod 的 restartPolicy 决定是否重启
初始间隔约 10 秒,之后逐次倍增
最大间隔约 5 分钟
重置条件容器稳定运行一段时间后计时清零
状态表现STATUS 显示 CrashLoopBackOff,并在 Waiting 与 Running 之间摇摆

典型使用场景

  • 应用启动即崩溃:状态列快速在 Running 与 CrashLoopBackOff 之间切换,说明失败发生在启动早期
  • 配置错误确认:退避间隔逐渐拉长,观察日志的时间点比死盯状态列更有效
  • 区分偶发与持续故障:连续增长的重启计数与很久以前的一次重启含义完全不同
  • 依赖未就绪:数据库未启动时应用反复退出,修复依赖后重启计数不会再增长
  • 评估上线风险:把重启次数纳入发布后观察指标,能及早发现启动顺序类问题

观察与取证

观察与取证
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].restartCount}'   # 累计重启次数
kubectl get pod -w                                    # 观察 STATUS 与 RESTARTS 列的变化节奏
kubectl describe pod web-x | tail -20                 # 事件里会出现 Back-off restarting failed container
kubectl logs web-x --previous | tail -50              # 上一次崩溃前的日志,关键证据
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].lastState}'   # 上次终止原因与退出码

事件与字段读法

观察点含义指向
Back-off restarting failed containerkubelet 正在按退避节奏重试容器启动后快速退出,需要看应用自身日志
lastState.terminated.exitCode上一次退出的退出码137 多为被内核或 kubelet 终止,1 多为应用自身报错退出
lastState.terminated.reason终止原因OOMKilled、Error、Completed 各有对应处置
restartCount 增长速率失败频率快速递增说明启动早期就失败,缓慢递增更像运行中被杀
重启计数是 Pod 生命周期内的累计值,只有重建 Pod 才会归零。判断服务当前是否稳定要看最近一段时间计数是否还在增长、以及状态是否已进入稳定的 Running。
Probe 失败导致的杀容器同样计入重启计数,且退避会一并生效。看到重启但应用日志干净时,先查 liveness 探针的历史失败事件,别只在代码里找崩溃原因。

易错点

  • 用 restartCount 直接判断健康:几十小时前的一次重启与持续增长是完全不同的结论,必须结合时间窗
  • 退避期内反复手删 Pod:既丢现场又打断观察节奏,根因修复前只会重复同一循环
  • 只看当前容器日志:崩溃后日志已被新容器覆盖,必须用 --previous 取上一次容器输出
  • 把 CrashLoopBackOff 当成平台故障:绝大多数情况是应用启动配置、依赖连接或探针设置问题

数据来源与参考

  • Kubernetes 官方文档 · 容器重启与退避
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌