Kubernetes中的Pause容器
已知容器技术利用linux提供的如下六种命名空间隔离技术来提供相应级别的资源隔离:
1 | 1.UTS(UNIX Time-sharing system) |
且我们知道容器之间命令空间是可以共享的:
1 | - docker run --net=container:webtest -itd IMAGE #运行一个容器,此容器与名为webtest的容器共享同一个网络命名空间 |
所谓共享命名空间,其实是继承了指定容器或主机的命名空间(父级)。
有了这一层认知,那么对于pod中的pause容器的理解便会很容易。
Pause容器
关于pause容器的共,网上盛传的一幅图为:
这里基于此图再展开来说明一番。
在k8s的管理视角中pod是一个最基本的调度单位,但是如果在下层docker引擎的角度来查看,你会发现每个pod中至少还包含了一个额外的pause容器:
1 | root@host001:~# kubectl get pods -o wide --all-namespaces | grep deptest11dev |
可以理解为,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 | [root@host003 ~]# docker ps | grep deptest | grep pause | awk '{print $1}' |
可以看出服务容器的IPC和network这两个命名空间确实继承自pause容器:
1 | [root@host003 ~]:~# docker inspect a0807a2d0f65 | jq '.[0] | .HostConfig' | grep Mode |