java - OpenShift:在应用程序长时间关闭期间,Pod 提前终止为 "not alive"

标签 java spring-boot kubernetes openshift

上下文

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

前面的负载均衡器使 Shure 流量分布在四个实例上。

我们进行手动滚动部署。

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

问题

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

通过谷歌搜索寻求帮助,我找到了基于以下内容的解决方案:

  • 基于执行器/运行状况端点的就绪探针和 active 探针。
  • 自定义 HealthIndicator bean,允许我以编程方式切换执行器/运行状况端点以使用 HTTP-503 (OUT_OF_SERVICE) 进行响应。
  • 一个 ShutdownHook,调用时将:
    • 将 HealthIndicator 切换为 OUT_OF_SERVICE。
    • 等待 30 秒,让 Kupernetes 意识到 OUT_OF_SERVICE 状态并转移新流量。
    • 暂停 Tomcat 连接器并为 Activity 请求提供两分钟的宽限期。

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

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

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

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

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

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

或者任何其他建议——允许我:

  • 转移新流量。
  • 为主动请求提供 2 分钟的宽限期。
  • 同时允许 livenes 探针知道应用程序正在关闭,但并未死亡。

最佳答案

鉴于您只想在 pod 执行正常关闭时阻止流量进入您的 pod,您可以使用较低的就绪探测超时,以便在发生故障时将您的 pod 从可服务 pod 列表中删除。然后增加你的 active 探测超时,让你的 Pod 有足够的时间正常关闭,同时在你的 Pod 真正卡住的情况下仍然有后备。

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

关于java - OpenShift:在应用程序长时间关闭期间,Pod 提前终止为 "not alive",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960034/

相关文章:

java - 在 Android 上捕获和拦截 ACTION_SEND Intent

java - Spring MVC 3 ModelView 提交后始终为 Null

java - 运行 Spring Boot APP 时出现 Spring Boot 问题

java - Spring Rest 模板覆盖 Authorization header 值

kubernetes - kube-dns 不断在 coreos 上使用 kubernetes 重新启动

java - Artifactory 丢失 jar 的默认存储库

java - 从大文件中选择随机元素时出现 NumberFormatException

spring-boot - Zuul代理向请求url添加参数

kubernetes - 错误 {"message":"failure to get a peer from the ring-balancer"} 使用 kong 入口

kubernetes - Keycloak 网守 HTTP 502/10 秒后超时