背景
Kubernetes 作为当前流行的容器编排平台,在大规模应用的场景中被广泛应用,但是在使用过程中也会遇到一些不可避免的问题。其中一个常见的问题是 Pod 卡在 Terminating 状态,无法被删除。
问题描述
当 Kubernetes 集群中的 Pod 被删除时,Kubernetes 会向相应的容器发送信号,通知它们停止运行并释放资源。但是,有时会出现这样的情况:Pod 的容器进程结束了,但 Pod 状态仍然显示为 Terminating,而且这种状态可能持续很长时间,很难得到解决。
原因分析
Pod 卡在 Terminating 状态的原因很多,有可能是因为网络问题、存储引擎问题,也有可能是因为 Pod 中的某个容器进程没有正常退出导致 Pod 状态一直处于 Terminating。其中比较常见的情况是:Pod 中的某个容器进程退出时,Kubernetes 并不能立即检测到该进程的退出,这时就会导致 Pod 状态一直处于 Terminating。
解决方法
方法一:等待 Kubernetes 自动删除 Pod
Kubernetes 在删除 Pod 时会尝试等待一段时间,如果 Pod 的状态仍然为 Terminating,则会强制删除该 Pod。因此,我们可以尝试等待一段时间,看看 Pod 是否会被 Kubernetes 自动删除。
方法二:手动删除卡住的容器
如果 Pod 无法被自动删除,则可以手动删除 Pod 中卡住的容器。具体步骤如下:
进入要删除的 Pod 所在的 Node。
执行以下命令,获取 Pod 的 ID 和容器的 ID:
kubectl get pod <pod-name> -o jsonpath='{.metadata.uid}' kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].containerID}' | cut -d/ -f3
执行以下命令,使用
docker ps
来确定容器是否真正结束:ssh <node-name> sudo docker ps | grep <container-id>
如果容器依然在运行状态,则需要手动杀死该容器:
sudo docker stop <container-id>
然后,回到控制台,通过以下命令删除 Pod:
kubectl delete pod <pod-name>
方法三:重启 kubelet 服务
如果上述方法都没有解决问题,则可以尝试重启 kubelet 服务。kubelet 是 Kubernetes Node 上的核心组件之一,负责管理 Pod 的启动、监测、健康检查等任务。重启 kubelet 服务可能会帮助解决 Pod 卡在 Terminating 状态的问题。
执行以下命令重启 kubelet 服务:
sudo systemctl restart kubelet
方法四:将Pod中需要远程卸载的PVC发出服务请求
有时候 Pod 卡在 Terminating 状态的原因是因为 Pod 中的 PVC 无法被卸载。可以通过查看 PVC 对应的 StorageClass 的 provisioner 和 workload 类型以及 backend 存储的 API 来检查 PVC 是否存储卷是否被正常卸载。如果存储卷无法被卸载,那么就可以将 PVC 发出服务请求到云端 StorageClass 来强制删除系统中阻止请求的未卸载 PVC,以便正常删除 Pod。
代码示例如下:
-- -------------------- ---- ------- ----------- -- ----- ------- --------- ----- ----------------------- ----- ----- ------------ ------------- --------------------------------------- --------- ---- ------- ------ - ----- ---- ----- -- --------- --- ----------- --
总结
Pod 卡在 Terminating 状态是一个常见的问题,出现这种问题后需要根据实际情况进行排查,常见的解决方法包括等待自动删除、手动删除卡住的容器、重启 kubelet 服务以及发送服务请求到存储后台等。在进行 Kubernetes 开发和运维时,应该具备基本的排障能力,及时解决问题并保障系统的可靠性和稳定性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6469318d968c7c53b0935b82