QoS guaranteed 优先级高于默认模式

50 阅读6分钟

你说得完全正确!Guaranteed Pod 的整体优先级(包含「调度优先级」和「运行阶段的存活/资源保障优先级」),都显著高于默认的共享资源 Pod(Burstable/BestEffort 等级,也是绝大多数默认创建的 Pod 类型)

这种优先级差异不是“配置可选”,而是 K8s 原生的 QoS(服务质量)等级设计,核心是为了保障核心业务的稳定性,下面分维度详细拆解,同时贴合你之前的「业务/管理池隔离」需求:

一、 先明确:默认的共享 Pod 是什么?

默认情况下,你创建的 Pod 如果不满足 Guaranteed 条件(即 requests ≠ limits 或未声明资源),会被归为以下两类「共享资源 Pod」,它们的资源是节点级共享,无独占保障,优先级低于 Guaranteed

  1. Burstable(最常见默认):容器声明了 requests < limits,有保底资源,但可抢占节点空闲资源,资源共享且有上限;
  2. BestEffort(无资源声明):容器完全不声明 requests/limits,无任何资源保障,只能抢占节点剩余空闲资源,优先级最低。

这两类 Pod 之间会互相争抢节点资源,且在节点资源紧张时,会被优先淘汰,而 Guaranteed Pod 会获得更优的资源保障和优先级。

二、 Guaranteed Pod 与默认共享 Pod 的优先级差异(核心优势)

优先级差异主要体现在「调度阶段」和「运行阶段」两个核心环节,前者决定 Pod 能否成功部署,后者决定 Pod 能否稳定存活。

1. 调度阶段:Guaranteed Pod 调度优先级更高,更容易部署成功

K8s 调度器(kube-scheduler)在预选(Predicates)和优选(Priorities)阶段,会优先保障 Guaranteed Pod 的资源需求:

  • 资源预留优先Guaranteed Podrequests = limits,资源需求是「明确且刚性」的,调度器会优先为其预留节点资源(CPU/内存),避免调度后资源不足;
  • 默认共享 Pod 次之Burstable Pod 仅会预留 requests 对应的保底资源,调度优先级低于 GuaranteedBestEffort Pod 无任何资源预留,只有在节点有空闲资源时,才会被调度,资源紧张时直接调度失败;
  • 额外加持(你的核心需求):若开启了 kubelet 的 static 策略,Guaranteed Pod 还会优先分配「独占 cpuset 物理核」,进一步提升调度成功率,而默认共享 Pod 无此待遇,只能共享剩余核。

简单说:节点资源紧张时,Guaranteed Pod 能“插队”部署,而默认共享 Pod 可能会被拒绝调度。

2. 运行阶段:Guaranteed Pod 存活优先级更高,更难被淘汰,资源更有保障

这是两者优先级差异最核心的体现,也是 Guaranteed Pod 最关键的优势,尤其在节点资源不足时,差异极为明显:

(1) 资源回收/淘汰优先级:Guaranteed Pod 最后被淘汰

当节点资源(CPU/内存)耗尽时,kubelet 会触发「资源回收机制」,按照「BestEffort > Burstable > Guaranteed」的顺序主动淘汰 Pod,释放资源:

  • 首先淘汰 BestEffort Pod(无资源声明,无任何保障);
  • 其次淘汰 Burstable Pod(仅保障 requests 保底资源,超出部分可被回收);
  • 最后才会考虑 Guaranteed Pod:只有在节点资源彻底耗尽,且无其他 Pod 可淘汰时,才会被迫淘汰 Guaranteed Pod(几乎不会发生,除非节点故障)。

(2) OOM(内存溢出)优先级:Guaranteed Pod 最难被内核杀死

Linux 内核的 OOM Killer 会根据进程的 oom_score_adj(OOM 分数调整值)决定优先杀死哪个进程,K8s 会为不同 QoS 等级的 Pod 设置不同的 oom_score_adj

QoS 等级oom_score_adj 值被 OOM Killer 杀死的优先级
Guaranteed-998(最低)最难被杀死(几乎不会)
Burstable0 ~ 999(中间)次之,根据资源使用情况调整
BestEffort1000(最高)最容易被杀死

