在流媒体巨头 Netflix 庞大的技术体系中,批处理计算一直承担着关键角色:从内容推荐模型的训练、视频转码任务的调度,到数据仓库的 ETL 流程,无数后台作业每天在数千台服务器上并行运转。然而,随着微服务化和容器化程度的加深,传统批处理作业与 Kubernetes 集群之间的适配问题逐渐凸显——资源争抢、优先级混乱、任务排队效率低下,成为制约运维效率的隐形瓶颈。近日,Netflix 公开披露了其内部采用开源项目 Kueue 的实践成果,向外界展示了如何通过这一轻量级调度器,让批处理计算在 Kubernetes 上实现“极简主义”运行。

痛点:批处理与 Kubernetes 的“水土不服”

Netflix 的云基础设施长期运行在 AWS 之上,并以容器编排系统 Titus 作为主力调度平台。但在向 Kubernetes 迁移的过程中,团队发现标准 Kubernetes 对批处理工作负载的支持存在天然短板:原生 Job 控制器仅能处理最基础的“创建-完成”生命周期,缺乏对队列优先级、资源共享、抢占机制等高级特性的内置支持。当多个业务部门同时提交大量批处理任务时,低优先级作业可能无限阻塞高优先级作业,或者大量空闲 Pod 长时间占用 GPU 等稀缺资源,导致整体集群利用率难以突破 50%。

“我们需要一种机制,既能像 Kubernetes 一样声明式管理资源,又能像传统批处理系统一样智能排队和调度。”Netflix 基础架构工程师在技术博客中写道。为此,团队将目光投向了 CNCF 沙箱项目——Kueue。

Kueue:为批处理量身打造的调度引擎

Kueue 最初由 Google 开发并于 2022 年开源,其核心设计理念是“作业级调度”——不同于 Kubernetes 默认的 Pod 级调度,Kueue 将整个批处理作业(Job)视为一个调度单元,根据全局资源配额和优先级策略,决定作业何时被允许创建 Pod。这意味着,Kueue 可以在不修改用户代码的情况下,为任何标准 Kubernetes Job 引入高级调度能力。

Netflix 的部署方案将 Kueue 与自定义配额系统深度集成。具体而言,团队为每个业务线定义了“资源集群”(ResourceFlavor)和“集群队列”(ClusterQueue),前者代表特定类型的计算资源(如 GPU、高内存节点),后者则负责根据权重、优先级和配额上限来分配资源。当用户提交一个批处理作业时,Kueue 会将其放入对应的本地队列(LocalQueue),然后由集群级调度器按策略决定何时放行。这一机制彻底解决了“低优先级作业抢占高优先级作业”的难题——Kueue 支持基于优先级的抢占,允许高优先级作业主动回收低优先级作业占用的资源。

实战效果:简化与提效的双重收获

据 Netflix 公布的内部数据,采用 Kueue 后,在运行同一批推荐模型训练任务时,集群的整体资源利用率从 45% 提升至 72%,平均作业等待时间降低了 60% 以上。更关键的是,运维复杂度显著下降:原本需要人工编写的资源抢占脚本、队列管理工具被统一替换为几个 Kubernetes CRD(自定义资源定义),所有调度策略均以 YAML 文件形式声明式管理。

“过去,每个业务团队都要自己维护一套批处理调度逻辑,现在 Kueue 像一层薄薄的抽象层,让批处理作业像普通 Web 服务一样‘即提即用’。”Netflix 的一位 SRE 工程师在内部技术分享中这样评价。

开源协作与未来展望

Netflix 并非 Kueue 的原作者,但此次实践为社区贡献了宝贵的生产级经验。团队在部署过程中发现了 Kueue 在动态资源预取、作业回退策略等方面的不足,并已向社区提交了多个 Pull Request,包括支持跨集群队列的弹性资源借用功能。目前,Kueue 已被多个大型企业采纳,包括 Spotify、Uber 和阿里巴巴等,其 CNCF 成熟度评级也即将从 Sandbox 提升至 Incubating。

对于流媒体行业而言,Netflix 的这次技术选型传递出一个明确信号:在云原生时代,批处理计算不再需要依赖 Splunk、Airflow 等传统工具链,Kubernetes 生态本身正在快速补齐能力短板。Kueue 的出现,让“一个集群,统一调度”的愿景离现实更近了一步。未来,随着 Kueue 支持更多异构计算资源(如 FPGA、TPU),并增强与 Prometheus 监控的联动,其有望成为云原生批处理领域的事实标准。

从 Netflix 的实践可以看出,简化从来不是功能的削减,而是复杂度的转化——Kueue 将隐形的调度逻辑显性化为声明式配置,让工程师得以聚焦业务逻辑本身。这或许正是云原生架构追求的终极目标:让基础设施变得透明,让创新不再受限于资源管理。