Pod 服务质量类

本页面介绍了 Kubernetes 中的“服务质量(QoS)等级”,并解释了 Kubernetes 如何根据你为 Pod 中容器指定的资源约束为每个 Pod 分配 QoS 等级。Kubernetes 依赖此分类来决定当节点上没有足够的可用资源时驱逐哪些 Pod。

服务质量等级

Kubernetes 对你运行的 Pod 进行分类,并将每个 Pod 分配到特定的**服务质量 (QoS) 等级**。Kubernetes 使用该分类来影响不同 Pod 的处理方式。Kubernetes 基于 Pod 中容器资源请求以及这些请求与资源限制的关系进行分类。这被称为服务质量(QoS)等级。Kubernetes 根据其组成容器的资源请求和限制为每个 Pod 分配一个 QoS 等级。QoS 等级被 Kubernetes 用于决定当节点遇到节点压力时从节点驱逐哪些 Pod。可能的 QoS 等级包括 `Guaranteed`、`Burstable` 和 `BestEffort`。当节点资源不足时,Kubernetes 将首先驱逐在该节点上运行的 `BestEffort` Pod,其次是 `Burstable`,最后是 `Guaranteed` Pod。当此驱逐是由于资源压力造成的时,只有超出资源请求的 Pod 才会成为驱逐的候选对象。

Guaranteed

Guaranteed 等级的 Pod 具有最严格的资源限制,最不可能被驱逐。它们保证不会被终止,除非它们超出了自身限制,或者节点上没有优先级更低的 Pod 可以被抢占。它们不能获取超出其指定限制的资源。这些 Pod 还可以使用 `static` CPU 管理策略来利用独占 CPU。

评判标准

要让 Pod 被赋予 `Guaranteed` QoS 等级,

  • Pod 中的每个容器都必须有内存限制和内存请求。
  • Pod 中的每个容器,内存限制必须等于内存请求。
  • Pod 中的每个容器都必须有 CPU 限制和 CPU 请求。
  • Pod 中的每个容器,CPU 限制必须等于 CPU 请求。

Burstable

Burstable 的 Pod 基于请求有一些较低的资源保证,但不需要特定的限制。如果未指定限制,则默认为与节点容量等效的限制,这允许 Pod 在资源可用时灵活地增加其资源。在由于节点资源压力而导致 Pod 驱逐的情况下,只有在所有 `BestEffort` Pod 被驱逐后,这些 Pod 才会被驱逐。因为一个 `Burstable` Pod 可以包含没有资源限制或请求的容器,所以一个 `Burstable` Pod 可以尝试使用任意数量的节点资源。

评判标准

如果出现以下情况,则 Pod 被赋予 `Burstable` QoS 等级:

  • Pod 不满足 QoS 等级 `Guaranteed` 的条件。
  • Pod 中至少有一个容器有内存或 CPU 请求或限制。

BestEffort

`BestEffort` QoS 等级中的 Pod 可以使用未明确分配给其他 QoS 等级 Pod 的节点资源。例如,如果你有一个节点,其中有 16 个 CPU 核心可供 kubelet 使用,并且你为 `Guaranteed` Pod 分配了 4 个 CPU 核心,那么 `BestEffort` QoS 等级中的 Pod 可以尝试使用剩余 12 个 CPU 核心的任意数量。

如果节点面临资源压力,kubelet 更倾向于驱逐 `BestEffort` Pod。

评判标准

如果 Pod 不满足 `Guaranteed` 或 `Burstable` 的标准,则它具有 `BestEffort` QoS 等级。换句话说,只有当 Pod 中的所有容器都没有内存限制或内存请求,并且 Pod 中的所有容器都没有 CPU 限制或 CPU 请求时,Pod 才是 `BestEffort` 等级。Pod 中的容器可以请求其他资源(非 CPU 或内存),并且仍被归类为 `BestEffort`。

使用 cgroup v2 的内存 QoS

特性状态: Kubernetes v1.22 [alpha] (默认禁用)

内存 QoS 使用 cgroup v2 的内存控制器来保证 Kubernetes 中的内存资源。Pod 中容器的内存请求和限制用于设置内存控制器提供的特定接口 `memory.min` 和 `memory.high`。当 `memory.min` 设置为内存请求时,内存资源被保留,永远不会被内核回收;这就是内存 QoS 确保 Kubernetes Pod 内存可用性的方式。如果容器中设置了内存限制,这意味着系统需要限制容器内存使用;内存 QoS 使用 `memory.high` 来限制接近内存限制的工作负载,确保系统不会因瞬时内存分配而过载。

内存 QoS 依赖 QoS 等级来确定要应用哪些设置;然而,这些是不同的机制,都提供对服务质量的控制。

某些行为与 QoS 等级无关

某些行为与 Kubernetes 分配的 QoS 等级无关。例如:

  • 任何超出资源限制的容器都将被 kubelet 终止并重新启动,而不会影响 Pod 中的其他容器。

  • 如果容器超出其资源请求并且它运行的节点面临资源压力,则它所在的 Pod 成为驱逐的候选对象。如果发生这种情况,Pod 中的所有容器都将被终止。Kubernetes 可能会创建一个替换 Pod,通常在不同的节点上。

  • 一个 Pod 的资源请求等于其组成容器的资源请求之和,一个 Pod 的资源限制等于其组成容器的资源限制之和。

  • kube-scheduler 在选择要抢占的 Pod 时不考虑 QoS 等级。当集群没有足够的资源来运行你定义的所有 Pod 时,可能会发生抢占。

下一步

最后修改时间:2024 年 4 月 20 日太平洋标准时间上午 12:16:修复了 pod-qos.md 中的特性状态 (aeb36c0c72)