java - OpenShift:在应用程序关闭期间,Pod 过早终止为“不活动”
问题描述
上下文
我正在维护几个 Spring Boot Web 服务应用程序 (war),目前在四个相同的 Tomcat 实例上运行。
前面的负载均衡器使舒尔流量分布在四个实例中。
我们进行手动滚动部署。
在将实例关闭以进行升级之前,我们会将新流量从该实例中转移出去。然后,在终止应用程序之前,我们会为活动请求提供两分钟的宽限期。
问题
现在我正在将这些应用程序迁移到 OpenShift。这一切进展顺利,只是我很难让滚动部署工作令我满意。
谷歌搜索帮助我已经达到了一个基于:
- 基于执行器/健康端点的就绪探针和活性探针。
- 一个自定义的 HealthIndicator bean,允许我以编程方式切换执行器/健康端点以响应 HTTP-503 (OUT_OF_SERVICE)。
- 一个 ShutdownHook 调用时将:
- 将 HealthIndicator 切换为 OUT_OF_SERVICE。
- 等待 30 秒,让 Kupernetes 实现 OUT_OF_SERVICE 状态并分流新流量。
- 暂停 Tomcat 连接器并为活动请求提供两分钟的宽限期。
起初这似乎可行,但事实证明 livenes 探针有时会启动并杀死 pod,即使 ShutdownHook 尚未完成。
如果我移除 livenes 探针,它会起作用,但我不认为这是一个真正的解决方案。
实验向我表明,一旦 ShutdownHook 暂停 Tomcat 连接器,执行器/健康端点就会以“连接被拒绝”响应 - 这是有道理的,但不是我需要的,因为它使 liveness 探针认为应用程序已死。
我曾尝试将执行器端点移动到另一个端口号,但这更糟,因为它们现在在关机开始时立即停止响应。
我认为这是由于执行器端点现在属于与我的主连接器不同的 Tomcat 连接器,并且不受我的主 Spring 应用程序上下文的控制。
你们中的任何人都可以告诉我如何在单独的端口号上停止执行器端点的关闭吗?
或任何其他建议 - 允许我:
- 分流新流量。
- 为活动请求提供 2 分钟的宽限期。
- 同时允许 livenes 探测知道应用程序正在关闭,但没有死。
解决方案
鉴于您只想在 pod 正常关闭时阻止流量进入您的 pod,您可以使用低就绪探测超时,当失败时,将您的 pod 从可服务 pod 列表中删除。然后增加你的 liveness probe timeout,让你的 pod 有足够的时间优雅地关闭,同时仍然有一个备用方案,以防你的 pod 真的被卡住了。
推荐阅读
- java - java - 如何在java中返回二维数组方法的平均分数?
- reactjs - React - 另一个组件中的组件
- java - 我想将具有动态属性的对象保存为 Sqlite 中的字节 [] 或原始数据,并将其作为对象从 Sqlite 加载
- sql-server - 如何每天分组过去 30 天的销售额
- ios - 属性更改后在 SwiftUI 中更新列表
- javascript - 具有固定和的随机整数
- github - 如何将 Dependabot 与私有包一起使用
- excel - 计算逗号分隔列表的第一个值和最后一个值之间的差异
- python - 如何从 django rest 框架中的父模型中具有外键的子模型中过滤字段?
- pandas - Pandas:ValueError 使用 `at` 进行迭代