什么是Pod
众所周知,Pod有点像传统部署环境里“虚拟机”的角色,它是K8S调度的最小单元,Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统。处于一个Pod中的多个容器可以共享的资源包括:Volumes、Network命名空间、IPC命名空间、UTS命名空间、PID命名空间等,其中PID命名空间共享在1.10版本引入,在1.12版本promote到beta特性,阿里云的容器服务V1.12版本支持在4月1日发布,引入了共享进程名字空间能力,本次将要体验的就是这个特性。
共享进程名字空间特性
启用共享进程名字空间(Share Process Namespace)后,同一个Pod内的所有容器之间的进程是可见的,这在很多场景下是非常有用的,比如用Sidecar方式采集日志,在每个Pod中运行一个Sidecar的日志agent容器,用于采集该Pod主容器产生的日志,可以灵活的对日志进行配置、支持超大日志量采集、日志高度可定制等,或者对一些并不包含调试工具的容器镜像进行查错等,这些都要能够访问同一个Pod内的其他容器才行。
阿里云的容器服务缺省没有启用这个特性,也就是说缺省的shareProcessNamespace值为false,需要手动开启才行,下面我们通过一个小实验来看如何开启和开启后的效果。
缺省不共享进程名字空间
创建容器服务集群,在此集群上创建应用,使用公版的镜像部署运行nginx和mysql两个不同的容器,不带shareProcessNamespace
添加容器1(nginx容器):
添加容器2(mysql容器):
确定运行,很快就可以看到生成两个Pod,每个Pod里都有nginx和mysql两个容器在运行:
登录其中一个容器,先安装ps命令工具,用于查看进程状况,容器缺省不包含ps工具:
安装完成后,登录nginx容器,查看进程情况:
登录同一个Pod下的mysql容器,查看进程情况:
可以看出nginx、mysql两个容器中互相查不到对方的进程,且两个容器中的pid是有重复的,可以看出两个容器之间进程不共享
配置Pod共享进程名字空间
用以下yaml创建容器:
(见deploy.yaml,用word不要放代码和排版,先放文件中,发布的时候再贴上去)