Pod的概念
尽管Kubernetes是容器编排系统,但它并不直接管理容器,它管理的却是名为Pod的对象。
Pod是对容器的高级抽像,Pod单词英文含义为豆荚,非常形象地揭示了其于容器的关系,就像一个豆荚中可以含一个或多个豆子一样,一个Pod也可以包含一个或多个容器。
在Kubernetes中,Pod是最基础的对象,不管Pod中包含多少容器,Pod的创建和销毁对应的是其包含的所有容器一并创建和销毁。
Pod的优势
在部署容器化应用时,有时我们会希望多个密切相关的容器能够部署在同一节点,这样这些容器之间可以方便地共享本地存储,也可以方便地互相通信,甚至我们也希望这些容器能够一并创建和销毁。
比如,我们有一个容器用于运行Web 服务器,此外还有一个容器用于管理Web服务器的数据,考虑到两个容器需要共享存储,那么将这两个容器中封装到同一个Pod中就比较合适,如下图所示:
与直接管理多个容器相比,Pod中的容器除了享有相同的生命周期以外,它们的网络和存储环境也有所不同。
Kubernetes会给Pod分配一个唯一的IP地址,Pod为容器提供了相对隔离的网络环境,Pod中的容器与外部通信时都使用该IP地址,而Pod中的容器之间通信则可以直接使用localhost
通信,此时只需要给互相通信的容器指定不同的端口即可。
在创建Pod时如果指定了存储卷,Kubernetes就会把存储卷挂载到每个容器,供容器共享使用。
Pod的概念源于Kubernetes对实际应用场景的准确把握,当需要单独部署容器时,只需要在Pod中指定一个容器即可,当需要多个容器一并部署时,只需要在Pod中指定多个容器。
Pod的局限性
尽管Pod可以封装容器,借此我们可以在一定程度上完成容器的批量管理,但实际上直接创建Pod的场景非常罕见。
Kubernetes将Pod视为一种不可靠的资源,它没有自愈能力,当遇到node异常或因资源不足而被驱逐时,Pod将会被删除。
为了满足各种场景下管理Pod的诉求,Kubernetes在Pod之上又提供了多种控制器资源,比如Deployment
、StatefulSet
和DaemonSet
等,这些控制器可以帮助我们更好的管理Pod,确保Pod总是按照我们预期的行为在运行。
小结
Pod在Kubernetes系统中只是一个资源,它不是一个进程,它是基于容器的抽象,它为一个或多个容器准备运行环境,运行一个Pod,最终还是把容器一个个交给容器运行时来运行。
尽管在Kubernetes系统中我们一般不直接创建Pod,但它是最基础的资源,Kubernetes大部分特性都是围绕如何更好地运行、管理Pod而展开,所以必须对Pod有一定的了解才可以开始后面的学习。