菜鸟学Kubernetes(K8s)系列——(一)关于Pod和Namespace

发布时间:2023-02-05 14:30

Kubernetes(K8s)系列——(一)关于Pod和Namespace

一、关于Pod

1、什么是Pod?

在Kubernetes中,她并不直接处理单个容器,而是直接操作Pod,Pod相当于是Kubernetes中最基本的部署单位。一个Pod中是可以包含多个容器的,容器中运行的是我们的应用程序。

一个Pod中是一组紧密相关的容器,这些容器一定是运行在同一个工作节点上的。每个Pod就像是一个独立的逻辑机器,拥有自己的IP、主机名、进程等。下面看看工作节点、Pod、容器、应用程序之间的关系。

菜鸟学Kubernetes(K8s)系列——(一)关于Pod和Namespace_第1张图片

1.1 为什么需要Pod?

为什么需要Pod?为什么不直接使用容器?为什么需要同时运行多个容器?为什么不能简单地把所有进程都放在一个单独的容器中?

一个容器中运行一个进程会让水平扩缩容变的简单,如果一个容器中即运行了Tomcat,又运行了MySQL,那在扩缩容的时候就变的复杂了。同时一个容器运行一个进程会让排错变的简单。一个容器中运行一个进程,这样才能够最好地应用容器编排来管理好容器和服务。因此建议一个容器中只运行一个进程。

由于不能将多个进程聚集在一个单独的容器中,所以就需要一种更高级的结构将容器绑定在一起,并将她们作为一个单元进行管理,这就产生了Pod。在一个Pod中,我们可以同时运行一些密切相关的进程,并为他们提供相同的环境,这时这些进程就好像全部运行于单个容器中一样,同时又保持着一定的隔离。

1.2 Pod间的容器是互通的

在Docker中我们知道每个容器之间是相互隔离的,每个容器都有属于自己的一组Namespace(指的是Linux的Namespace)。但是在K8s中,Pod之间是隔离的,而Pod中的一组容器是共享一些资源的。K8s通过配置Docker来让一个Pod内的所有容器共享相同的Namespace,而不是每个容器都有自己的一组Namespace。

由于一个Pod中的所有容器都在相同的Network命名空间下(他们还共享其他的一些Namespace),所以他们都共享相同的IP和端口。这就意味着在同一Pod中的容器运行的多个进程需要注意不能绑定到相同的端口号,否则会导致端口冲突。注意是同一Pod,而不同Pod间的容器是不用担心端口冲突的。此外,一个Pod中的所有容器也都具有相同的loopback网络接口,所以同一个Pod中的多个容器是可以通过localhost进行通信的。

在K8s集群中所有的Pod都在同一共享网络地址空间中,因此,整个集群中的每个Pod都可以通过其他Pod的IP地址实现相互访问。

在通过kubeadm安装Kubernetes集群的时候设置过一个配置:

kubeadm init \
--apiserver-advertise-address=xx.xx.xx.xx \
--image-repository xxx \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16   ### 这个就是集群中Pod的网络范围

1.3 通过Pod管理容器

我们将Pod视为独立的机器,其中每个机器只托管一个特定的应用。以前我们习惯于将各种应用程序塞进同一台主机,但是Pod不是这么玩的。我们将应用程序组织到多个Pod中,而每个Pod中只包含紧密相关的组件或进程。(注意,Pod是很轻量的,我们可以在几乎不导致任何额外开销的前提下拥有尽可能多的Pod,所以不用担心创建了太多的Pod)

以一个由前端应用和后端服务组成的多层应用程序为例。

虽然我们可以在单个Pod中同时运行前端服务和后端服务这两个容器,但是这种方式并不推荐,前面也提到尽量让一个容器中运行一个进程。对于前端服务和后端服务来说,他们真的需要运行在同一台计算机上吗?答案一定是否定的,如果把前端和后端都部署在同一个Pod中,那么他们两个相当于是共生的,始终会部署在同一台机器上。这时如果我们集群具有多个节点,而整个前后端服务一直都部署在同一节点上,就不能对其他节点的资源进行充分利用。另外,如果我们只想扩容后端服务怎么办?所以说,更合理的做法就是把前后端服务拆分成两个Pod,然后可以部署在不同的节点上,来提高机器的资源利用率,或者更加方便的进行扩缩容等。

何时在Pod中使用多个容器?

将多个容器添加到单个Pod中的主要原因是应用可能由一个主进程和多个辅助进程组成。

在决定是将两个容器放入一个Pod还是两个单独的Pod时,我们需要问自己以下问题:

  • 他们需要一起运行还是可以在不同的主机上运行?
  • 他们代表的是一个整体还是相互独立的组件?
  • 他们必须一起进行扩缩容还是可以分别进行?

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号