重要概念:Pod内的容器都是平等的关系,共享Network Namespace、共享文件

pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名称空间

pause进程是pod中所有容器的父进程(即第一个进程);

关于 Pod 最重要的一个事实是:它只是一个逻辑概念。

Pod 在 Kubernetes 项目里还有更重要的意义,那就是:容器设计模式;

那么,Pod 又是怎么被“创建”出来的呢?

答案是:Pod,其实是一组共享了某些资源的容器。

具体的说:Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volume。

假如:一个有 A、B 两个容器的 Pod,不就是等同于一个容器(容器 A)共享另外一个容器(容器 B)的网络和 Volume 的玩儿法么?

这好像通过 docker run --net --volumes-from 这样的命令就能实现嘛,比如:

docker run --net=B --volumes-from=B --name=A image-A ...

但是,如果真这样做的话,容器 B 就必须比容器 A 先启动,这样一个 Pod 里的多个容器就不是对等关系,而是拓扑关系了。

所以,在 Kubernetes 项目里,Pod 的实现需要使用一个中间容器,这个容器叫作 Infra 容器(初始化容器)。

在这个 Pod 中,Infra 容器永远都是第一个被创建的容器,而其他用户定义的容器,则通过 Join Network Namespace 的方式,与 Infra 容器关联在一起。

这样的组织关系,可以用下面这样一个示意图来表达:

    22222.jpg

如上图所示,这个 Pod 里有两个用户容器 A 和 B,还有一个 Infra 容器。

很容易理解,在 Kubernetes 项目里,Infra 容器一定要占用极少的资源,所以它使用的是一个非常特殊的镜像,叫作:k8s.gcr.io/pause。

这个镜像是一个用汇编语言编写的、永远处于“暂停”状态的容器,解压后的大小也只有 100~200 KB 左右。

而在 Infra 容器“Hold 住(创建)”Network Namespace 后,用户容器就可以加入到 Infra 容器的 Network Namespace 当中了。

这也就意味着,对于 Pod 里的容器 A 和容器 B 来说:

  • 它们可以直接使用 localhost 进行通信;

  • 它们看到的网络设备跟 Infra 容器看到的完全一样;

  • 一个 Pod 只有一个 IP 地址,也就是这个 Pod 的 Network Namespace 对应的 IP 地址;

  • 当然,其他的所有网络资源,都是一个 Pod 一份,并且被该 Pod 中的所有容器共享;

  • Pod 的生命周期只跟 Infra 容器一致,而与容器 A 和 B 无关。