我正在运行带有 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/
答案 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}
kubectl describe pod
并检查其事件部分
可以在链接的文档中找到更多详细信息。
答案 1 :(得分:0)
也许您可以检查您的 pod 是否定义了“终结器”。有时 Pod 不会“终止”,因为它正在等待“终结器”操作完成,但情况是终结器因任何原因无法运行
如果是这样,您可以尝试编辑 pod 并删除“finalizer”部分,看看您的 pod 是否真的消失了
当然,这样做可能会使您的应用程序处于不良状态,具体取决于终结器应该做什么
一些链接: