集群资源紧张时,高优任务可能会因资源不足而无法运行。开启抢占(Preemption)后,ACK Scheduler能够通过资源模拟判断并驱逐低优任务Pod,释放计算资源以优先保障高优任务快速启动。
抢占策略介绍
一次抢占任务的核心流程如下:
标记任务优先级:为工作负载Pod添加
priorityClassName
,声明Pod的优先级。系统组件(例如 kube-proxy、etcd)通常被显式标记为高优先级(例如
system-node-critical
),并且由于 DaemonSet 等特性,默认不会被驱逐。资源不足时“模拟抢占”:检测到新任务调度资源不足时,ACK Scheduler会模拟是否能够关闭某些低优任务,为更高优的任务抢占足够的资源。
安全驱逐低优任务:ACK Scheduler 触发抢占逻辑后,节点 kubelet 会根据指令安全地驱逐低优 Pod,释放资源以完成高优任务的调度。
低优任务重新调度:被驱逐的低优Pod会被Controller(例如Deployment Controller)重新创建,寻找其他可用节点。若集群资源持续紧张,重新调度的 Pod 可能仍无法运行,处于Pending状态。
ACK Scheduler默认支持以下抢占策略,您可通过PreemptionAlgorithm
参数进行管理和配置。
策略 | 说明 |
Default | Kubernetes社区默认抢占机制,即首先尝试直接调度,资源不足时模拟资源的抢占,确定抢占后执行低优Pod的驱逐,完成高优Pod的调度。详情请参见Pod优先级和抢占。 |
ElasticQuota | 基于ElasticQuotaTree进行抢占。
|
Auto | 根据集群配置调整抢占策略。简单来说,优先使用ElasticQuota策略,并在ElasticQuota策略无法生效时自动调整为Default策略。 |
None | 不开启抢占能力,即集群中不发生任何抢占行为。 |
开启抢占能力时,抢占策略的生效逻辑如下。
启用步骤
开启抢占前,建议您已参见Pod优先级和抢占了解相关概念。
您可以通过自定义调度器参数,配置preemptionAlgorithm以启用抢占。默认参数为Auto策略。