本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
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 能够将越来越多的工作分摊到不同的工作负载中。
在计算资源需求在作业(Replicasets/Deployments/Jobs)中相对均匀的场景下,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 集成的连接层。它通过将新的基于流网络图的 Firmament 调度功能与默认的 Kubernetes 调度器结合,增强了当前的 Kubernetes 调度能力;多个调度器同时运行。图 2 描述了 Poseidon 集成层如何与底层基于 Firmament 流网络图的调度器协同工作的高级整体设计。

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