k8s之Pod中的特殊容器:pause

每个Pod里运行着一个特殊的被称之为Pause的容器,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。同一个Pod里的容器之间仅需通过localhost就能互相通信。Kubernetes为每个Pod分配唯一的IP的地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP的直接通讯,采用虚拟二层网络技术来实现,一个Pod里的容器与另外主机上的Pod容器能够直接通信
 
pause container作为pod里其他所有container的parent container,主要有两个职责
  • 是pod里其他容器共享Linux namespace的基础。Pause容器作为Pod根容器,以它的状态代表整个容器组的状态
  • 扮演PID 1的角色,负责处理僵尸进程,启用pid命名空间,开启init进程。Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume
pause又叫Infra容器,是启动pod第一个启动的容器,启动后pause容器大部分时间都在沉睡,等待有信号将其唤醒。这个容器和其他的业务容器共享namespace。
 
接收什么信号呢?
一旦收到SIGCHLD信号,pause进程就执行注册的sigreap函数
SIGCHLD,在一个进程正常终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。
pause进程注册的信号处理函数sigreap里,调用另一个系统调用waitpid来获得子进程终止的原因。
 
在Linux里,当父进程fork一个新进程时,子进程会从父进程继承namespace。目前Linux实现了六种类型的namespace,每一个namespace是包装了一些全局系统资源的抽象集合,这一抽象集合使得在进程的命名空间中可以看到全局系统资源。命名空间的一个总体目标是支持轻量级虚拟化工具container的实现,container机制本身对外提供一组进程,这组进程自己会认为它们就是系统唯一存在的进程。
 
在Linux里,父进程fork的子进程会继承父进程的命名空间。与这种行为相反的一个系统命令就是unshare
 
容器里服务进程号为什么是1?

容器里面默认都是单进程监控,其代表服务的进程,也就是控制台启动的进程,1的原因是,容器有rootfs,然后通过namespace隔离了以后自己只能看到自己的进程,容器里面看到的文件系统是通过rootfs来实现,所以自己就是1。
 

版权声明:
作者:allenjol
链接:https://www.ayunw.cn/archives/610
来源:爱生活,爱运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>