Kubernetes 常见问题解决之:Pod 卡在 Terminating 状态

阅读时长 4 分钟读完

背景

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 中卡住的容器。具体步骤如下:

  1. 进入要删除的 Pod 所在的 Node。

  2. 执行以下命令,获取 Pod 的 ID 和容器的 ID:

  3. 执行以下命令,使用 docker ps 来确定容器是否真正结束:

  4. 如果容器依然在运行状态,则需要手动杀死该容器:

  5. 然后,回到控制台,通过以下命令删除 Pod:

方法三:重启 kubelet 服务

如果上述方法都没有解决问题,则可以尝试重启 kubelet 服务。kubelet 是 Kubernetes Node 上的核心组件之一,负责管理 Pod 的启动、监测、健康检查等任务。重启 kubelet 服务可能会帮助解决 Pod 卡在 Terminating 状态的问题。

执行以下命令重启 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

纠错
反馈