本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已不再准确。
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 通常由默认调度器调度,但可以通过在 Pod 部署时指定另一个自定义调度器(在我们的案例中是 Poseidon-Firmament)的名称来指示 Kubernetes 使用该调度器。在这种情况下,默认调度器将忽略该 Pod,并允许 Poseidon 调度器将该 Pod 调度到相关的节点。
注意
有关此项目设计的详细信息,请参阅设计文档。可能的用例场景 – 何时使用
Poseidon-Firmament 调度器 由于其批量调度方法的优势(相对于 K8s 的逐个 Pod 调度方法),能够在规模化环境下实现极高的调度吞吐量。在我们的大量测试中,我们观察到,只要入站 Pod 的资源需求(CPU/内存)在各个作业(Replicasets/Deployments/Jobs)中保持一致,吞吐量优势就非常显著,这主要归功于在作业间有效分摊工作。
尽管 Poseidon-Firmament 调度器 能够调度各种类型的工作负载(服务、批处理等),但在以下几种用例中表现最为出色
对于包含大量任务的“大数据/AI”作业,吞吐量优势巨大。
对于工作负载资源需求在各个作业(Replicasets/Deplyments/Jobs)中保持一致的服务或批处理作业场景,吞吐量优势也非常显著。
当前项目阶段
目前 Poseidon-Firmament 项目是一个孵化中的项目。Alpha 版本可在 https://github.com/kubernetes-sigs/poseidon 获取。