Kubernetes优先级与抢占机制让关键业务在资源紧张时可“插队”腾位,通过PriorityClass(集群级对象,名称映射整数值,值越大优先级越高)定义优先级,Pod通过priorityClassName字段关联;抢占仅驱逐更低优先级Pod、受PDB保护、不跨节点,需合理分层并启用PodPriority特性。

Kubernetes 优先级与抢占不是“谁先来谁先上”,而是让关键业务在资源紧张时能“插队”并腾出位置——它把调度从被动等待变成主动协调。
PriorityClass 是优先级的“身份证”
它是一个集群级对象,定义名称(比如 high-priority)和对应数值(比如 1000000)的映射。数值越大,优先级越高。系统预留了 system-cluster-critical(20亿级)给核心组件,普通业务应避开这个范围。
关键点包括:
- globalDefault 只能设为 true 一次,用于未声明优先级的 Pod 默认值;没设的话,默认优先级是 0
- 名称不能以 system- 开头,否则创建会失败
- value 必须是 32 位整数,建议控制在 10 亿以内,避免与系统预留冲突
- 可选字段 preemptionPolicy: Never 能让某类 Pod “不抢也不被抢”,适合有强稳定性要求的批处理任务
Pod 怎么获得优先级?
只需在 Pod 或其控制器(如 Deployment)模板中添加 priorityClassName 字段,指向已存在的 PriorityClass 名称。准入控制器会自动将对应 value 填入 Pod 的 spec.priority 字段。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
例如:
- Deployment 滚动更新时,新副本带 high-priority,旧副本若优先级低,可能被抢占腾出资源
- StatefulSet 中的 Pod 若设置了 priorityClassName,同样参与调度队列排序和抢占决策
- 未设置该字段的 Pod,按 globalDefault 或默认值 0 参与排序
抢占是怎么发生的?
当高优先级 Pod 卡在 Pending 状态,调度器不会干等,而是扫描节点,寻找能通过驱逐低优 Pod 来满足其资源请求的节点。
这个过程包含几个关键动作:
- 只驱逐比目标 Pod 优先级更低的 Pod(同优先级不抢)
- 被驱逐的 Pod 进入优雅终止期(默认 30 秒),超时则强制删除
- 受 PodDisruptionBudget(PDB)保护的 Pod 不会被抢占,这是安全底线
- 抢占不跨节点“借资源”——调度器只在目标节点上找可释放空间,不会把 A 节点的 Pod 赶走只为腾给 B 节点用
实际使用要注意什么?
优先级机制强大,但滥用会导致服务不稳定或资源饥饿。
- 集群管理员应通过 ResourceQuota 限制用户创建高 value 的 PriorityClass,防止恶意抢占
- 不要给所有业务都配 high-priority,否则等于没分层;建议按业务等级划分 3–4 档(如 critical / high / medium / low)
- 启用前确认 kube-scheduler 和 kube-apiserver 已开启 PodPriority 特性开关(K8s v1.14+ 默认开启,旧版本需手动配置)
- 被抢占的 Pod 由其控制器(如 ReplicaSet)重新拉起,需确保控制器配置合理,避免反复抢占循环

















