我已经阅读了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中做到这一点?
答案 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并且它将执行强制终止。
答案 2 :(得分:0)
它适用于我的 Kubernetes 环境,8 - 我的 java 进程的 PID:
lifecycle:
preStop:
exec:
# SIGTERM triggers a gracefully terminate
command: ["sh", "-c", "kill 8",]