Pod 服务质量等级

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

服务质量类别

Kubernetes 对您运行的 Pod 进行分类,并将每个 Pod 分配到特定的*服务质量 (QoS) 类别*中。Kubernetes 使用该分类来影响不同 Pod 的处理方式。Kubernetes 根据 Pod 中容器资源请求以及这些请求与资源限制的关系进行分类。这被称为服务质量 (QoS) 类别。Kubernetes 根据其组件容器的资源请求和限制为每个 Pod 分配一个 QoS 类别。Kubernetes 使用 QoS 类别来决定在遇到节点压力时要从节点中驱逐哪些 Pod。可能的 QoS 类别是 GuaranteedBurstableBestEffort。当节点资源耗尽时,Kubernetes 将首先驱逐在该节点上运行的 BestEffort Pod,然后是 Burstable Pod,最后是 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 使用,并且您将 4 个 CPU 核心分配给 Guaranteed Pod,则 BestEffort QoS 类别中的 Pod 可以尝试使用剩余的 12 个 CPU 核心中的任意数量。

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

标准

如果 Pod 不符合 GuaranteedBurstable 的标准,则其 QoS 类别为 BestEffort。换句话说,只有当 Pod 中的任何容器都没有内存限制或内存请求,并且 Pod 中的任何容器都没有 CPU 限制或 CPU 请求时,Pod 才是 BestEffort。Pod 中的容器可以请求其他资源(不是 CPU 或内存),并且仍然被归类为 BestEffort

使用 cgroup v2 的内存 QoS

功能状态: Kubernetes v1.22 [alpha]

内存 QoS 使用 cgroup v2 的内存控制器来保证 Kubernetes 中的内存资源。Pod 中容器的内存请求和限制用于设置内存控制器提供的特定接口 memory.minmemory.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 PST:修复了 pod-qos.md 中的功能状态 (aeb36c0c72)