开启抢占

集群资源紧张时,高优任务可能会因资源不足而无法运行。开启抢占(Preemption)后,ACK Scheduler能够通过资源模拟判断并驱逐低优任务Pod,释放计算资源以优先保障高优任务快速启动。

抢占策略介绍

一次抢占任务的核心流程如下:

  1. 标记任务优先级:为工作负载Pod添加priorityClassName,声明Pod的优先级。

    系统组件(例如 kube-proxy、etcd)通常被显式标记为高优先级(例如 system-node-critical),并且由于 DaemonSet 等特性,默认不会被驱逐。
  2. 资源不足时“模拟抢占”:检测到新任务调度资源不足时,ACK Scheduler会模拟是否能够关闭某些低优任务,为更高优的任务抢占足够的资源。

  3. 安全驱逐低优任务:ACK Scheduler 触发抢占逻辑后,节点 kubelet 会根据指令安全地驱逐低优 Pod,释放资源以完成高优任务的调度。

  4. 低优任务重新调度:被驱逐的低优Pod会被Controller(例如Deployment Controller)重新创建,寻找其他可用节点。若集群资源持续紧张,重新调度的 Pod 可能仍无法运行,处于Pending状态。

ACK Scheduler默认支持以下抢占策略,您可通过PreemptionAlgorithm参数进行管理和配置。

策略

说明

Default

Kubernetes社区默认抢占机制,即首先尝试直接调度,资源不足时模拟资源的抢占,确定抢占后执行低优Pod的驱逐,完成高优Pod的调度。详情请参见Pod优先级和抢占

ElasticQuota

基于ElasticQuotaTree进行抢占。

  1. 明确待抢占列表:区别于普通任务,ACK Scheduler会将整个Gang未调度的Pod组合成“待抢占列表”,仅当列表中所有Pod都能通过资源抢占被调度时,整个Gang才会被处理,否则将全部等待。若Gang中任何一个Pod设置了高优先级,整个队伍将采用这个最高优先级参与资源抢占。

  2. 生成可行节点列表:ACK Scheduler进一步判断哪些节点会被选中。规则如下。

    • Gang中有多个Pod需抢占:只要其中一个Pod能匹配某个节点条件,那么该节点会被加入候选池,后续再尝试是否能为所有Pod腾出资源。

    • 仅一个Pod需抢占:筛选Filter阶段已标记为不可调度(Unschedulable)的节点,更精确地定位资源不足或不匹配的节点。

  3. 模拟抢占:ACK Scheduler会尝试模拟抢占,在可行节点列表中根据以下条件筛选出可能被抢占的 Pod。基本条件如下:

    • 没有正在被其他Pod或任务抢占的Pod

    • 遵循PDB规则,可以被驱逐的Pod

    然后,根据集群的弹性配额(ElasticQuotaTree)配置,进一步分情况处理。

    • 集群中存在非空的 ElasticQuotaTree

      • 抢占者属于某个 Quota:

        • 若 Quota 使用量 ≤ Min资源量:该 Quota 的资源使用未超过“最低保障资源”,属于受保护资源,不可抢占。

        • 若 Quota 使用量 > Min资源量:仅允许抢占同一 Quota 内且优先级低于抢占者的 Pod。

      • 抢占者不属于任何 Quota:仅允许抢占不属于任何 Quota 且优先级低于抢占者的 Pod。

    • 集群中不存在 ElasticQuotaTree 或其为空:不涉及配额管理,允许抢占优先级低于抢占者的 Pod。

    筛选被抢占Pod后,ACK Scheduler会模拟移除这些 Pod,验证抢占者可否调度:若成功,被抢占 Pod 会跨节点重新调度,被安全驱逐;若失败,则终止抢占流程。

Auto

根据集群配置调整抢占策略。简单来说,优先使用ElasticQuota策略,并在ElasticQuota策略无法生效时自动调整为Default策略。

None

不开启抢占能力,即集群中不发生任何抢占行为。

开启抢占能力时,抢占策略的生效逻辑如下。

image

启用步骤

开启抢占前,建议您已参见Pod优先级和抢占了解相关概念。

您可以通过自定义调度器参数,配置preemptionAlgorithm以启用抢占。默认参数为Auto策略。