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