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

Gracefully stopping a Java process in a pod in Kubernetes?

我已经阅读了关于在 Kubernetes 中正常终止 pod 的 docs,但我不太确定如何映射我的特定用例以正常关闭 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 中执行此操作?

我不能说为什么你的脚本没有做任何事情。也许命令不在容器中,也许你应该尝试使用完整路径 (/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

我在容器内启动了一个 bash shell 并执行了我的命令,结果证明有效:

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

没有 /bin/bash 我无法让它工作。

它在我的 Kubernetes 环境中工作,8 - 我的 java 进程的 PID:

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