更新时间:2024-11-13 GMT+08:00
工作负载异常:Pod一直处于Terminating状态
问题描述
查询某个命名空间下的工作负载时,偶现部分Pod(实例)一直处于Terminating 状态。
例如,查询aos命名空间下的Pod:
#kubectl get pod -n aos
NAME READY STATUS RESTARTS AGE
aos-apiserver-5f8f5b5585-s9l92 1/1 Terminating 0 3d1h
aos-cmdbserver-789bf5b497-6rwrg 1/1 Running 0 3d1h
aos-controller-545d78bs8d-vm6j9 1/1 Running 3 3d1h
通过kubectl delete pods <podname> -n <namespace> 命令始终无法将其删除:
kubectl delete pods aos-apiserver-5f8f5b5585-s9l92 -n aos
问题根因
Pod出现Terminating 状态的原因可能有多种,以下是一些常见的情况:
- 节点异常:在节点处于“不可用”状态时,CCE会迁移节点上的容器实例,并将节点上运行的Pod置为Terminating状态。
待节点恢复后,处于Terminating状态的Pod会自动删除。
- 容器无响应:如果Pod中的容器在终止过程中没有响应SIGTERM信号,则可能导致Pod卡在Terminating状态。
- Pod中存在未处理完的请求或资源占用:如果Pod中存在长时间运行的进程没有结束,则可能导致Pod无法被正常终止,进入Terminating状态。
- Pod存在Finalizers:Finalizers是一种允许在删除资源之前清理资源的机制。如果Pod有Finalizers,并且相关的清理操作被卡住或没有响应,则Pod将保持在Terminating状态。
- Pod设置了terminationGracePeriodSeconds优雅退出时间:Pod设置优雅退出时间后,结束Pod时会进入Terminating状态,等待容器优雅退出后将会自动删除。
解决方法
强制删除Pod可能会产生数据不一致、业务容器异常退出等风险,尤其是强制删除StatefulSet的Pod,请您合理评估可能存在的业务风险后执行该操作。详情请参见强制删除StatefulSet中的Pod。
无论各种方式生成的Pod,均可以使用如下命令强制删除:
kubectl delete pod <pod> -n <namespace> --grace-period=0 --force
因此对于上面的Pod,只要执行如下命令即可删除:
kubectl delete pod aos-apiserver-5f8f5b5585-s9l92 -n aos --grace-period=0 --force