Terminating 卡住是什么
Pod 删除后长时间停留在 Terminating 状态,常见有四类原因:finalizer 没有被清理、卷卸载或网络清理失败、节点失联导致 kubelet 无法上报状态、进程不响应终止信号直到宽限期结束才被强制杀死。排查的关键是先确认卡在哪个环节——看对象里的删除时间戳与 finalizer、看节点状态、看节点侧日志,再决定是否要强制删除。
基本信息
| 查看方式 | kubectl get pod -o yaml 关注 deletionTimestamp 与 finalizers 字段 |
|---|---|
| 进程不退出 | 应用不处理终止信号,等满宽限期(默认 30 秒)后才被强制杀死 |
| 节点失联 | kubelet 无法上报状态,Pod 状态长期不变 |
| 卷与网络 | 卸载或网络资源清理失败,节点侧日志会有明确报错 |
| 强制删除 | --force --grace-period=0 是最后手段,可能留下孤儿进程 |
典型使用场景
- 滚动更新卡住:新版本一直等不到旧 Pod 退出,发布流程停在中间
- 节点故障后 Pod 长期 Terminating,占用资源配额与调度名额
- 有状态应用缩容时卡在最后一个 Pod,扩容与迁移都无法继续
- 带 finalizer 的控制器异常,对象一直无法完成删除
- 节点维护前需要确认 Pod 已彻底停止,避免两处进程同时写同一份数据
排查命令
排查命令
kubectl get pod web-1 -o jsonpath='{.metadata.finalizers}'
kubectl describe pod web-1 | grep -i terminating
kubectl get node node-1 # 节点失联时,其上的 Pod 常会卡住
kubectl get events -n dev --sort-by=.lastTimestamp | tail # 看最近事件里的失败原因
kubectl delete pod web-1 --force --grace-period=0 # 最后手段,评估影响后再执行原因与处置方向
| 现象 | 判断依据 | 处置方向 |
|---|---|---|
| finalizer 未清理 | 对象里 finalizers 字段仍有残留项 | 确认无实际资源占用后移除 finalizer |
| 进程不响应终止信号 | 到宽限期结束才被强杀 | 应用内处理终止信号并优雅退出 |
| 节点失联 | kubectl get node 显示节点不可用 | 先修节点,必要时清理失联节点上的 Pod |
| 卷卸载失败 | 节点侧日志有卸载相关报错 | 排查存储插件与后端存储状态 |
有状态应用的 Pod 强制删除存在脑裂风险:必须确认进程真的已经停止再操作,别把『删不掉』单纯当成管理层面的问题。
删除是两阶段过程:控制面先打上删除时间戳并把 Pod 标记为 Terminating,节点侧完成停止与资源清理后对象才真正消失。理解这个顺序有助于判断卡点在控制面还是节点侧。