k3s 貌似不会向要终止的 pod 发送 SIGTERM

2023-01-17 00:06:32 +08:00
 Kawa

按照 k8s 的文档, 如果没有指定的话, k8s 应该会向要终止的 pod 默认发一个 SIGTERM 才对, 结果每次我的 pod 都会被超时强杀.  
然后我自己起了个 alpine 放个 sh 脚本试了一下, 发现确实完全没有收到 SIGTERM, 手动用 kill 发是可以收到的, 这时我怀疑 k3s 根本就没有发信号.
我又试了一下, 在 Dockerfile 里手动指定了 STOPSIGNAL, 这样才会在终止时发送信号.

我不确定是我操作错了, 还是说这个是 k3s 的 bug, 所以来这里问一下大佬.

2009 次点击
所在节点    Kubernetes
11 条回复
kennylam777
2023-01-17 00:59:03 +08:00
你的 sh script 是 PID 1 嗎?
baka
2023-01-17 01:28:41 +08:00
如果 shell 里启动了子进程,不会将 SIGTERM 信号传递给子进程,超时就被 kill -9
可以 exec 启动你的子进程,替换 shell 进程上下文;或者 trap 显示捕获 SIGTERM
julyclyde
2023-01-17 09:15:00 +08:00
那是你启动方式有问题
收到信号的是 sh

你应该在启动脚本末尾 exec 实际干活的程序,而不是 call 实际干活的程序
bootvue
2023-01-17 09:23:25 +08:00
tini
littlezzll
2023-01-17 09:59:06 +08:00
tini or dumb-init
luvroot
2023-01-17 10:30:31 +08:00
Kawa
2023-01-17 11:06:49 +08:00
@kennylam777 必须是, 我直接写的 ENTRYPOINT ["/ENTRYPOINT.sh"].
我也进容器看了, 确实就是如此
Kawa
2023-01-17 11:08:37 +08:00
@baka 我的主楼里提到了我创建了一个测试用的 pod, 里面只有几行
trap "echo sigterm;exit" SIGTERM
实际测试时, 除非在 dockerfile 里明确指定要发送 SIGTERM, 否则这个脚本什么都不会收到
Kawa
2023-01-17 11:10:57 +08:00
@bootvue
@littlezzll
这些都试过, 确实无法收到终止信号
除非在 dockerfile 里明确指定
Kawa
2023-01-17 11:47:35 +08:00
@kennylam777 @baka @julyclyde @bootvue @littlezzll @luvroot
谢谢各位的回复, 我在做测试镜像的时候重试了一下, 突然发现了盲点.
原来我出问题的镜像的 base 镜像里面已经指定了 STOPSIGNAL 为 SIGQUIT, 所以我才没办法收到 SIGTERM 信号.
这下大乌龙了
julyclyde
2023-01-17 15:59:20 +08:00
那你的程序收到 SIGQUIT 了吗?按说也没收到才对

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX