【问题标题】:Kubernetes graceful shutdown of a Spring Boot Tomcat applicationKubernetes 优雅关闭 Spring Boot Tomcat 应用程序
【发布时间】:2019-10-11 08:31:04
【问题描述】:

我在 Kubernetes 集群中的 Tomcat 上运行 Java Spring Boot 启动应用程序,我正在使用生命周期挂钩在容器终止之前关闭 Tomcat。还定义了 30 秒的终止宽限期。

预期行为:当我杀死 pod 或删除部署时,tomcat 会正常关闭。

实际行为:tomcat 突然关闭。

lifecycle:
          preStop:
            exec:
              command:
              - /usr/local/tomcat/bin/catalina.sh

有人可以帮忙吗?

【问题讨论】:

  • 是嵌入式tomcat容器还是部署在Tomcat镜像中的Boot war?
  • @Muralidharan.rade 它的 tomcat 容器
  • 看看下面的答案是否有效..

标签: tomcat kubernetes


【解决方案1】:

在 Kubernetes 中,preStop 钩子在 Pod 终止之前执行。

对于上述用例,当删除 pod/deployment 时,必须在 pod 终止之前正常关闭 tomcat 进程。

以下示例 pod 定义通过在 pod 终止之前正常关闭 tomcat 服务器来工作。 注意:此定义中的容器为FROM tomcat:9.0.19-jre8

apiVersion: v1 
kind: Pod 
metadata:
  name: demopod
spec:
  containers:
  - image: demo:web
    name: demo-container
    ports:
    - containerPort: 8080
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Stopping server > /usr/share/message1; sleep 10; sh /usr/local/tomcat/bin/catalina.sh stop"]

在上面的定义文件中,我们运行三个命令(根据需要更改)。

  1. 将关闭消息写入 /usr/share/message1

  2. sleep 10(只是为了给时间查看 pod/container 日志)

  3. 运行Catalina.sh stop脚本来停止tomcat服务器。

调试: 对于 PreStop,如果处理程序失败,则会广播一个事件,即 FailedPreStopHook 事件。你可以通过运行kubectl describe pod <pod_name>查看这些事件

请参阅以下帖子以获取更详细的说明: http://muralitechblog.com/kubernetes-graceful-shutdown-of-pods/

关机日志:

【讨论】:

  • 您能否在调试部分解释一下我们如何确保 pod 正常终止。
  • 我想你想验证你的应用程序进程是否正常停止。如解释的那样,你可以包含一个睡眠命令并观察你的应用程序/tomcat 在 Pod 终止之前停止了。
【解决方案2】:

这是关于优雅时期概念的常见错误。人们认为如果他们设置了一个 30 秒的宽限期,那么在删除 pod 时,它会等待 30 秒,这是错误的。

宽限期实际上是为了杀死一个 pod,而不是让它活着。如果你有一个应用程序在 1 秒内关闭,你可以设置任何宽限期,但 pod 会在 1 秒内死掉。如果超过了宽限期,它将杀死 pod(通过发送 SIGKILL)。

因此,您可以设置一个宽限期,让 pod 永远不处于终止状态(并在一定时间后将其终止),而不是在删除 pod 后保持 pod 运行直到一定时间。希望这是有道理的。

如果一切设置正确,您 preStop 可能会运行,但这取决于您在做什么来查看结果。例如,您看不到日志,除非您已将它们持久化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 2016-06-09
    • 2019-09-26
    • 2020-06-02
    • 2016-06-17
    • 2020-03-13
    • 2019-02-23
    相关资源
    最近更新 更多