我使用tdEngineVersion2.4.0.3映像通过k8s部署创建了一个三节点集群。查看吊舱信息:
kubectl get pods -n mytdengineNAME READY STATUS RESTART AGE
tdengine-01 1/1 Running 0 1m45s
tdengine-02 1/1 Running 0 1m45s
tdengine-03 1/1 Running 0 1m45s一切都很顺利。
但是,当我尝试用delete操作停止这些豆荚时:
kubectl delete pod tdengine-03 -n mytdengine目标吊舱不会像预期的那样被删除。情况转到:
NAME READY STATUS RESTART AGE
tdengine-01 1/1 Running 0 2m35s
tdengine-02 1/1 Running 0 2m35s
tdengine-03 1/1 Terminating 0 2m35s经过几次测试,pod将被成功删除,直到3分钟,这是不正常的。我实际上没有使用tdengine实例,这意味着没有过多的负载或存储占用。我找不到理由解释为什么需要3分钟才能关闭。
发布于 2022-02-14 09:12:16
经过测试,我消除了kubernetes配置的问题。此外,我发现在Pod: 180的yaml文件中配置了参数‘terminationgraceperiodseconds’。
terminationgraceperiodseconds:180这意味着吊舱没有被优雅地关闭,而是在超时后被强行移除。
一般来说,吊舱的停止通常会发出信号。容器正确地处理信号并进行优雅的关机。但是,如果它没有停止,或者容器没有响应该信号,并且超过了上述参数‘终止优美秒’设置的超时,容器将接收信号并强制杀死容器。参考文献:https://tasdikrahman.me/2019/04/24/handling-singals-for-applications-in-kubernetes-docker/
原因是tdengine2 4.0.3映像的启动脚本首先拔出taos适配器,然后是taosd,但它没有重写信号项信号的处理方法。由于Linux 1的特殊性,只有PID 1在k8s将其发送到pod内容容器(如下图所示,PID 1是启动脚本)后接收信号,而不通知taos适配器和taosd (变成僵尸进程)。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9 root 20 0 2873404 80144 2676 S 2.3 0.5 112:30.81 taosadapter
8 root 20 0 2439240 41364 2996 S 1.0 0.3 130:53.67 taosd
1 root 20 0 20044 1648 1368 S 0.0 0.0 0:00.01 run_taosd.sh
7 root 20 0 20044 476 200 S 0.0 0.0 0:00.00 run_taosd.sh
135 root 20 0 20176 2052 1632 S 0.0 0.0 0:00.00 bash
146 root 20 0 38244 1788 1356 R 0.0 0.0 0:00.00 top 我个人选择了在k8s yaml文件中重写钩子函数的方式,以便立即删除容器:
lifecycle:
preStop:
command:
- /bin/bash
- -c
- procnum=`ps aux | grep taosd | grep -v -e grep -e entrypoint -e run_taosd
| awk '{print $2}'`; kill -15 $procnum; if ["$?" -eq 0]; then echo "kill当然,一旦我们知道了问题的原因,这里就没有讨论其他的解决办法。
https://stackoverflow.com/questions/71109426
复制相似问题