按照 k8s 的文档, 如果没有指定的话, k8s 应该会向要终止的 pod 默认发一个 SIGTERM 才对, 结果每次我的 pod 都会被超时强杀.
然后我自己起了个 alpine 放个 sh 脚本试了一下, 发现确实完全没有收到 SIGTERM, 手动用 kill 发是可以收到的, 这时我怀疑 k3s 根本就没有发信号.
我又试了一下, 在 Dockerfile 里手动指定了 STOPSIGNAL, 这样才会在终止时发送信号.
我不确定是我操作错了, 还是说这个是 k3s 的 bug, 所以来这里问一下大佬.
1
kennylam777 2023-01-17 00:59:03 +08:00
你的 sh script 是 PID 1 嗎?
|
2
baka 2023-01-17 01:28:41 +08:00
如果 shell 里启动了子进程,不会将 SIGTERM 信号传递给子进程,超时就被 kill -9
可以 exec 启动你的子进程,替换 shell 进程上下文;或者 trap 显示捕获 SIGTERM |
3
julyclyde 2023-01-17 09:15:00 +08:00
那是你启动方式有问题
收到信号的是 sh 你应该在启动脚本末尾 exec 实际干活的程序,而不是 call 实际干活的程序 |
4
bootvue 2023-01-17 09:23:25 +08:00
tini
|
5
littlezzll 2023-01-17 09:59:06 +08:00 via Android
tini or dumb-init
|
6
luvroot 2023-01-17 10:30:31 +08:00
|
7
Kawa OP |
8
Kawa OP @baka 我的主楼里提到了我创建了一个测试用的 pod, 里面只有几行
trap "echo sigterm;exit" SIGTERM 实际测试时, 除非在 dockerfile 里明确指定要发送 SIGTERM, 否则这个脚本什么都不会收到 |
9
Kawa OP |
10
Kawa OP @kennylam777 @baka @julyclyde @bootvue @littlezzll @luvroot
谢谢各位的回复, 我在做测试镜像的时候重试了一下, 突然发现了盲点. 原来我出问题的镜像的 base 镜像里面已经指定了 STOPSIGNAL 为 SIGQUIT, 所以我才没办法收到 SIGTERM 信号. 这下大乌龙了 |
11
julyclyde 2023-01-17 15:59:20 +08:00
那你的程序收到 SIGQUIT 了吗?按说也没收到才对
|