赞
踩
书籍来源:《Kubernetes网络权威指南:基础、原理与实践》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客
在Kubernetes中,pause容器被当作Pod中所有容器的“父容器”,并为每个业务容器提供以下功能:
pause容器源码
在Kubernetes中,pause容器运行着一个非常简单的进程,它不执行任何功能,基本上是永远“睡觉”的。
当然它不会只知道“睡觉”。它执行另一个重要的功能——即它扮演PID 1的角色,并在子进程成为“孤儿进程”的时候,通过调用wait()收割这些僵尸子进程。
下面来看一下如何使用pause容器和共享namespace创建Pod。
首先,使用Docker启动pause容器,以便可以将其他容器添加到Pod中:
然后,在Pod中运行其他容器,分别是Nginx代理和ghost博客应用。
Nginx代理的后端配置成http://127.0.0.1:2368 ,也就是ghost进程监听的地址,如下所示:
为ghost博客应用程序创建另一个容器,如下所示:
在这个例子中,将pause容器指定为要加入其namespace的容器。如果访问http://localhost:8080/ ,那么应该能够看到ghost通过Nginx代理运行,因为pause、Nginx和ghost容器之间共享networknamespace,如图3-9所示。
通过Pod,Kubernetes屏蔽了以上所有复杂度。
图3-9 Pod的底层实现原理
容器使用PID namespace对PID进行隔离,因此每个容器中均可以有独立的init进程。当在主机上发送SIGKILL或者SIGSTOP(也就是docker kill或者docker stop命令)强制终止容器的运行时,其实就是在终止容器内的init进程。一旦init进程被销毁,同一PID namespace下的进程也随之被销毁。
在容器中,必须要有一个进程充当每个PID namespace的init进程,使用Docker的话,ENTRYPOINT进程是init 进程。如果多个容器之间共享PID namespace,那么拥有PID namespace的那个进程须承担init进程的角色,其他容器则作为init进程的子进程添加到PID namespace中。
Pod的init进程,pause容器舍它其谁?
Pod内容器共享PID namespace是很有意义的,那为什么还要开放这个禁止PID namesapce共享的开关呢?那是因为当应用程序不会产生其他进程,而且僵尸进程带来的问题可以忽略不计时,就用不到PID namespace的共享了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。