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;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