如何使用 Minikube 在 pod 中捕获 SIGTERM

How to catch SIGTERM in a pod with Minikube

我使用的是有史以来最简单的docker:

FROM ubuntu
COPY script.sh /script.sh
CMD /script.sh

脚本所做的全部是:

#!/bin/bash

function sigterm() {
    echo "Got SIGTERM"
    exit
}

trap sigterm SIGTERM

i=1
while true; do
    echo "$(date +%H:%M:%S) | $((i++)) | $HOSTNAME"
    sleep 1
done

我运行在 Minikube 中安装这个容器,但我无法让它从 kubernetes 捕获任何 SIGTERM。

我尝试删除 pod/deployment 或将其放大或缩小。在任何情况下,它在被删除之前都不会收到 SIGTERM。它尊重 terminationGracePeriodSeconds 但似乎没有 运行 preStop 命令或在杀死 pod 之前发送 SIGTERM。

是因为使用了 minikube 吗?还是我做错了什么?

(部署不是服务的一部分,它只是一个部署) (SSH 进入 pod 并手动 kill-ing 它按预期工作)

阅读the Dockerfile documentation on CMD

The CMD instruction has three forms:

  • CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  • CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  • CMD command param1 param2 (shell form)

If you use the shell form of the CMD, then the will execute in /bin/sh -c

所以你使用的是shell形式,也就是说你的命令是/bin/sh -c script.sh。然后,当 kubernetes 向容器发送 SIGTERM 时,接收信号的不是 script.sh 进程,而是 /bin/sh 进程。这就是为什么您看不到“收到 SIGTERM”消息的原因。

创建 Dockerfile 时,请确保使用 exec 形式。否则应用程序将作为 /bin/sh -c 的子命令启动,不传递信号。容器的 PID1 将是 shell,您的应用程序将不会收到任何信号。

尝试更改您的 Dockerfile 以使用 exec 形式

FROM ubuntu
COPY script.sh /script.sh
CMD ["/script.sh"]