# k8s Pod 概述

本文主要介绍 Pod,了 k8s 对象模型中可部署的最小对象。

# 了解 Pod

Pod 是 k8s 创建或部署的最小/最简单的基本单位,一个 Pod 代表集群上正在运行的一个进程。

一个 Pod 封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项。Pod 代表部署的一个单位:k8s 中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

Docker 是 k8s Pod 中最常见的 runtime,Pods 也支持其他容器 runtimes。

k8s 中的 Pod 使用可分两种主要方式:

  • Pod 中运行一个容器。“one-container-per-Pod”模式是 k8s 最常见的用法; 在这种情况下,你可以将 Pod 视为单个封装的容器,但是 k8s 是直接管理 Pod 而不是容器。
  • Pods 中运行多个需要一起工作的容器。Pod 可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部 service 单位 - 一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod 将这些容器的存储资源作为一个实体来管理。

关于 Pod 用法其他信息请参考:

  • The Distributed System Toolkit: Patterns for Composite Containers
  • Container Design Patterns

每个 Pod 都是运行应用的单个实例,如果需要水平扩展应用(例如,运行多个实例),则应该使用多个 Pods,每个实例一个 Pod。在 k8s 中,这样通常称为 Replication。Replication 的 Pod 通常由 Controller 创建和管理。更多信息,请参考 Pods 和控制器。

# Pods 如何管理多个容器

Pods 的设计可用于支持多进程的协同工作(作为容器),形成一个 cohesive 的 Service 单位。Pod 中的容器在集群中 Node 上被自动分配,容器之间可以共享资源、网络和相互依赖关系,并同时被调度使用。

请注意,在单个 Pod 中共同管理多个容器是一个相对高级的用法,应该只有在容器紧密耦合的特殊实例中使用此模式。例如,有一个容器被用作 WEB 服务器,用于共享 volume,以及一个单独“sidecar”容器需要从远程获取资源来更新这些文件,如下图所示:

pod diagram

Pods 提供两种共享资源:网络和存储。

# 网络

每个 Pod 被分配一个独立的 IP 地址,Pod 中的每个容器共享网络命名空间,包括 IP 地址和网络端口。Pod 内的容器可以使用 localhost 相互通信。当 Pod 中的容器与 Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。

# 存储

Pod 可以指定一组共享存储 volumes。Pod 中的所有容器都可以访问共享 volumes,允许这些容器共享数据。volumes 还用于 Pod 中的数据持久化,以防其中一个容器需要重新启动而丢失数据。有关 k8s 如何在 Pod 中实现共享存储的更多信息,请参考 Volumes。

# 使用 Pod

你很少会直接在 k8s 中创建单个 Pod。因为 Pod 的生命周期是短暂的,用后即焚的实体。当 Pod 被创建后(不论是由你直接创建还是被其他 Controller),都会被 Kuberentes 调度到集群的 Node 上。直到 Pod 的进程终止、被删掉、因为缺少资源而被驱逐、或者 Node 故障之前这个 Pod 都会一直保持在那个 Node 上。

注意:重启 Pod 中的容器跟重启 Pod 不是一回事。Pod 只提供容器的运行环境并保持容器的运行状态,重启容器不会造成 Pod 重启。

Pod 不会自愈。如果 Pod 运行的 Node 故障,或者是调度器本身故障,这个 Pod 就会被删除。同样的,如果 Pod 所在 Node 缺少资源或者 Pod 处于维护状态,Pod 也会被驱逐。k8s 使用更高级的称为 Controller 的抽象层,来管理 Pod 实例。虽然可以直接使用 Pod,但是在 k8s 中通常是使用 Controller 来管理 Pod 的。

# Pod 和 Controller

Controller 可以创建和管理多个 Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个 Node 故障,Controller 就能自动将该节点上的 Pod 调度到其他健康的 Node 上。

包含一个或者多个 Pod 的 Controller 示例:

  • Deployment
  • StatefulSet
  • DaemonSet

通常,Controller 会用你提供的 Pod Template 来创建相应的 Pod。

# Pod 模板

Pod 模板是包含了其他对象(如 Replication Controllers,Jobs 和 DaemonSets)中的 pod 定义。Controllers 控制器使用 Pod 模板来创建实际需要的 pod。

pod 模板类似 cookie cutters。“一旦饼干被切掉,饼干和刀将没有关系”。随后对模板的后续更改甚至切换到新模板对已创建的 pod 并没有任何的影响。

Last Updated: 4/15/2023, 8:33:17 PM