计算节点关闭后 Pod 卡在“正在终止”状态

时间:2021-01-21 09:02:35

标签: kubernetes openshift kubernetes-statefulset

我正在运行带有 RHEL7.8 裸机计算节点的 OCP4.6。 我们正在集群上运行功能和 HA 测试。 我们在这个集群上的主要应用是一个有大约 250 个 pod 的 StatefulSet。

关闭节点后,节点上运行的 Pod 进入 Terminating 状态,并卡在那里。 由于这是一个 StatefulSet,在原始 Pod 完成终止之前,Pod 无法在另一个节点上重新启动。

我可以使用 --force --grace-period=0 删除 Pod,但这不能解决我的问题。

这些 Pod 仅在关闭的服务器返回到 Ready 状态后才会终止。

有什么想法吗??

更新:

查看 k8s 的文档 - 我发现 StatefulSet pod 在节点关闭后不会终止的事实实际上是一种安全机制,实际上是一个功能:https://kubernetes.io/docs/tasks/run-application/force-delete-stateful-set-pod/

2 个答案:

答案 0 :(得分:0)

如果您想在击落 Node 时避免 Pod 卡住,您应该尝试Safely Drain a Node

<块引用>

您可以使用 kubectl drain 安全地从一个 在节点上执行维护(例如内核升级、 硬件维护等)。安全驱逐允许 pod 的容器 gracefully terminate 并将尊重 PodDisruptionBudgets 您已指定。

<块引用>

kubectl drain成功返回时,表示所有 豆荚已被安全驱逐(尊重所需的优雅 终止期限,并尊重您拥有的 PodDisruptionBudget 定义)。然后通过关闭节点电源来关闭节点是安全的 物理机,或者,如果在云平台上运行,删除其 虚拟机。

还要注意,在 Stuck evictions 的情况下:

<块引用>
  • 中止或暂停自动化操作。调查应用卡住的原因,并重新启动自动化。

  • 经过适当长时间的等待后,DELETE 集群控制平面中的 Pod,而不是使用驱逐 API。

Kubernetes 没有指定这种情况下的行为; 由应用程序所有者和集群所有者来建立一个 就这些情况下的行为达成一致。

为了调查卡住的 Pod,您可以:

  • 使用 kubectl logs ${POD_NAME}

    检查 Pod 的日志
  • kubectl describe pod 并检查其事件部分

  • Debug with container exec

可以在链接的文档中找到更多详细信息。

答案 1 :(得分:0)

也许您可以检查您的 pod 是否定义了“终结器”。有时 Pod 不会“终止”,因为它正在等待“终结器”操作完成,但情况是终结器因任何原因无法运行

如果是这样,您可以尝试编辑 pod 并删除“finalizer”部分,看看您的 pod 是否真的消失了

当然,这样做可能会使您的应用程序处于不良状态,具体取决于终结器应该做什么

一些链接:

相关问题