Kueue - 为 Kubernetes 任务队列带来秩序
想象一下这种情况:你的 Kubernetes 集群正在满负荷运行。一方面,关键的 ML 模型正在训练;另一方面,分析师们启动了资源密集型的 ETL 流程;在后台某处,还有数十个 CI/CD 任务正在运行。所有这些都需要 GPU、CPU、内存,而且当然,每个人都希望"马上"获得资源。听起来很熟悉?结果是,有些任务处于空闲状态,而另一些任务却抢走了更高优先级任务的资源,集群运行效率低下。对于在 Kubernetes 中管理批处理工作负载的人来说,这是一个让人头疼的问题。
Kueue 旨在解决的问题——这是 kubernetes-sigs 的一个项目,其名称字面意思就是"队列"。它不仅仅是一个调度器,而是一个功能完善的队列管理器,与 Kubernetes 深度集成,让你能够真正高效地管理任务的完整生命周期。
什么是 Kueue,谁需要它?
Kueue 是一组 API 和一个控制器,作为 Kubernetes 任务的智能调度器。它的主要职责是决定任务何时可以被准入执行(即何时可以为其创建 Pod),以及何时值得停止任务(移除活跃的 Pod)以释放资源给更高优先级的任务。
谁会从中受益?首当其冲的是活跃使用 Kubernetes 的团队:
- 机器学习和数据处理:ML 工程师和数据科学家经常启动大量需要大量 GPU 和 CPU 的训练任务。Kueue 有助于公平分配这些昂贵的资源。
- ETL 流程:数据提取、转换和加载任务可能非常消耗资源,需要仔细规划。
- CI/CD 流水线:自动化构建和测试,尤其是在大型项目中,会给集群带来峰值负载。
- 任何其他批处理任务:如果你有定期运行并竞争资源的后台进程,Kueue 就是你的救星。
本质上,Kueue 允许你将混乱的任务流转化为有序、高效管理的队列,资源按照你的规则和优先级进行分配。
改变游戏规则的 Kueue 关键特性
Kueue 不仅仅是将任务放入队列——它提供了一整套微调和优化工具。让我们来看看最有趣的功能。
1. 智能任务和优先级管理
告别手动资源分配或试图模拟队列的脚本。Kueue 提供了灵活的任务管理机制:
- 优先级:你可以为各种任务分配优先级。例如,训练关键模型的任务可以比夜间报告拥有更高的优先级。
- 队列策略:Kueue 支持两种主要策略:
StrictFIFO:经典的"先来先服务"队列。简单直接。BestEffortFIFO:更灵活的方法,尽可能早地启动任务,即使它们不在队列的最前面,只要有空余资源。这可以防止当资源可用但队列"头部"正在等待特定条件时集群出现空闲时间。
想象一下,你有多个团队,每个团队都在启动自己的任务。Kueue 允许你根据预定义的规则定义谁可以在什么时候访问集群。
2. 高级资源管理和公平分配
这可以说是 Kueue 最强大的方面之一。它远远超越了基本的 Kubernetes 调度,提供:
- 资源 Flavor 可替代性:假设你有不同型号的 GPU(例如 NVIDIA A100 和 V100)。可以配置 Kueue,让需要 GPU 的任务在有空闲时可以使用其中任何一种,而不必等待特定型号。这最大限度地提高了硬件利用率。
- 公平共享和 Cohort:如果你有多个团队或部门共用一个集群,Kueue 可以保证他们都不会垄断资源。你可以将队列组合成"cohort"并设置配额,以便在他们之间公平分配资源。例如,ML 团队可能获得 60% 的资源,分析团队获得 40%。
- 抢占:在紧急情况下,Kueue 可以抢占(停止)较低优先级的任务,以释放资源给更重要的任务。当涉及紧急任务或故障恢复时,这尤其有价值。
3. 与流行任务类型的广泛集成
Kueue 不依赖任何单一的任务类型。它内置支持多种流行的工作负载,使其成为一个多功能工具:
- 标准 Kubernetes BatchJob:当然,离不开它们。
- Kubeflow 训练任务:非常适合使用 Kubeflow 进行模型训练的 ML 工程师。
- RayJob 和 RayCluster:支持基于 Ray 的分布式计算。
- JobSet:用于管理相关任务的组。
- 普通 Pod 和 Pod 组:甚至适用于简单的 Pod 及其组。
- Deployment 和 StatefulSet:有趣的是,Kueue 甚至可以管理服务类工作负载,允许你混合训练和推理,动态分配资源。
这意味着你不必为每种任务类型都重新发明轮子——Kueue 开箱即用,可以与你的技术栈配合工作。
4. 自动扩缩容和多集群
在现代世界中,集群很少是静态的,有时也不局限于单个地理位置。Kueue 考虑了这些现实情况:
- 高级自动扩缩容支持:Kueue 可以与 Cluster Autoscaler 集成,使用
provisioningRequest实现更智能的集群扩缩容,仅在队列中的任务真正需要时才请求新节点。 - MultiKueue 多集群调度:这太棒了!如果你有多个集群(例如在不同区域或云中),MultiKueue 允许你在它们之间搜索空闲容量并迁移任务。这提供了令人难以置信的灵活性和弹性,能够有效利用全球资源。
- 拓扑感知调度:通过考虑数据中心拓扑的调度来优化 Pod 之间的通信带宽。这对于高性能计算至关重要。
技术细节:Kueue 的内部原理
Kueue 作为原生 Kubernetes 控制器构建,这意味着与生态系统的深度集成。它使用自己的自定义资源定义(CRD)扩展 Kubernetes,用于定义队列、配额和工作负载。这允许你使用标准的 kubectl 命令进行管理,非常方便。
该项目在 kubernetes-sigs(特别兴趣小组)的积极开发下,确保符合 Kubernetes 标准并获得长期支持。目前 API 处于 v1beta2 版本,表明其成熟度和稳定性。团队正在积极向 v1 过渡。
我对项目的测试水平感到惊喜:针对各种 Kubernetes 版本(最高 1.35)和用例(包括 MultiKueue 和拓扑感知调度)的广泛单元、集成和 E2E 测试。这让人对解决方案的可靠性充满信心。
此外,Kueue 提供 Prometheus 指标,可以轻松监控队列和资源状态,并配有详细文档帮助你快速上手。
实际应用:真实场景中的样子
让我们看看 Kueue 如何改变你的工作流程:
- ML 平台:数据科学家提交了一个模型训练任务。Kueue 没有让任务等待特定 GPU 空闲,而是将其放入队列。当合适的 GPU 可用时(可能在较低优先级任务完成后,甚至在抢占之后),Kueue 启动训练。如果集群过载,MultiKueue 可以自动将任务重定向到另一个负载较轻的集群。
- 大数据处理:夜间 ETL 流程启动,但发现由于白天分析查询,资源有限。Kueue 将其放入队列,当资源释放后(或较低优先级任务被抢占后),流程启动。在这种情况下,Kueue 可以保证没有团队会"吃光"所有资源,确保公平分配。
- 微服务的 CI/CD:开发团队正在积极提交代码,启动数十个构建和测试。Kueue 管理这些任务,保证关键构建(例如生产环境)优先于测试分支,并尽可能高效地使用集群资源,不会出现空闲时间。
安装 Kueue 非常简单,需要 Kubernetes 1.29 或更高版本。只需一条 kubectl apply 命令:
kubectl apply --server-side -f https://github.com/kubernetes-sigs/kueue/releases/download/v0.15.2/manifests.yaml
之后,你可以配置队列并使用文档中的示例启动任务。
值得尝试 Kueue 吗?
如果你正在面临 Kubernetes 中的批处理任务管理问题,答案绝对是肯定的。Kueue 不仅仅是一个工具——它是一种高效资源利用和公平负载分配的理念。
它特别适合:
- 集群管理员和 SRE 工程师:用于建立秩序、优化资源利用和确保稳定性。
- MLOps 工程师和数据科学家:用于高效管理训练任务、推理和实验。
- 使用 Kubernetes 进行 CI/CD 或后台任务的开发者:用于加快流程并降低基础设施成本。
Kueue 是一个成熟、经过良好测试且积极开发的项目,拥有强大的社区。它已经被许多公司用于生产,这是其可靠性和实用价值的最好证明。如果你想充分利用你的 Kubernetes 集群并摆脱任务混乱,给 Kueue 一个机会——它不会让你失望!
相关项目