Netflix 通过 Kueue 简化批处理计算
摘要
Netflix 描述了将其批处理计算工作负载从自定义解决方案(CMB)迁移到 Kueue(一个 Kubernetes 原生的作业排队系统),以简化管理并利用 Kubernetes 生态系统。
暂无内容
查看缓存全文
缓存时间:
2026/06/30 03:33
# Netflix 如何借助 Kueue 简化批处理计算
来源:https://netflixtechblog.com/how-netflix-simplified-batch-compute-with-kueue-87860682629c?gi=28fce34af23a
Netflix 技术博客 (https://netflixtechblog.medium.com/?source=post_page---byline--87860682629c---------------------------------------)
作者:Alvin Bao (https://www.linkedin.com/in/alvinbao/)、Alex Petrov (https://www.linkedin.com/in/alex-petrov-vt/)、Jennifer Lai (https://www.linkedin.com/in/jennifernlai/)、Aidan Sherr (https://www.linkedin.com/in/aidan-sherr/)、Samartha Chandrashekar (https://www.linkedin.com/in/samartha/)
在 Netflix 计算基础设施向更 Kubernetes 原生方向转型的过程中,我们积极将 Kubernetes 生态中的组件融入容器平台 Titus (https://medium.com/netflix-techblog/titus-the-netflix-container-management-platform-is-now-open-source-f868c9fb5436)。其中一个例子是我们使用了 Kueue (https://kueue.sigs.k8s.io/)——一个用于批处理工作负载的云原生任务排队系统。它很大程度上替代了我们自研托管批处理解决方案 Compute Managed Batch(CMB)中的自定义排队和调度逻辑。本文将概述迁移的动机、如何将数百万批处理任务迁移到 Kueue,以及 Kueue 让我们能作为计算平台提供哪些新功能。
## CMB 与 Titus 简要概述
CMB 是一个托管批处理解决方案,允许用户和应用程序执行并管理工作负载直至完成。通过租户层级结构,工作负载按照优先级有序排队和执行,容量按租户进行管理。提交到 CMB 的工作负载随后在 Titus 上运行。Titus 中与 CMB 相关的功能包括:跨多个单元(Kubernetes 集群)的工作负载联邦,以及联邦容量预留。这意味着 CMB 可以与单个 Titus 端点通信,以获取/提交工作负载并更新容量预留,而无需关心底层的单元/集群拓扑。
### CMB 租户层级
租户为特定组织、平台或应用程序提交的任务提供了分组机制。用户可以根据其组织或用例自行创建和组织租户。例如,一个组织可以在多个应用程序中使用单个租户,也可以使用与团队和应用程序所有权结构相匹配的复杂层级结构。
租户与容量配置相关联。容量配置定义了租户可用的计算容量,并提供了与其他租户隔离的某种保证。容量配置包含权重(用于公平共享)和资源维度。
CMB 中有两种类型的租户:
1. **内部租户**——用于促进租户树的创建。内部租户的子级可以是内部租户,也可以是叶子租户。内部租户本身不接受工作,因此没有关联的队列。
2. **叶子租户**——可以接受工作,并有与之关联的队列。叶子租户不能有任何子级。
关于容量配置,租户可以使用两种类型的容量:
**预留容量**
对于内部租户,如果用户指定了预留容量,则该容量会在子树中公平共享,并可供该内部租户下的叶子租户使用。
对于叶子租户,如果用户指定了预留容量,则会在层级结构内划分容量,使得其他租户无法预留相同的资源。这些预留资源不与任何其他租户共享,从而确保特定叶子租户的吞吐量。
**共享容量**
计算团队维护一个全局共享容量池,任何租户除了其预留容量外,还可以突发使用该池。使用 CMB 并不要求预留容量,因此一个租户可以完全耗尽共享容量。该池在租户之间公平共享,但在 CMB 中,这仅适用于准入阶段:CMB 没有抢占机制,因此一旦任务被准入,无论公平共享需求如何变化,它都会运行至完成。
Kueue 改变了**两种**类型容量的语义,公平共享与抢占部分将对此进行说明。
以下是一个租户层级的示例:
按回车键或点击查看全尺寸图片
### CMB 用户/应用程序工作负载提交流程
按回车键或点击查看全尺寸图片
### CMB 用户/应用程序租户管理流程
按回车键或点击查看全尺寸图片
## 为什么选择 Kueue?
CMB 创建于 2018 年,早于或与当今许多开源批处理计算产品同期。多年来,随着 Kubernetes 生态的发展,CMB 提供或努力提供的许多功能(例如公平共享、层级租户、容量管理、优先级排队)都已包含在这些开源项目中。此外,当 CMB 与底层 Kubernetes 集群严重脱节时,开发抢占等新功能变得越来越繁琐。
## 在收件箱中获取 Netflix 技术博客的故事
免费加入 Medium,获取该作者的最新更新。
记住我以便更快登录
团队评估了如何现代化我们的批处理抽象,并最终选择了 Kueue,原因如下:
1. 与 YuniKorn 或 Volcano 等其他选项不同,Kueue 不会取代 kube-scheduler 的 Pod 调度,从而允许与现有的 Titus 调度配置集成。替换 Titus 调度配置可能会导致任务放置碎片化,进而损害效率。
2. 采用势头和创新速度。
3. Kueue 支持跨异构硬件的多租户配额管理。
4. Kueue 可以操作 `v1.Pod` 和 `batch/v1.Job` 等原语,同时也支持 RayJob / RayCluster 等更高级的抽象,便于未来扩展。
5. Kueue 具有团队本想在 CMB 中实现的原生功能,例如抢占、全有或全无调度、拓扑感知调度。
## 迁移至 Kueue
将 CMB 工作负载迁移到 Kueue 的这一举措被称为 Netflix Batch。我们迁移的关键原则如下:
1. 迁移对 CMB 最终用户应零操作,完全透明。
2. 容器启动速率和总体最大吞吐量不降级。
3. 用 Kueue 替换 CMB 的排队和调度。
### Netflix Batch 用户/应用程序工作负载提交流程
按回车键或点击查看全尺寸图片
新旧流程的关键区别在于,我们将排队和调度委托给 Kueue,并在每个启用 Kueue 的 Titus 单元中启用该功能。Titus 联邦使用我们自定义的 Kueue 路由器将任务路由到 Kueue 单元。
### Netflix Batch 用户/应用程序租户管理流程
按回车键或点击查看全尺寸图片
对于我们操作人员而言,迁移就像在 UI 中点击一个租户按钮(如上例所示)一样简单。这也使得我们能够轻松回滚更改(如果出现问题)。
在底层,这种注册操作会将内部租户转换为 Cohort (https://kueue.sigs.k8s.io/docs/concepts/cohort/),将叶子租户转换为 ClusterQueue (https://kueue.sigs.k8s.io/docs/concepts/cluster_queue/) + LocalQueue (https://kueue.sigs.k8s.io/docs/concepts/local_queue/)。给定租户上的容量配置将转换为资源口味和名义配额。该架构如下所示:
按回车键或点击查看全尺寸图片
### 经验教训
1. 保持 API 对等性 (https://kyle.cascade.family/posts/how-to-actually-migrate-complex-systems-in-infrastructure/) 与现有系统(而非暴露新的 API 接口),并作为第一步迁移底层组件,通过分散风险来降低项目风险,同时确保不影响客户体验。
2. 不要等到最后才迁移最复杂的用例。我们很早就决定首先迁移最大、最复杂的客户。这让我们建立了信心,相信之后可以无问题地将其他客户迁移到 Netflix Batch,并且生产迁移仅持续了 4 周。
3. 我们必须以比默认配置高得多的 QPS、Burst 和 groupKindConcurrency 来运行 Kueue,以满足吞吐量需求。通过在模仿 Titus 的开发环境中运行负载测试,我们很早就规避了这一风险。
## Netflix 中 Kueue 的当前状态
Kueue 已在生产环境中全面部署,管理着数百万批处理工作负载。未来,我们正在考虑将更多 Titus 批处理工作负载纳入这一更托管化的体验中。我们还生产化了更多的公平共享和抢占功能,以更好地利用预留容量。此外,我们的经验教训正被其他内部团队(包括构建 Kubernetes 原生训练基础设施的团队)借鉴,以优化他们的任务调度和排队配置。
### 公平共享与抢占
借助 Kueue,基于抢占的公平共享 (https://kueue.sigs.k8s.io/docs/concepts/fair_sharing/#preemption-based-fair-sharing) 使得 Netflix Batch 能够在预留资源未被使用时将其借给其他租户,从而同时维护预留语义。此外,抢占允许 Netflix Batch 抢占低优先级工作负载,以便高优先级工作负载运行。对于我们的客户来说,这意味着租户可以更充分地利用预留中的空闲容量,提交更多任务而无需担心饿死,并且对关键业务工作负载的周转时间更快。
我们在 ClusterQueue 上使用的抢占配置示例如下:
```
apiVersion: kueue.x-k8s.io/v1beta2
kind: ClusterQueue
metadata:
name: "team-a-cq"
spec:
preemption:
reclaimWithinCohort: Any
withinClusterQueue: LowerPriority
```
部署这些功能后,计算团队观察到平均资源利用率显著提升。
## 致谢
这项工作离不开 Netflix 整个计算团队的出色贡献。
相似文章
X AI KOLs Timeline
作者解释了如何构建一个能够在恒定时间内每秒启动数百万个沙箱的计算平台,重点介绍了使用Cassandra和S3进行解耦调度和能力聚合。
Hugging Face Blog
本文解释了如何为LLM推理实现异步连续批处理,将CPU批处理准备与GPU计算重叠,以最大化利用率并减少空闲时间。
OpenAI Blog
OpenAI 分享了将 Kubernetes 扩展到 2,500 个节点的基础设施经验教训,详细介绍了容器镜像拉取的优化方案,包括 kubelet 配置更改、Docker overlay2 迁移和预加载策略,以解决 Pending pod 的问题。
OpenAI Blog
# Kubernetes 扩展到 7,500 个节点 来源:[https://openai.com/index/scaling-kubernetes-to-7500-nodes/](https://openai.com/index/scaling-kubernetes-to-7500-nodes/) OpenAI将单个 Kubernetes 集群扩展到这个规模很少见,需要特殊的关注,但好处是提供了一个简单的基础设施,让我们的机器学习研究团队能够更快地迭代并扩展,而无需改变代码。从我们之前关于[扩展到 2,500 个节点](https://openai.com/index/scaling-kube)的文章以来
X AI KOLs Timeline
一篇介绍连续批处理的博客文章,该技术通过动态地将新请求添加到已完成请求的批次中,持续保持GPU忙碌并减少空闲时间,从而提高LLM服务吞吐量。