一直终止中是什么
对象已经收到删除请求,但迟迟没有真正消失。终止不是一步到位的:要先等待容器优雅退出,再由控制器清理自己登记的终结器,最后对象才被移除。任何一个环节没有完成,对象就会停留在这个状态。它显示的是「正在删」,而不是「删不掉」。
常见的三类卡点
第一类是终结器未被处理:由控制器登记的清理标记需要该控制器来消除,控制器异常或逻辑阻塞时会一直等下去。第二类是节点失联:节点上的组件无法上报,终止流程收不到确认。第三类是卷卸载或存储接口无响应,导致清理无法完成。三者的处理方式完全不同。
基本信息
| 适用环境 | 任何 Kubernetes 发行版 |
|---|---|
| 触发方式 | 删除对象或控制器缩容 |
| 正常流程 | 等待优雅退出、清理终结器、移除对象 |
| 关键字段 | 对象的终结器列表与删除时间戳 |
| 常见卡点 | 终结器未处理、节点失联、存储卸载阻塞 |
| 强制手段 | 跳过优雅流程直接移除对象,有副作用 |
典型使用场景
- 节点故障后清理:节点失联导致对象长期停在终止状态
- 控制器异常:登记了终结器的控制器未运行,清理无人处理
- 存储接口阻塞:卷卸载无响应,对象无法完成终止
- 缩容异常:实例迟迟不退,副本数停留在中间值
- 重复部署受阻:同名对象还在终止中,新对象无法创建
- 演练验证:确认强制移除的副作用与恢复流程
先定位再处理
先定位再处理
kubectl get pod web-x -o jsonpath='{.metadata.finalizers}' # 谁在阻止清理
kubectl get pod web-x -o jsonpath='{.metadata.deletionTimestamp}' # 删除请求时间
kubectl describe pod web-x | tail -20 # 末尾的事件与状态
kubectl get nodes # 节点是否失联
kubectl get events --field-selector involvedObject.name=web-x --sort-by=.metadata.creationTimestamp卡点与处理方向
| 卡点 | 判断依据 | 处理方向 |
|---|---|---|
| 终结器未处理 | 对象终结器列表非空且长期不变 | 恢复对应控制器或按其流程清理 |
| 节点失联 | 对象所在节点状态异常 | 先恢复节点,再处理残留对象 |
| 存储卸载阻塞 | 事件里有卷相关报错 | 排查存储接口与卷状态 |
| 处理完仍需清理 | 确认无状态依赖后 | 使用强制移除并接受副作用 |
确认后再强制移除
确认后再强制移除
kubectl delete pod web-x --grace-period=0 --force # 仅在确认副作用可接受时使用节点失联时强制移除对象,节点恢复后旧容器可能仍在运行并与新实例并存,出现两个实例同时写同一份数据。
由控制器登记的终结器应由该控制器消除,手工清理可能跳过必要的下游资源回收步骤。