Kubernetes Pods

17 Mar 2025 | 6 分钟阅读

Pod是Kubernetes集群中节点内容器及其存储的集合。可以在一个Pod中创建多个容器。Pod是Kubernetes中可创建和管理的最小的计算部署单元。

Pod的内容始终是共同定位、共同调度并在共享主机上运行的。Pod模拟应用程序特定的逻辑主机。它包含一个或多个相对紧密耦合的应用程序。在非云环境中,在同一物理或虚拟计算机上运行的应用程序类似于在同一逻辑主机上运行的云应用程序。如果我们频繁部署单个容器,我们可以用容器替换Pod一词。

Pod比单个容器的运行级别高一层,因为一组容器协同工作以完成一项工作过程是非常普遍的。

Kubernetes支持比Docker更多的容器运行时。Docker是最广为人知的术语,它有助于使用Docker的一些术语来描述Pod。

Pod的共享上下文是一组Linux命名空间、组以及可能用于隔离Docker容器的其他方面的集合。在Pod的上下文中,单个应用程序可能进一步进行子隔离。

在Docker中,Pod类似于一组具有共享命名空间和共享文件系统卷的Docker容器。

Pod的类型

Kubernetes Pod有两种类型,例如:

  1. 单容器Pod:“一个容器一个Pod”模型是最常见的Kubernetes用例。它们可以使用kubctl run命令创建,在该命令中,我们在Docker仓库中有定义的镜像,在创建Pod时我们会拉取该镜像。Kubernetes管理Pod而不是管理容器。
  2. 多容器Pod:这些Pod使用YAML文件创建,其中定义了容器。Pod可以封装由多个共同定位、紧密耦合且需要共享资源的容器组成的应用程序。
    Pod将这些容器、存储资源和临时网络身份一起封装为一个单一的、凝聚的服务单元。

Pod的作用是什么?

Pod代表集群上运行的进程。通过将Pod限制为单个进程,Kubernetes可以报告集群上运行的每个进程的健康状况。

  • Pod具有唯一的IP地址,这允许它们相互通信。
  • Pod具有持久性存储卷。
  • Pod具有配置信息,该信息决定了容器应如何运行。

尽管许多Pod包含一个容器,但许多Pod将包含几个紧密协作以执行所需功能的容器。

我们还可以将Pod视为一个自包含的、隔离的逻辑主机,其中包含其服务的应用程序的系统需求。

Pod旨在运行应用程序的单个实例。但是,不直接建议创建单个Pod。相反,我们创建一组相同的Pod,称为副本,来运行应用程序。这样一组副本Pod由控制器创建和管理。控制器管理其组成Pod的生命周期,还可以执行水平扩展,根据需要更改Pod的数量。

尽管我们可能偶尔直接与Pod交互进行调试、故障排除或检查,但我们建议使用控制器来管理Pod。

Pod在集群中的节点上运行。Pod将一直停留在其节点上,直到其进程完成。由于资源不足,Pod被逐出或从节点删除,或者节点发生故障。如果节点发生故障,节点上的Pod将被自动调度为删除。

Pod生命周期

Pod是短暂的。它们不是为了永远运行而设计的,并且在Pod终止后,无法将其恢复。Pod不会消失,除非用户或控制器将其删除。

Pod不会自行修复。例如,如果一个Pod被调度在一个后来发生故障的节点上,它将被删除。同样,如果Pod因任何原因从节点中被逐出,Pod不会自我替换。

每个Pod都有一个PodStatus API对象,它由Pod的状态字段表示。Pod将其阶段发布到状态阶段字段。Pod的阶段是Pod当前状态的高级摘要。

当我们运行kubect1,get pod来检查集群上运行的Pod时,Pod可以处于以下可能的阶段之一:

  • 待定(Pending):Pod已创建并被集群接受,但一个或多个容器未运行。此阶段包括调度到节点和下载镜像所花费的时间。
  • 运行中(Running):Pod已绑定到节点,并且所有容器都已创建。至少有一个容器正在运行,正在启动中,或正在重启。
  • 已成功(Succeeded):Pod中的所有容器都已成功终止。终止的Pod不会重启。
  • 失败(Failed):Pod中的所有容器都已终止,并且至少有一个容器已失败终止。如果容器以非零状态退出,则该容器“失败”。
  • 未知(Unknown):无法确定Pod的状态。

Pod如何工作?

Pod由称为控制器的工作负载资源创建,这些控制器管理集群中的滚动更新、副本和Pod的健康状况。例如,如果集群中的某个节点发生故障,控制器会检测到该节点上的Pod无响应,并在其他节点上创建替换Pod。最常见的控制器类型有三种,例如:

  • Jobs用于批处理类型,它们是临时的,并将运行一个任务直到完成。
  • Deployments用于无状态和持久性应用程序,例如Web服务器(HTTP服务器)。
  • Stateful Sets用于有状态和持久性应用程序,例如数据库。

如果一个Pod有多个容器,它们都会被一起调度到集群中的同一台服务器上,无论是虚拟机还是物理服务器。Pod中的所有容器共享它们的资源和依赖关系,并且可以协调它们的执行和终止。

例如,Pod可以包含在应用程序容器运行之前运行的init容器,为后续应用程序设置环境。

Pod几乎总是由控制器创建,控制器可以自动管理Pod的生命周期,包括替换失败的Pod、在需要时复制Pod,以及在Pod完成且不再需要时将其从集群节点中逐出。

控制器使用Pod模板中的信息来创建Pod,并且控制器确保运行中的Pod与Pod模板中定义的部署匹配,例如,通过创建副本以匹配部署中定义的数量。

Pod如何管理多个容器

Pod旨在支持多个协作进程(作为容器),这些进程形成一个凝聚的服务单元。Pod容器在集群中的同一物理或虚拟机器上自动共同定位和共同调度。

容器可以共享资源和依赖关系,相互通信,并协调何时以及如何终止。

例如,一个容器充当共享卷中文件的Web服务器,以及一个单独的sidecar容器,该容器从远程源更新这些文件,如下面的图像所示。

Kubernetes Pods

有些Pod有init容器以及应用程序容器。Init容器在应用程序容器启动之前运行并完成。

Pod为组成容器提供两种共享资源,例如:

  1. 网络:Pod会自动分配唯一的IP地址。Pod容器共享相同的网络命名空间,包括IP地址和网络端口。Pod内的容器在Pod内部通过localhost进行通信。
  2. 存储:Pod可以指定一组可以在容器之间共享的共享存储卷。

Pod的好处

  • 当Pod包含多个容器时,它们之间的通信和数据共享被简化。由于Pod中的所有容器共享相同的网络命名空间,它们可以通过localhost进行定位和通信。
  • Pod可以通过使用另一个Pod的IP地址或引用位于另一个Pod中的资源来相互通信。
  • Pod可以包含在Pod启动时运行的容器,并在应用程序容器运行之前执行初始化。此外,Pod简化了可伸缩性,允许根据需求变化自动创建和关闭副本Pod。

下一个主题漏洞评估