kubernetes编排和调度的基本单元是一个个的pod,其中每个pod中会包含一个或者多个容器,例如,如下的配置定义了一个pod,包含有两个container:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
shareProcessNamespace: true
containers:
- name: nginx
image: nginx
- name: shell
image: busybox
stdin: true
tty: true
调度到kubernetes平台之后,会发现有两个容器在运行:
这里要强调的是同一个pod中的各容器是共享一些资源的,其实就是namespace是打通的,比如pid namespace、network namespace以及存储的namespace等。
共享pid namespace,也就是说你在一个容器中能看到另外一个容器的进程列表
pod级别的共享控制参数:ShareProcessNamespace 默认是开启的,
可以通过禁用:
--feature-gates=PodShareProcessNamespace=false
比如,可以尝试在busybox容器中运行ps,可以看到nginx相关的进程。
命名空间的共享在底层是通过docker来支持的。: https://docs.docker.com/engine/reference/run/
同样的,也有控制网络命名空间相关的配置
为了确认这一点,docker insepect相关的容器
看一看到,两个容器的命名空间是共享的。
最后,一共pod中的容器可以共享的资源有:
“
- PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;
- 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;
- IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;
- UTS命名空间:Pod中的多个容器共享一个主机名;
- Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes;
”