Guaranteed Podoom_score_adj 接近最低值,内核会优先保护这类 Pod,只有在系统彻底崩溃前,才会考虑杀死它,而默认共享 Pod 很容易因内存溢出被内核杀死。

(3) 资源独占性(开启 static 策略后):Guaranteed Pod 不被共享 Pod 抢占

Guaranteed Pod 会绑定「独占 cpuset 物理核」,这些核不会被任何默认共享 Pod 抢占,运行时无资源争抢,性能稳定;而默认共享 Pod 之间会互相争抢节点剩余资源,性能波动较大。

3. 总结:优先级差异核心对比表

对比维度Guaranteed Pod默认共享 Pod(Burstable/BestEffort)
调度优先级高(优先预留资源,容易部署)低(资源紧张时调度失败)
存活/淘汰优先级高(最后被淘汰,几乎不被主动回收)低(优先被淘汰,资源紧张时易被回收)
OOM 优先级高(最难被内核杀死,oom_score_adj=-998低(容易被内核杀死,分数更高)
资源保障独占(开启 static 后)/ 刚性保障共享 / 仅保底保障(Burstable)
性能稳定性极高(无资源争抢,无被淘汰风险)较低(资源争抢,性能波动大)

三、 关键补充:QoS 等级 vs Pod 优先级类(PriorityClass)

很多人会混淆「QoS 等级(Guaranteed/Burstable)」和「Pod 优先级类(PriorityClass)」,这里明确区分,避免你误解:

  1. QoS 等级:本文讨论的核心,是「资源保障优先级」,决定 Pod 运行时的存活和资源抢占规则,由 requests/limits 自动判定,无额外配置;
  2. Pod 优先级类(PriorityClass):是「调度权重优先级」,决定多个 Pod 之间的调度顺序(权重高的先调度),可手动配置,与 QoS 等级无关。

重要结论:即使两个 Pod 配置了相同的 PriorityClassGuaranteed Pod 的实际运行优先级(存活/资源保障)依然高于默认共享 Pod,因为 QoS 等级是底层资源保障的核心,PriorityClass 仅影响调度阶段的顺序。

四、 贴合你的需求:为什么管理池适合用 Guaranteed Pod?

你的核心需求是「业务/管理池硬隔离,管理池不被业务池挤占」,而 Guaranteed Pod 的高优先级正好契合这个需求:

  1. 管理池 Pod(监控、运维、日志等)配置为 Guaranteed,开启 static 策略绑定专属 cpuset 核,既能获得物理核硬隔离,又能获得高优先级保障,不会被业务池的共享 Pod 挤占或淘汰;
  2. 业务池 Pod 可配置为 Burstable(支持超卖共享),优先级低于管理池,即使业务池资源耗尽,也不会影响管理池的稳定运行。

五、 验证:快速查看 Pod 的 QoS 等级和优先级

# 1. 查看 Pod 的 QoS 等级
kubectl describe pod <pod-name> -n <namespace> | grep -i "QoS Class"

# 2. 查看 Pod 的 oom_score_adj 值(验证 OOM 优先级)
# 先获取 Pod 的容器 ID
CONTAINER_ID=$(kubectl describe pod <pod-name> -n <namespace> | grep -i "Container ID" | awk -F '/' '{print $NF}')
# 进入节点,查看容器的 oom_score_adj
ssh <node-ip> cat /proc/$(docker inspect -f '{{.State.Pid}}' $CONTAINER_ID)/oom_score_adj

总结

  1. 是的,Guaranteed Pod 的优先级(调度+运行)显著高于默认的共享 Pod(Burstable/BestEffort);
  2. 核心差异体现在「资源预留优先」「最后被淘汰」「最难被 OOM 杀死」,且开启 static 策略后还能获得物理核独占保障;
  3. 你的管理池适合用 Guaranteed Pod,保障稳定;业务池适合用 Burstable Pod,支持超卖共享,两者优先级差异可进一步强化池间隔离。