OpenShift:在关闭应用程序的过程中,Pod过早地终止为“未激活”

时间:2019-03-02 15:20:50

标签: java spring-boot kubernetes openshift

上下文

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

前面的负载均衡器可以使交通流量分散到这四个实例中。

我们进行手动滚动部署。

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

问题

现在,我正在将这些应用程序迁移到OpenShift。一切都进行得很好,除了我很难使滚动部署工作满意为止。

谷歌搜索寻求帮助,我基于以下方法找到了解决方案:

  • 基于执行器/健康终点的就绪性探针和活动性探针。
  • 自定义的HealthIndicator Bean,允许我以编程方式切换执行器/运行状况终结点以响应HTTP-503(OUT_OF_SERVICE)。
  • ShutdownHook,在调用时将:
    • 将HealthIndicator切换到OUT_OF_SERVICE。
    • 等待30秒,以允许Kupernetes实现OUT_OF_SERVICE状态并转移新流量。
    • 暂停Tomcat连接器,并向活动请求提供2分钟的宽限期。

乍一看这似乎可行,但事实证明,即使ShutdownHook尚未完成,Livenes探测器有时仍会插入并杀死吊舱。

如果我删除了livenes探针,那么它可以工作,但我认为这不是真正的解决方案。

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

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

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

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

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

  • 转移新流量。
  • 给予主动请求2分钟的宽限期。
  • 同时允许livenes探针知道该应用程序正在关闭,但尚未终止。

1 个答案:

答案 0 :(得分:1)

鉴于您只是想防止流量在执行正常关机时进入您的Pod,可以使用较低的“就绪”探测超时,如果超时,则将其从可用Pod列表中删除。然后增加活动探测超时时间,以使吊舱有足够的时间优雅地关闭,同时仍然保留备用,以防吊舱真正卡住。

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