傲视Kubernetes(三):Kubernetes中的Pod
从本文开始,将正式开始Kubernetes的核心内容学习。首先要了解的是Pod,总共大约分为六篇左右,本篇是第一篇,相信学完之后,我们会对Pod有一个整体的理解。
本文内容:
1、什么是Pod
2、Pod的特性
一、什么是Pod
Pod是Kubernetes中最基本的调度、管理单元,其他的Kubernetes对象比如各种controller、svc,都是对Pod的动态管理和使用。可以说,Pod是Kubernetes中最核心的定义,没有之一。
Kubernetes规定,每个Pod必须运行在一个Node上。Node在Kubernetes中的概念类似于物理主机,而每个Pod就是运行在物理主机上的虚拟机,这样的对比虽然不那么严谨,但有助于开始的理解。下面是它们的关系图:
上图中每个Pod中都可以有一个至多个容器,此处的容器指的就是docker中的容器(当然也支持其他的容器化技术),容器中运行的就是我们的代码。可以看出来,Kubernetes的设计者将容器与对容器的管理分开了,中间加了一层Pod来负责生命周期的管控,如果容器运行过程中由于环境异常导致Pod挂掉,则Kubernetes会创建新的Pod重新运行容器,通过分层达到更好的管控效果。
虽然一个Pod中可以运行多个容器,但通常,还是建议一个Pod同一时间只运行一个容器,分散部署可以更好的利用Pod的扩缩容能力。
二、Pod的特性
既然上面说了Pod类似于运行在宿主机上的虚拟机,那么Pod本身有什么特性呢?它和虚拟机的区别点又是什么?
先来看Pod与虚拟机的区别。在本系列的第二篇文章中,提到过docker容器与虚拟机的区别与联系,其实一个docker容器的体量是比虚拟机小的,相较而言,Pod更像虚拟机。它们都能运行多个容器,有独立的网络命名空间。最大的区别还是虚拟机有自己的操作系统。
再来看Pod本身的特性。每个Pod都有独立的Linux命名空间和linux控制组(cgroup),前者可以使每个Pod有自己的系统视图,包括文件、进程、主机名等,后者可以使每个Pod有自己的系统资源,比如CPU、内存、网络带宽等。Kubernetes会给每个Pod分配一个独立的虚拟IP,这个IP在当前Kubernetes集群中是唯一的。
下面是几个相关问题:
1、Pod中的多个容器问题及解决
对于普通的docker容器来说,每个容器都有自己的PID linux命名空间,即容器内的进程系列号是独立的,完全可能与另一个容器内的PID相同。而且每个容器都有独立的文件系统。
但容器的上述特性,尤其是独立进程系列号的特性,会给一个Pod中的多个容器产生麻烦。Kubernetes是如何解决的?它通过配置docker来让一个Pod内的所有容器共享相同的linux命名空间,所以它们就有了相同进程树,并且都共享相同的主机名和网络接口。第二个特性【每个容器有独立的文件系统】,Kubernetes提供了共享文件目录来解决文件不共享的问题,共享文件在后面会进行学习。
此处还需注意,由于同一Pod的多个容器共享同一个网络命名空间,所以端口不能冲突。
2、Pod中的多容器之间以及Pod间的通讯
同一Pod中的多容器具有相同的loopback网络接口,所以可以用localhost+端口进行通信
Kubernetes的所有Pod处于同一个共享网络地址空间中,所以Pod间可以通过Pod的ip来进行访问,它们之间没有网络地址转换网关(NAT),可以像局域网一样通信。
本篇就到这里,下一篇将学习Pod的创建及使用。