重要概念:Pod内的容器都是平等的关系,共享Network Namespace、共享文件docker
pause容器的最主要的做用:建立共享的网络名称空间,以便于其它容器以平等的关系加入此网络名称空间设计模式
pause进程是pod中全部容器的父进程(即第一个进程);bash
关于 Pod 最重要的一个事实是:它只是一个逻辑概念。网络
Pod 在 Kubernetes 项目里还有更重要的意义,那就是:容器设计模式;ide
那么,Pod 又是怎么被“建立”出来的呢?spa
答案是:Pod,实际上是一组共享了某些资源的容器。设计
具体的说:Pod 里的全部容器,共享的是同一个 Network Namespace,而且能够声明共享同一个 Volume。blog
假如:一个有 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 容器关联在一块儿。
这样的组织关系,能够用下面这样一个示意图来表达:
如上图所示,这个 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 无关。