【问题标题】:Gracefully stopping a Java process in a pod in Kubernetes?在 Kubernetes 的 pod 中优雅地停止 Java 进程?
【发布时间】:2020-12-22 22:59:40
【问题描述】:

我已阅读docs 上关于在 Kubernetes 中优雅终止 pod,但我不太确定如何映射我优雅地关闭 Java 进程的具体用例。

我想做的是在终止过程中运行以下 bash 命令:

$ kill -SIGTERM `pidof java`

我试过了:

...    
lifecycle:
    preStop:
      exec:                
        command: ["kill", "-SIGTERM", "`pidof java`"]
...

但是当我停止 pod (kubectl stop pod pod-xxx) 时,Java 关闭挂钩似乎没有启动,但什么也没发生。我怀疑kill 命令的pidof java 部分不起作用(但我不确定)。我将如何在 Kubernetes 中做到这一点?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    我在容器内启动了一个 bash shell,然后执行了我的命令,结果证明它可以工作:

    command: ["/bin/bash", "-c", "PID=`pidof java` && kill -SIGTERM $PID && while ps -p $PID > /dev/null; do sleep 1; done;"]
    

    没有/bin/bash,我无法正常工作。

    【讨论】:

      【解决方案2】:

      我不能说为什么你的脚本没有做任何事情。也许命令不在容器中,也许你应该尝试使用完整路径(/bin/kill)?

      但是,kubernetes 会在应用程序停止时向应用程序发送 SIGTERM,因此您的脚本不会有任何改进。之后它会等待终止GracePeriodSeconds 并执行强制终止。

      https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/user-guide/production-pods.md#lifecycle-hooks-and-termination-notice

      【讨论】:

      【解决方案3】:

      它适用于我的 Kubernetes 环境,我的 java 进程的 8 - PID:

            lifecycle:
              preStop:
                exec:
                  # SIGTERM triggers a gracefully terminate
                  command: ["sh", "-c", "kill 8",]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 2011-03-12
        • 2019-11-10
        • 2016-05-28
        • 1970-01-01
        • 2020-04-07
        相关资源
        最近更新 更多