k8s如果防止容器中出现僵尸进程
k8s如果防止容器中出现僵尸进程
1、直接运行服务进程
Dockerfile 如下:
这种方式启动的服务,server 在容器中的进程pid是1,主进程server被kill, 会重建容器,旧容器被杀死后的残留进程被宿主机的1号进程回收残留进程
2、bash 使用 exec 运行进程
服务的启动脚本和 Dockerfile 示例如下:
run.sh
Dockerfile
如果需要在启动前做一些脚本化的操作,再启动服务,这种是在run.sh
最后启动服务的时候, 使用exec server, 会让server进程替换当前shell 做1号进程,这种情况下同 1直接运行服务进程,也就不会产生多余全局进程。
3、pod使用 hostPID
如果一个容器中有嵌套守护进程的逻辑,容器中的1号守护进程启动子进程,子进程还会启动其它子进程,中间的子进程被Kill 还是会出现全局进程的情况
如下所示,1号进程是 looprun-x64
, 子进程是 ./9234
, [9234] <defunct>
就是中间进程被kill 掉之后,父进程自动改为1, 但是容器中的守护进程服务 looprun-x64
又没有回收僵尸进程的能力,就会产生大量僵尸进程.
``` ps -ef UID PID PPID C STIME TTY TIME CMD ks 1 0 0 Nov13 ? 00:00:22 ./looprun-x64 ks 54 1 0 Nov13 ? 00:00:00 [9234] ks 130 1 0 Nov13 ? 00:00:08 [9234] ks 2385 0 0 14:46 ? 00:00:00 /bin/sh ks 7446 1 0 Nov15 ? 00:00:11 [9234] ks 15315 1 0 Nov23 ? 00:00:06 [9234] ks 15800 1 0 12:31 ? 00:00:00 [9234] ... ks 15879 1 0 12:32 ? 00:00:06 ./9234 ks 16017 1 0 Nov25 ? 00:00:29 [9234]
... spec: containers: ... hostPID: true ...
Add Tini
ENV TINI_VERSION v0.19.0 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini RUN chmod +x /tini ENTRYPOINT ["/tini", "--"]
Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
or docker run your-image /your/program ...
... spec: shareProcessNamespace: true containers: ...
```
参考:https://www.cnblogs.com/kkbill/p/12952815.html 参考:https://blog.csdn.net/whatday/article/details/104136230
Last updated