Pod 卡在 Terminating:finalizer 与节点异常的双层排查
【摘要】 一次发布后 Pod 长时间停留在 Terminating。本文从 finalizer、节点状态和控制器日志三个方向还原排查过程,给出可验证的修复顺序与防止误删的检查清单。
现象
一次夜间发布后,业务 Pod 已停止接收流量,却持续 Terminating 二十分钟。kubectl get pod 仍能看到实例,Deployment 副本数也降不下来。此时不要先 force delete,否则会掩盖 finalizer、容器事件和外部资源状态。
排查
Terminating 通常卡在两个环节:kubelet 终止容器,以及 metadata.finalizers 清空。先查:
kubectl get pod <pod> -n <ns> -o jsonpath='{.metadata.deletionTimestamp}{"\n"}{.metadata.finalizers}{"\n"}'
kubectl describe pod <pod> -n <ns>
kubectl get node <node>
本次 deletionTimestamp 已存在,finalizer 中有 storage-cleanup;节点同时 NotReady。kubelet 无法完成容器清理,控制器也没有在异常分支移除 finalizer,两个等待叠加,改 Deployment 副本数无效。
根因与修复
控制器日志显示,释放网络存储时返回临时错误。代码把删除 Pod 和释放存储放在一次 reconcile,只监听对象事件;节点失联后事件不稳定到达,清理一直没有完成。
先确认存储资源已释放或可安全重建,再移除阻塞 finalizer:
kubectl patch pod <pod> -n <ns> --type=merge -p '{"metadata":{"finalizers":[]}}'
该命令必须核对外部资源后使用。应用侧应把清理改成幂等操作:成功才移除 finalizer,失败按退避时间重新入队,并设置最大等待时间。非必要的收尾不应长期阻塞 Pod 删除。
预防
为 Terminating 超过五分钟的 Pod 告警;测试节点 NotReady、控制器重启和重复 reconcile;force delete 只能在确认无外部依赖后作为最后手段。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)