Kueue 中的抢占策略详解
Kueue 是一个 Kubernetes 原生的队列系统,用于管理工作负载的资源分配。当集群或队列组资源不足时,Kueue 提供了灵活的抢占机制来确保高优先级工作负载能够获得所需资源。以下是 Kueue 中抢占策略的详细说明:
抢占策略概述
抢占策略通过 spec.preemption
字段配置,包含三种主要策略类型:
reclaimWithinCohort
- 队列组内资源回收borrowWithinCohort
- 队列组内资源借用时的抢占withinClusterQueue
- 集群队列内部的抢占
如果不设置这些策略,默认都是不开启抢占功能。
1. reclaimWithinCohort(队列组内资源回收)
当队列中出现排队工作负载时,此策略决定如何从借用了该队列资源的其他队列回收资源。
可选值:
- Never(默认值):不触发资源回收
- LowerPriority:仅当资源被优先级较低的工作负载借用时触发回收
- Any:不考虑优先级,直接回收被借用的资源
工作流程:
- 检查当前队列的 nominalQuota 是否足够满足新工作负载
- 如果不足,检查资源是否被队列组内其他队列借用
- 根据策略决定是否回收这些资源
2. borrowWithinCohort(队列组内资源借用时的抢占)
此策略控制当队列需要从队列组借用资源时,是否可以通过抢占其他队列的资源来获得。
前提条件:
- 必须同时开启
reclaimWithinCohort
并设置为非 Never 值
配置参数:
maxPriorityThreshold
:设置可被抢占的工作负载的最高优先级阈值policy
:抢占策略类型
策略类型:
- Never(默认值):不允许通过抢占来借用资源
- LowerPriority:只允许抢占优先级低于当前工作负载的资源
3. withinClusterQueue(集群队列内部抢占)
此策略控制是否可以在同一集群队列内抢占其他工作负载的资源。
可选值:
- Never(默认值):不开启队列内抢占
- LowerPriority:只能抢占优先级低于自身的工作负载
- LowerOrNewerEqualPriority:更复杂的抢占规则:
- 可以抢占优先级低于自身的工作负载
- 对于相同优先级的工作负载,只能抢占比自身创建时间晚的工作负载(防止大任务被饿死)
策略组合与交互
这些策略可以组合使用,形成多层次的资源保障机制:
- 首先尝试从本队列回收被借出的资源(reclaimWithinCohort)
- 如果仍不足,尝试从队列组其他队列抢占资源(borrowWithinCohort)
- 最后考虑从本队列其他工作负载抢占资源(withinClusterQueue)
使用场景示例
场景1:确保高优先级工作负载优先运行
preemption:
reclaimWithinCohort: LowerPriority
borrowWithinCohort:
maxPriorityThreshold: 100
policy: LowerPriority
withinClusterQueue: LowerPriority
场景2:严格保障队列资源不被抢占
preemption:
reclaimWithinCohort: Never
borrowWithinCohort:
policy: Never
withinClusterQueue: Never
场景3:公平调度,防止大任务饿死
preemption:
withinClusterQueue: LowerOrNewerEqualPriority
这些策略的组合为集群管理员提供了精细化的资源管理能力,可以根据不同工作负载类型和组织策略进行灵活配置。