首页 > 解决方案 > OpenShift:在应用程序关闭期间,Pod 过早终止为“不活动”

问题描述

上下文

我正在维护几个 Spring Boot Web 服务应用程序 (war),目前在四个相同的 Tomcat 实例上运行。

前面的负载均衡器使舒尔流量分布在四个实例中。

我们进行手动滚动部署。

在将实例关闭以进行升级之前,我们会将新流量从该实例中转移出去。然后,在终止应用程序之前,我们会为活动请求提供两分钟的宽限期。

问题

现在我正在将这些应用程序迁移到 OpenShift。这一切进展顺利,只是我很难让滚动部署工作令我满意。

谷歌搜索帮助我已经达到了一个基于:

起初这似乎可行,但事实证明 livenes 探针有时会启动并杀死 pod,即使 ShutdownHook 尚未完成。

如果我移除 livenes 探针,它会起作用,但我不认为这是一个真正的解决方案。

实验向我表明,一旦 ShutdownHook 暂停 Tomcat 连接器,执行器/健康端点就会以“连接被拒绝”响应 - 这是有道理的,但不是我需要的,因为它使 liveness 探针认为应用程序已死。

我曾尝试将执行器端点移动到另一个端口号,但这更糟,因为它们现在在关机开始时立即停止响应。

我认为这是由于执行器端点现在属于与我的主连接器不同的 Tomcat 连接器,并且不受我的主 Spring 应用程序上下文的控制。

你们中的任何人都可以告诉我如何在单独的端口号上停止执行器端点的关闭吗?

或任何其他建议 - 允许我:

标签: javaspring-bootkubernetesopenshift

解决方案


鉴于您只想在 pod 正常关闭时阻止流量进入您的 pod,您可以使用低就绪探测超时,当失败时,将您的 pod 从可服务 pod 列表中删除。然后增加你的 liveness probe timeout,让你的 pod 有足够的时间优雅地关闭,同时仍然有一个备用方案,以防你的 pod 真的被卡住了。

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-readiness-probes


推荐阅读