当前位置: 首页 > 知识库问答 >
问题:

OpenShift:在应用程序长时间关闭期间,Pod因“不活动”而提前终止

茅炯
2023-03-14

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

前面的一个负载均衡器使得shure trafic分布在四个实例中。

我们做手动滚动部署。

在取下一个实例进行升级之前,我们会转移新的流量。然后,在终止应用程序之前,我们给活动请求两分钟的宽限期。

通过谷歌搜索帮助,我找到了一个基于以下基础的解决方案:

  • 基于执行器/健康endpoint的就绪性探针和活性探针。
  • 一个自定义的HealthIndicator bean,允许我以编程方式切换执行器/健康endpoint以响应HTTP-503(OUT_OF_SERVICE)。
  • ShutdownHook,调用该ShutdownHook时将:
    • 将HealthIndicator切换为out_of_service。
    • 等待30秒,允许Kupernetes实现OUT_OF_SERVICE状态并转移新流量。
    • 暂停Tomcat连接器并给予活动请求两分钟的宽限期。

    一开始这似乎是有效的,但事实证明livenes探测器有时会踢进并杀死吊舱,即使关闭吊钩还没有完成。

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

    实验告诉我,一旦ShutdownHook暂停Tomcat连接器,执行器/健康endpoint就会以“Connection Refired”响应--这是有道理的,但不是我需要的,因为它会使活跃度探测器认为应用程序已死亡。

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

    我假设这是由于执行器endpoint现在属于与主连接器不同的Tomcat连接器,并且不在主Spring应用程序上下文的控制下造成的。

    你们谁能告诉我,在单独的端口号上时,如何停止执行器endpoint的关闭?

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

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

共有1个答案

锺离嘉容
2023-03-14

如果您只想防止通信流在pod执行正常关闭时到达pod,您可以使用低就绪探测超时,当故障发生时,它将从可用pod列表中删除您的pod。然后增加你的活性探测超时,让你的吊舱有足够的时间优雅地关闭,同时仍然有一个后退,以防你的吊舱真的被卡住了。

https://kubernetes.io/docs/tasks/configure-pod-container/configure-livenesse-readity-probes/#define-readity-probes

 类似资料:
  • 我有一个Spring Boot应用程序,它有一些外部依赖(例如,项目之外的文件,需要存在,以便应用程序正确启动)。 和一系列其他例外。有没有一种方法可以恰当地做到这一点?

  • 询问代码的问题必须证明对所解决问题的理解程度最低。包括尝试的解决方案、为什么不起作用以及预期的结果。另请参见:堆栈溢出问题检查表 我敢肯定,上面的程序不是无限循环的。我用进行了测试,得到了想要的结果 我不明白为什么我的CPU要花很长时间来运行它。 编辑:ProjectEuler的我的代码。网络问题3。

  • 我可以通过firebase FCM打开活动,但这只适用于android

  • 我只是在我的一个android应用程序上实现admob。我请求admob在应用程序菜单屏幕上显示间隙广告。但在那个时候,如果我退出应用程序

  • 问题内容: 我在询问用户名和密码时有一个小框。单击主窗口中的按钮将打开该框架。 然后,我有两个按钮:确定和取消。 当我单击“取消”按钮时,我需要关闭此框架而不退出应用程序。 我怎样才能做到这一点? 问题答案: 您可以使用Frame.hide()或Frame.dispose()。我还建议研究JDialog或JOptionPane 更正:hide()已过时。应该使用SetVisible(false)代

  • 当用户在我的通知中单击一个按钮时,我正试图打开,而该应用程序仅在后台运行并提供服务。单击按钮时,这些行在类中被触发: 我已经检查过了,这些行被触发了,所以对按钮的点击做出反应没有问题,但是不会打开。 有什么建议吗?为什么这对我不起作用,我怎么能让它起作用? 我被要求提供更多的代码,因此在我的