摘要:当启动一个pod时,首先启动pause容器,它是祖先因此pid=1,接着开启的容器都继承在它之下。如下所示:
本篇使用了上一节的实验镜像。
在运行一个pod之后,会发现除了pod之外,还有一个pause容器。
pause容器就是它的字面意思,启动之后就pause了,休眠阻塞容器。
当启动一个pod时,首先启动pause容器,它是祖先因此pid=1,接着开启的容器都继承在它之下。如下所示:
但实际上,busybox容器在运行之后被加了”隔离“,因此即使busybox内部,也只能看到自己容器内的进程而看不到pause进程。
根据linux的说法,如果init进程结束了,那么挂在它下面的进程也一并结束,因此如果做为pod的init进程的pause结束,那么它下属的容器都会结束。
第二,init进程回收僵尸进程。这些概念都是来源于linux程序设计,这里简单写下:
//C语言fork创建子进程int main {pid_t pid = fork; // 创建子进程if (pid == 0) {printf("子进程\n"); //子进程} else if (pid > 0) {printf("父进程\n"); //父进程} else {perror("fork失败");return 1;}return 0;}如代码所示,父进程创建子进程之后两个进程就并行执行了,但可能有一种情况,父进程先结束了,结果子进程变成孤儿进程,那么资源没法回收。
正常情况,资源回收就是init进程,但此时父进程没了,因此就将它托管给内核中的init进程。总之,不管咋样,都要有一个init进程进行最后的处理。
这里摘取从一本书中看到的例子,我觉得写的不错,把它搬过来。
第一步:先运行一个pause容器。
docker run -idt --name pause-test \--ipc=shareable \gcr.io/google_containers/pause-amd64:3.0第二步:运行一个busybox容器,并将它挂到pause容器中。
docker run -idt --name busybox \--net=container:pause-test \--pid=container:pause-test \--ipc=container:pause-test \busybox主要就是加入pause的命名空间。
第三步:进入busybox容器,执行ps命令。
docker exec -it busybox sh> ps aux可以看到它的第一个进程是/pause。这也是k8s的做法,拓扑图如下:
来源:恋爱脑一点号