工作负载异常: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容器中设置postStart Hook脚本未退出:如果容器中postStart脚本仍在运行,则该容器不会被删除,对应Pod保持在Terminating状态。
- Pod存在Finalizers:Finalizers是一种允许在删除资源之前清理资源的机制。如果Pod有Finalizers,并且相关的清理操作被卡住或没有响应,则Pod将保持在Terminating状态。
- Pod设置了terminationGracePeriodSeconds优雅退出时间:Pod设置优雅退出时间后,结束Pod时会进入Terminating状态,等待容器优雅退出后将会自动删除。
解决方法
强制删除Pod可能会产生数据不一致、业务容器异常退出等风险,尤其是强制删除StatefulSet的Pod,请您合理评估可能存在的业务风险后执行该操作。详情请参见强制删除StatefulSet中的Pod。
无论各种方式生成的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
特殊场景
如果Pod中配置了postStart Hook脚本,如果在脚本未退出的情况下强制删除Pod,Pod会被删除但是节点上的容器会仍处于运行状态,您可在Pod所在节点上执行强制删除容器命令,同步清理残留容器。强制删除容器命令如下,其中<containerId>需要替换为待清理的容器ID。
- 节点使用docker运行时:
docker rm -f <containerId>
- 节点使用containerd运行时:
crictl rm -f <containerId>