我正在运行带有 RHEL7.8 BareMetal 计算节点的 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/运行应用程序/强制删除-stateful-set-pod/
如果您想避免 Pod 在击落节点时被卡住,您应该尝试安全地耗尽节点:
您可以使用
安全地从 pod 中驱逐所有 pod 在节点上执行维护之前(例如内核升级, 硬件维护等)。安全驱逐允许 Pod 的容器 优雅地终止并尊重kubectl drain
您已指定。PodDisruptionBudgets
当
成功返回时,表明所有 豆荚已被安全驱逐(尊重所需的优雅 终止期,并尊重您所拥有的kubectl drain
定义)。然后可以安全地通过断电来关闭节点 物理机,或者,如果在云平台上运行,则删除其 虚拟机。PodDisruptionBudget
另请注意,如果发生驱逐被困:
中止或暂停自动化操作。调查应用程序卡住的原因,然后重新启动自动化。
经过适当长时间的等待后,
Pod 从集群的控制平面中退出,而不是使用驱逐 API。DELETE
Kubernetes 没有指定在这种情况下应该采取什么行为; 由应用程序所有者和集群所有者建立一个 就这些情况下的行为达成一致。
为了调查卡住的 Pod,您可以:
使用
kubectl logs ${POD_NAME}
检查 Pod 日志
kubectl describe pod
并检查其“活动”部分
更多详细信息可以在链接文档中找到。
也许您可以检查您的 pod 是否定义了“终结器”。有时,pod 不会“终止”,因为它正在等待“终结器”操作完成,但情况是终结器因任何原因都无法运行
如果是这样,您可以尝试编辑 pod 并删除“finalizer”部分,看看您的 pod 是否真的消失了
当然,这样做可能会让您的应用程序处于不良状态,具体取决于终结器应该做什么
一些链接: