什么是Pod
Pod是 K8S 中最小的 API 对象。换一个更专业的说法:Pod是 K8S 的原子调度单位。是 K8S 能够描述和编排各种复杂应用的基石
为什么需要 Pod
假设 K8S 集群上有两个节点:node-1 上有 3 GB 可用内存,node-2 有 2.5 GB 可用内存如果用 Docker Swarm 来运行这个 rsyslogd 程序:为了让这三个容器都运行在同一台机器上,必须在另外两个容器上设置一个 affinity=main(与 main 容器有亲密性)的约束,即:它们俩必须和 main 容器运行在同一台机器上。然后,顺序执行:"docker run main""docker run imklog"和"docker run imuxsock",创建这三个容器。这样,这三个容器都会进入 Swarm 的待调度队列。然后,main 容器和 imklog 容器都先后出队并被调度到了 node-2 上(这个情况是完全有可能的)。可是,当 imuxsock 容器出队开始被调度时,Swarm 就有点懵了:node-2 上的可用资源只有 0.5 GB 了,并不足以运行 imuxsock 容器;可是,根据 affinity=main 的约束,imuxsock 容器又只能运行在 node-2 上。这就是一个典型的成组调度(gang scheduling)没有被妥善处理的例子。各种解决方案1. Mesos 中使用资源囤积(resource hoarding)机制 会在所有设置了 Affinity 约束的任务都达到时,才开始对它们统一进行调度。1. Google Omega 则提出了使用乐观调度处理冲突的方法 即:先不管这些冲突,而是通过精心设计的回滚机制在出现了冲突之后解决问题。可是这些方法都谈不上完美:资源囤积带来了不可避免的调度效率损失和死锁的可能性而乐观调度的复杂程度,则不是常规技术团队所能驾驭的K8S 项目里,这问题就迎刃而解了:K8S 项目的调度器,是统一按照 Pod 而非容器的资源需求进行计算的。超亲密关系像这样容器间的紧密协作,称为"超亲密关系"。Pod 在 K8S 项目里还有更重要的意义,那就是:容器设计模式。
Pod 的实现原理
Pod 只是一个逻辑概念关于 Pod 最重要的一个事实是:它只是一个逻辑概念K8S 真正处理的,还是宿主机上 Linux 容器的 Namespace 和 Cgroups,并不存在一个所谓的 Pod 的边界或者隔离环境。Pod 是如何被"创建"出来的Pod 其实是一组共享了某些资源的容器。Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volume。