← 返回信息流
AI 资讯Hacker News·2 天前

Netflix 利用 Kueue 简化批处理计算

原标题:Netflix Simplified Batch Compute with Kueue

速览

Netflix 宣布采用 Kueue 来简化和优化其批处理计算工作负载。这一举措旨在提升资源调度效率,降低系统复杂性。该方案有助于更高效地管理大规模数据处理任务。

AI 深度解读

Netflix 利用 Kueue 简化批量计算:从资源争用到精细化调度

背景

在大规模分布式系统中,计算资源的分配往往面临两难困境:一方面,实时性要求高的在线服务(如视频流媒体播放、用户推荐算法)需要低延迟和高可用性;另一方面,后台批处理任务(如视频转码、大规模数据分析、模型训练)虽然对延迟不敏感,但需要大量的计算资源,且通常具有突发性。

Netflix 作为全球领先的流媒体平台,每天处理着海量的视频数据和用户行为日志。其基础设施中运行着成千上万个微服务,其中既有对延迟极其敏感的实时 API,也有资源密集型的批处理作业。传统的资源调度方式往往采用静态划分或简单的优先级抢占,这导致了两个主要问题:

  1. 资源碎片化与浪费:批处理任务往往无法充分利用预留的资源,或者在高峰期与在线服务发生资源竞争,导致性能抖动。
  2. 调度复杂性高:为了平衡在线与离线负载,运维团队需要编写复杂的自定义调度逻辑,维护成本高且容易出错。

为了解决这些问题,Netflix 工程团队引入了 Kueue(Kubernetes Job Queueing),这是一个基于 Kubernetes 的作业队列管理器。Kueue 允许管理员定义“资源配额”和“队列”,从而实现对批处理任务的精细化控制,确保在线服务的质量(QoS),同时提高集群的整体资源利用率。

核心内容

Netflix 的工程团队在内部技术博客中分享了他们如何利用 Kueue 重构其批处理工作负载的调度策略。以下是其实施过程和技术细节的深度解读:

1. 从“尽力而为”到“受控队列”

在采用 Kueue 之前,Netflix 的批处理任务主要依赖 Kubernetes 默认的调度器。这些任务通常被标记为“尽力而为”(Best Effort)或具有较低的优先级,这意味着当在线服务资源紧张时,批处理任务会被驱逐。然而,这种机制缺乏细粒度的控制:

  • 缺乏排队机制:任务一旦提交,要么立即运行,要么被拒绝,没有中间状态。这导致任务提交瞬间的峰值可能压垮集群。
  • 资源预留不足:无法保证特定类型的批处理任务(如紧急的数据清洗)在资源充裕时能优先获得资源。

Kueue 的引入改变了这一局面。它作为一个 Kubernetes 的扩展控制器运行,不直接调度 Pod,而是管理“作业队列”(Job Queues)。管理员可以定义不同的队列,每个队列关联特定的资源配额(如 CPU、内存、GPU)。

2. Kueue 的核心架构与工作机制

Kueue 的核心概念包括:

  • ClusterQueue:这是资源池的抽象。它将集群中的可用资源划分为不同的池,每个池可以指定允许运行的最大资源量。
  • LocalQueue:这是用户提交作业的地方。每个命名空间或团队可以拥有一个或多个 LocalQueue,它们指向一个 ClusterQueue。
  • Admission Policy:决定作业何时被“批准”(Admitted)并实际创建 Pod。Netflix 主要使用“基于资源”的准入策略,即只有当 ClusterQueue 中有足够的剩余资源时,作业才会被批准。

在 Netflix 的实施中,他们将在线服务(如 API 网关、推荐服务)的资源隔离在独立的 ClusterQueue 中,并设置为高优先级。批处理任务则被分配到不同的 LocalQueue,这些队列共享一个或多个 ClusterQueue,但受到严格的资源上限限制。

3. 解决“资源争用”的具体策略

Netflix 面临的一个典型场景是:视频转码任务(Batch)和实时推荐查询(Online)同时运行。

  • 隔离与保障:通过 Kueue,Netflix 为在线服务预留了固定的资源池。无论批处理任务多么繁忙,它们都无法消耗在线服务所需的资源。这确保了视频播放的流畅性和推荐结果的实时性。
  • 弹性利用空闲资源:当在线服务负载较低时,Kueue 允许批处理任务使用集群中剩余的资源。一旦在线服务负载上升,Kueue 会自动暂停或驱逐部分批处理任务,将资源释放给在线服务。
  • 优先级与公平性:对于批处理任务内部,Netflix 也定义了不同的优先级。例如,实时数据分析任务比离线日志归档任务具有更高的优先级。Kueue 确保高优先级的批处理任务在资源可用时能更快获得执行机会。

4. 实施挑战与解决方案

  • 配置复杂性:初始阶段,定义合理的 ClusterQueue 和 LocalQueue 映射关系较为复杂。Netflix 通过自动化脚本和内部工具,将业务团队的资源需求自动映射到 Kueue 配置中,降低了运维负担。
  • 监控与可观测性:Kueue 提供了详细的指标(Metrics),如队列等待时间、作业批准率等。Netflix 将这些指标集成到其现有的监控系统中,以便实时观察批处理任务的执行状态和资源使用情况。
  • 兼容性:Kueue 与现有的 Kubernetes 工作负载(如 CronJob、Job)完全兼容。Netflix 无需修改现有的批处理作业代码,只需调整提交方式,将其指向相应的 LocalQueue 即可。

关键要点

  • 精细化资源控制:Kueue 通过队列和配额机制,实现了对批处理任务资源的细粒度控制,避免了资源争用对在线服务的影响。
  • 动态资源利用:系统能够根据在线服务的负载动态调整批处理任务可使用的资源量,最大化集群的资源利用率。
  • 优先级管理:支持多层级优先级,既保障了在线服务的高优先级,也实现了批处理任务内部的公平调度。
  • 简化运维:通过声明式配置,减少了自定义调度逻辑的开发和维护成本,提高了系统的可维护性。
  • 无缝集成:Kueue 作为 Kubernetes 的扩展,无需修改现有应用代码,即可实现平滑迁移和部署。

意义与影响

Netflix 对 Kueue 的成功应用,为大规模云原生环境下的资源调度提供了重要的参考案例。其意义体现在以下几个方面:

  1. 提升系统稳定性:通过隔离在线和离线负载,显著降低了因批处理任务波动导致的在线服务性能下降风险,提升了用户体验。
  2. 优化成本效益:更高的资源利用率意味着在相同硬件投入下可以处理更多的工作负载,从而降低了基础设施成本。
  3. 推动 Kubernetes 生态发展:Netflix 的实践证明了 Kueue 在处理复杂调度场景下的有效性,促进了该工具在更广泛社区中的采用和成熟。
  4. 为 AI/ML 工作负载提供借鉴:随着 AI 模型训练和推理需求的激增,如何高效调度 GPU 等资源成为关键挑战。Kueue 的队列管理机制为 AI 工作负载的资源管理提供了可借鉴的模式。

总之,Netflix 利用 Kueue 简化批量计算,不仅解决了自身的技术痛点,也为行业提供了在云原生环境下平衡在线服务与批处理任务调度的最佳实践。这一案例强调了在现代分布式系统中,精细化资源管理和自动化调度对于保障业务连续性和优化成本的重要性。

查看原文 →netflixtechblog.com