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 类别是 Guaranteed
、Burstable
和 BestEffort
。当节点资源耗尽时,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 不符合 Guaranteed
或 Burstable
的标准,则其 QoS 类别为 BestEffort
。换句话说,只有当 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 时,可能会发生抢占。
下一步
- 了解Pod 和容器的资源管理。
- 了解节点压力驱逐。
- 了解Pod 优先级和抢占。
- 了解Pod 中断。
- 了解如何为容器和 Pod 分配内存资源。
- 了解如何为容器和 Pod 分配 CPU 资源。
- 了解如何为 Pod 配置服务质量。