【问题标题】:Gracefully shutdown Spring application running in Kubernetes优雅地关闭在 Kubernetes 中运行的 Spring 应用程序
【发布时间】:2020-03-13 13:39:19
【问题描述】:

我在我的 Spring 应用程序中实现了正常关闭逻辑,如果我向 Java 进程发送 SIGTERM,它就可以在本地工作。

但是,当我在 Kubernetes 中运行它时,如果我删除了 pod 或部署了一个新 pod,则逻辑不会运行。首先我认为它发送的是 SIGKILL 而不是 SIGTERM 但正如我所研究的那样,Docker CMD 获取 SIGTERM 但不会将其委托给应用程序。应该如何正确运行?

现在我在我的 Dockerfile 中使用这个命令:

CMD [ "java", "-jar", "/app.jar" ]

【问题讨论】:

  • 使用preStop,看看为什么SIGTERM note delegated to app
  • @Oleg Butuzov 您能否扩展您的评论并将其作为答案发布?
  • @OlegButuzov 谢谢,我发现关于 SIGTERM 的文章未授权,但不幸的是我无法让它工作。你能解释一下如何编辑 Dockerfile 吗?我正在使用 Alpine 基础映像。

标签: java spring docker kubernetes


【解决方案1】:

你可以试试dumb-init 或类似的东西。给定链接上的 README 详细说明了“为什么需要初始化系统”。

【讨论】:

  • 谢谢,我想这就是我需要的!
【解决方案2】:

您可以使用容器处理程序进行正常关闭。 k8s 支持启动后和停止前的钩子作为容器处理程序。在 prestop 钩子中调用你的逻辑

【讨论】:

  • 我宁愿不使用钩子并依赖 SIGTERM 信号。如何编辑我的 Dockerfile 以使其获得委派?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2016-06-09
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
相关资源
最近更新 更多