在Kubernetes的pod中优雅地停止Java进程?

时间:2015-11-09 16:19:42

标签: kubernetes

我已经阅读了docs关于Kubernetes中pod的优雅终止,但我不太确定如何映射我正常关闭Java进程的特定用例。

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

$ kill -SIGTERM `pidof java`

我试过这个:

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

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

3 个答案:

答案 0 :(得分: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,我无法让它发挥作用。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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