在 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 并且它会强制终止。
我在容器内启动了一个 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",]
我已经阅读了关于在 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 并且它会强制终止。
我在容器内启动了一个 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",]