蛮荆

Kubernetes Pod 服务质量等级

2023-03-07

概述

本文主要是对 Kubernetes 应用最佳实践 - 资源请求和限制 的补充。

kubernetes 会自动将 Pod 的服务质量 (QoS) 分成三个等级,每个等级可以指定 Node 在资源不足时以什么策略来驱逐 Pod。

服务等级等级 优先级
BestEffort 最低
Guaranteed 最高
Burstable

BestEffort

BestEffort 是优先级最低的 Qos 等级,针对的目标是没有设置任何资源请求 (requests) 和资源限制 (limits) 的 Pod

# BestEffort 优先级示例
containers:
  name: foo
    resources:
  name: bar
    resources:

如果 Pod 的 Qos 等级是 BestEffort, 那么在极端情况下,这些 Pod 分配不到任何资源 (CPU, 内存等),同时当节点资源不足时,这些 Pod 会被优先终止, 不过有坏的一面,也有好的一面,当节点资源充足时,这些 Pod 同样会充分使用资源。

Guaranteed

Guaranteed 是优先级最高的 Qos 等级,针对的目标是已经设置了资源请求(requests) 和资源限制 (limits) 的 Pod

Guaranteed 等级的 Pod 需要满足以下几个条件:

  1. Pod 内的每个容器都需要设置 requests 和 limits (requests 默认情况下和 limits 相等,所以可以不用单独设置)
  2. requests 和 limits 指标必须同时包括 CPU 和内存
  3. requests 和 limits 指标值必须相等 (例如内存的 requests 和 limits 都是 2 GB)
# Guaranteed 优先级示例

containers:
  name: foo
    resources:
      limits:
        cpu: 10m
        memory: 1Gi
      requests:
        cpu: 10m
        memory: 1Gi
  name: bar
    resources:
      limits:
        cpu: 10m
        memory: 1Gi
      requests:
        cpu: 10m
        memory: 1Gi

如果 Pod 的 Qos 等级是 Guaranteed, 可以使用请求到的资源 (request),但是不能超过资源的限制量 (limits)。

Burstable

Burstable 是介于 BestEffort 和 Guaranteed 之间的 Qos 等级,如果 Pod 不属于上述两个等级,就属于 Burstable 等级。

通过 BestEffort 和 Guaranteed 两个等级的条件,我们可以得出 Burstable 等级的满足条件:

  1. Pod 内只有单个容器,且容器的 requests 和 limits 不相等
  2. Pod 内有多个容器,且至少有一个容器没有设置 limits
  3. Pod 内有多个容器,且至少有两个容器的 requests 和 limits 不相等 (包括没有设置的情况)
# Burstable 优先级示例
containers:
  name: foo
    resources:
      limits:
        cpu: 10m
        memory: 1Gi
      requests:
        cpu: 10m
        memory: 1Gi

  name: bar
    resources:
      limits:
        cpu: 100m
        memory: 100Mi
      requests:
        cpu: 100m
        memory: 100Mi

如果 Pod 的 Qos 等级是 Burstable, 可以使用请求到的资源 (request),如果设置了资源限制量 limits (则不能超过 limits),如果没有设置资源限制量 limits (可以充分利用资源)。


表格小结

根据上文中 Pod 和 Qos 等级之间的关系描述,我们可以总结出如下表格。

CPU (requests + limits) 内存 (requests + limits) QoS 等级
未设置 未设置 BestEffort
未设置 requests <= limits Burstable
requests <= limits 未设置 Burstable
requests = limits requests < limits Burstable
requests < limits requests = limits Burstable
requests = limits requests = limits Guaranteed

资源不足时的驱逐策略

当节点资源不足时,会驱逐 Pod 并释放出资源给优先级高的 Pod 使用,此时被驱逐的 Pod 的 Qos 等级依次为: BestEffort, Burstable, Guaranteed, Guaranteed 等级的 Pod 只有在系统进程需要资源时才会被驱逐。

如果两个 Pod 的 Qos 等级相同,会优先驱逐资源实际使用量占请求量比例更高的 Pod

最佳实践

  • 设置 Pod 的资源 requests 和 limits 参数时,要根据节点资源总量预留出一定的缓冲区,避免节点的资源耗尽
  • 将关键业务应用 Pod 的 Qos 等级设置为 Guaranteed, 保证其资源可用性和运行的稳定性
  • 非关键业务应用 Pod 的 Qos 等级可以适当调整为 Burstable, 预留出一定的弹性
  • 避免使用 BestEffort 等级,因为该等级不能提供任何资源保证,即使在资源充足时,该等级对应的 Pod 申请资源过程也是不可控的
  • 不仅要关注 Pod 的资源 requests 和 limits 参数,同时还要关注资源 requests 请求量和实际使用量,持续监控和调整

Reference

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。