Kubernetes中的Pause容器

Kubernetes中的Pause容器

已知容器技术利用linux提供的如下六种命名空间隔离技术来提供相应级别的资源隔离:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.UTS(UNIX Time-sharing system)
允许创建独立的hostname/domian_name namespace,作为独立的节点
2.IPC(Inter Process Communication)
创建隔离的进程间通信方式,实现包括信号量、消息队列、管道、共享内存等资源的namespace隔离
3.PID(Process ID)
允许树的子叶节点namespace创建自己专属的pid区间,pid对同级节点无效,仅父级namespace节点可见。(在子节点的pid,会在父节点映射为另一个pid标志,
因此在父节点的角度,每个子节点的进程拥有两个pid号)
4.mount
挂载点namespace,各个namespace默认的mount挂载只在本空间内生效,不影响其他namespace,也可使用share共享挂载的方式互相影响, 或者slave从属挂
载的方式,实现主影响从。
5.network
每个net ns拥有独立的网络资源(包括网络设备,IPv4/IPv6协议栈,防火墙,/proc/net、/sys/class/net目录等)
6.user
每个user ns拥有独立的id、属性、key、根目录,组织结构等

且我们知道容器之间命令空间是可以共享的:

1
2
- docker run --net=container:webtest -itd IMAGE  #运行一个容器,此容器与名为webtest的容器共享同一个网络命名空间
- docker run -it --pid=host IMAGE ps aux # 运行一个容器,其具有host宿主机级别的pid命名空间

所谓共享命名空间,其实是继承了指定容器或主机的命名空间(父级)

有了这一层认知,那么对于pod中的pause容器的理解便会很容易。

Pause容器

关于pause容器的共,网上盛传的一幅图为:

这里基于此图再展开来说明一番。

在k8s的管理视角中pod是一个最基本的调度单位,但是如果在下层docker引擎的角度来查看,你会发现每个pod中至少还包含了一个额外的pause容器:

1
2
3
4
5
6
7
root@host001:~# kubectl get pods -o wide --all-namespaces | grep deptest11dev
default deptest11dev-6fd6c96d9c-r7fld 1/1 Running 0 15s 172.26.9.55 host003


[root@host003 ~]# docker ps | grep deptest
53edc1df3c13 centos "/bin/bash -c /run.sh" 12 minutes ago Up 12 minutes k8s_deptest11dev_deptest11dev-6fd6c96d9c-r7fld_default_98522401-f47f-11e9-8d5e-3440b5a2bb9c_0
e6cfffadffdb gcr.io/google_containers/pause-amd64:3.0 "/pause" 12 minutes ago Up 12 minutes k8s_POD_deptest11dev-6fd6c96d9c-r7fld_default_98522401-f47f-11e9-8d5e-3440b5a2bb9c_0

可以理解为,pause容器是服务容器的基础设施容器,pause容器创建了父级的IPC、PID、network命名空间,pod之中的所有容器,它们的这3种命名空间全部继承自父级pause容器,它们通过pause容器开辟的空间实现彼此共享进程表、彼此之间localhost方式的通信,kubelet还可以通过pause容器收集pod的运行状态相关信息,大有一番先有盘古后有天的感觉~

但实际上,在后面的kubernetes版本之中,将pod的PID这一项命名空间共享移除了,这么做的原因是kubernetes认为服务容器本身应当是单服务模式,产生的进程都是自身可控的,进程管理和回收应该由服务容器自身的init进程进行管理而不是由pause容器来托管。在如今的kubernetes pod中,PID命名空间已不在pod内部共享,下面从docker容器的角度来看下pause容器和服务容器之间的联系。

验证

Pause容器短名是:e6cfffadffdb

1
2
[root@host003 ~]# docker ps  | grep deptest | grep pause | awk '{print $1}'
e6cfffadffdb

可以看出服务容器的IPC和network这两个命名空间确实继承自pause容器:

1
2
3
4
5
6
[root@host003 ~]:~# docker inspect a0807a2d0f65 |  jq '.[0] | .HostConfig' | grep Mode
"NetworkMode":"container:e6cfffadffdbc631b589dd3c6712fc6d10a8356b9b39bd611160aaa600eafe67",
"IpcMode": "container:e6cfffadffdbc631b589dd3c6712fc6d10a8356b9b39bd611160aaa600eafe67",
"PidMode": "",
"UTSMode": "",
"UsernsMode": "",
赏一瓶快乐回宅水吧~
-------------本文结束感谢您的阅读-------------