Kubernetes Pod 服务质量等级
2023-03-07 Cloud Native Kubernetes Kubernetes 应用最佳实践
概述
本文主要是对 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 需要满足以下几个条件:
- Pod 内的每个容器都需要设置 requests 和 limits (requests 默认情况下和 limits 相等,所以可以不用单独设置)
- requests 和 limits 指标必须同时包括 CPU 和内存
- 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 等级的满足条件:
- Pod 内只有单个容器,且容器的 requests 和 limits 不相等
- Pod 内有多个容器,且至少有一个容器没有设置 limits
- 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 请求量和实际使用量,持续监控和调整