本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不再正确。
Poseidon-Firmament 调度器 – 基于流网络图的调度器
简介
云规模数据中心环境(也称为数据中心即计算机或仓库级计算 - WSC)中的集群管理系统,例如 Mesos、Google Borg、Kubernetes 等,通常通过执行以下任务来管理应用程序工作负载:跟踪机器的活跃状态、启动、监控、终止工作负载,更重要的是使用集群调度器来决定工作负载的放置位置。
集群调度器本质上执行将工作负载调度到计算资源的任务 – 将工作在全球 WSC 环境中的放置结合起来,可以使“仓库级计算机”更高效、提高利用率并节省能源。集群调度器的示例包括 Google Borg、Kubernetes、Firmament、Mesos、Tarcil、Quasar、Quincy、Swarm、YARN、Nomad、Sparrow、Apollo 等。
在这篇博客文章中,我们将简要介绍 Kubernetes 中基于新颖的 Firmament 流网络图的调度方法(OSDI 论文)。我们将具体介绍 Firmament 调度器,以及它如何使用 Poseidon 作为集成粘合剂与 Kubernetes 集群管理器集成。我们已经看到这种新颖的调度方法在吞吐量性能基准测试中表现非常出色。最初,Firmament 调度器是由剑桥大学的研究人员 Malte Schwarzkopf 和 Ionel Gog 构思、设计和实现的。
Poseidon-Firmament 调度器 - 工作原理
在很高的层面上,Poseidon-Firmament 调度器 通过在默认 Kubernetes 调度器的基础上加入基于新颖的流网络图的调度功能,增强了当前 Kubernetes 的调度能力。它将调度问题建模为基于流网络图的约束优化问题 - 通过将调度简化为最小成本最大流优化问题。由于固有的重新调度能力,新的调度器能够实现全局最优的调度环境,从而不断动态地改进工作负载的放置。
主要优势
基于流图调度的 Poseidon-Firmament 调度器 具有以下主要优势:
批量调度工作负载(Pod),以便在大规模情况下做出调度决策。
根据广泛的性能测试结果,随着集群中节点数量的增加,Poseidon-Firmament 的扩展性比 Kubernetes 默认调度器好得多。这是因为 Poseidon-Firmament 能够在工作负载之间分摊更多的工作。
当计算资源需求在作业(副本集/部署/作业)之间大致均匀的情况下,Poseidon-Firmament 调度器的吞吐量性能数字明显优于 Kubernetes 默认调度器。Poseidon-Firmament 调度器的端到端吞吐量性能数字(包括绑定时间)随着集群中节点数量的增加而持续提高。例如,对于 2,700 个节点的集群(在 此处的图中显示),Poseidon-Firmament 调度器实现的端到端吞吐量比 Kubernetes 默认调度器高 7 倍或更高,其中包括绑定时间。
可以实现复杂的规则约束。
Poseidon-Firmament 中的调度非常动态;它在每次调度运行时都将集群资源保持在全局最优状态。
资源利用率非常高。
Firmament 流网络图 - 概述
Firmament 调度器在流网络上运行最小成本流算法,以找到最优流,然后从中提取隐含的工作负载(Pod 放置)。流网络是一个有向图,其弧携带从源节点(即 Pod 节点)到接收器节点的流。与每个弧关联的成本和容量约束了流,并指定了其优先路线。
下图 1 显示了一个具有两个任务(工作负载或 Pod)和四个机器(节点)的集群的流网络示例 - 左侧的每个工作负载都是一个单元流的源。所有这些流都必须排放到接收器节点 (S) 中,才能获得优化问题的可行解。

图 1. 流网络示例
Poseidon 调解层 - 概述
Poseidon 是一项服务,充当 Firmament 调度器与 Kubernetes 的集成粘合剂。它通过在默认 Kubernetes 调度器的基础上加入基于新的流网络图的 Firmament 调度功能,增强了当前 Kubernetes 的调度能力;多个调度器同时运行。下图 2 描述了 Poseidon 集成粘合剂如何与底层基于 Firmament 流网络图的调度器协同工作的高级整体设计。

图 2. Firmament Kubernetes 集成概述
作为 Kubernetes 多调度器支持的一部分,每个新的 Pod 通常由默认调度器调度,但可以通过在 Pod 部署时指定另一个自定义调度器(在我们的例子中,Poseidon-Firmament)的名称来指示 Kubernetes 使用另一个调度器。在这种情况下,默认调度器将忽略该 Pod,并允许 Poseidon 调度器将 Pod 调度到相关的节点。
注意
有关此项目设计的详细信息,请参阅设计文档。可能的用例场景 - 何时使用
Poseidon-Firmament 调度器 由于其批量调度方法优于 K8s 的逐个 Pod 方法,因此能够实现大规模的极高吞吐量调度环境。在我们的大量测试中,我们观察到,只要传入 Pod 的资源需求(CPU/内存)在作业(副本集/部署/作业)之间均匀,主要归因于工作在作业之间的有效摊销,就可以获得显著的吞吐量收益。
尽管 Poseidon-Firmament 调度器 能够调度各种类型的工作负载(服务、批处理等),但以下是一些它表现最出色的用例:
对于由大量任务组成的“大数据/AI”作业,吞吐量收益巨大。
对于工作负载资源需求在作业(副本集/部署/作业)之间均匀的服务或批处理作业场景,也有显著的吞吐量收益。
当前项目阶段
目前,Poseidon-Firmament 项目是一个孵化项目。Alpha 版本可在 https://github.com/kubernetes-sigs/poseidon 获取。