k8s中关键服务总是“死得早”?你可能忽略了这个调度细节!

132 阅读3分钟

在多租户或资源紧张的集群中,一个再正常不过的场景是:
普通业务Pod还在正常跑,核心交易服务却因为资源不足而调度失败。

这不是 Bug,也不是 Kubernetes 的错,而是你没有告诉集群:“谁更重要”。

Kubernetes 提供了 Pod Priority(优先级)与 Preemption(抢占)机制,用于确保关键服务拥有“生存优先权”。

本文将带你深入了解:

  • Pod Priority 的配置与等级划分;
  • 抢占机制如何工作,是否会“杀死”其他Pod;
  • 实战场景中如何防止误抢、如何优雅恢复;
  • 与亲和性、污点、HPA 等机制的协同使用技巧。

一、什么是 Pod Priority?

Pod Priority 是 Kubernetes 中的调度机制,用于定义 Pod 的重要级别,优先级高的 Pod 将在资源竞争中胜出。

优先级定义在一个对象上:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 100000
globalDefault: false
description: "用于核心业务服务的高优先级"

然后在 Pod 中引用:

spec:
  priorityClassName: high-priority

内置与自定义优先级值

  • Kubernetes 本身没有强制内置的数值划分,但推荐值范围:
    • 普通服务:value: 1000
    • 管理组件:value: 10000
    • 核心业务服务:value: 100000

官方文档推荐优先级值在 [-1000000000, 1000000000] 之间设置。


二、抢占机制:当资源不足时的生存战争

当资源不足时,调度器发现一个高优 Pod 无法被调度,就会触发 抢占(Preemption)  流程:

  1. 计算满足其需求的节点
  2. 判断该节点上是否可以“驱逐”低优 Pod 以空出资源
  3. 选择驱逐的目标 Pod(不会立即删除,而是先发送终止信号)
  4. 高优 Pod 调度成功

抢占不会随意生效

Kubernetes 会尽量避免抢占,触发时也优先选择“代价最小”的方式:

  • 会优先踢掉不带 PodDisruptionBudget 的 Pod;
  • 会避免破坏 Deployment/StatefulSet 的最小副本数。

三、实战:如何正确使用 Pod Priority?

✅ 使用场景

场景推荐优先级设置
核心业务Pod(交易、支付等)high-priority
管理面组件(如Prometheus)medium-priority
离线批处理任务low-priority

⚠️ 避免陷阱

  • 抢占风险:不要设置太多高优 Pod,否则可能出现“抢占风暴”;
  • 不适用于DaemonSet:优先级不会对 DaemonSet 起作用;
  • 配合 PodDisruptionBudget 使用:保护被抢占 Pod,限制抢占频率。

四、结合其他调度机制的使用建议

机制说明
与 Taints 搭配高优 Pod 配容忍,可调度到特定节点
与 HPA 搭配高优 Pod 若需要扩容,优先触发抢占
与 Anti-Affinity 搭配控制高优 Pod 不与其他同类型业务相邻

五、未来趋势与建议

  • Kubernetes 社区对抢占策略在不断优化(参考:K8s v1.26 的抢占稳定性改进提案);
  • 可以结合 ResourceQuota + LimitRange,从资源限制层面强化调度策略;
  • 如需更精细的抢占控制,可配合调度器插件或自定义调度器实现抢占可控性(如仅抢占某命名空间内 Pod)。

总结:保障核心Pod,“讲优先级”的时代已经到来

Pod 优先级与抢占机制,是 Kubernetes 为多租户环境设计的一种 调度博弈解决方案
合理使用 Priority,可以让核心业务“不饿死”,让辅助业务“知进退”。

在生产中掌握这项机制,将极大提升集群的弹性、稳定性与服务等级保障能力。