调度¶
这是从 Pike 版本开始 nova 中调度机制的概述。有关调度器本身的更多信息,请参阅 计算调度器。有关我们更改调度器工作方式的原因的概述,请参阅 调度器演进。
概述¶
调度过程如下所述。
注意
本文档内容截至 16.0.0 Pike 版本发布时。调度器和 conductor(s) 之间传递的备选主机提及是未来的工作。
如上图所示,调度过程如下
调度器从“超级 conductor”处获取请求规范,其中包含资源需求。“超级 conductor”在部署的最高层级运行,与在特定 cell 内运行的“cell conductor”形成对比。
调度器将这些需求发送到 placement。
Placement 运行查询以确定可以满足这些需求的资源提供者(在本例中为计算节点)。
Placement 然后为每个计算节点构建一个数据结构,如 规范 中所述。该数据结构包含每个计算节点的匹配资源提供者信息的摘要,以及如果选择该计算节点则用于声明请求资源的 AllocationRequest。
Placement 将此数据结构返回给调度器。
调度器为 provider summaries 中包含的每个计算节点创建 HostState 对象。这些 HostState 对象包含有关主机的相关信息,这些信息将在后续的过滤和加权中使用。
由于请求规范可以指定一个或多个要调度的实例,因此调度器对每个请求的实例重复执行接下来的几个步骤。
调度器通过过滤器和称重器运行这些 HostState 对象,以进一步细化和排序主机,使其与请求匹配。
调度器然后选择排序列表中最顶端的 HostState,并确定其来自 Placement 返回的数据的匹配 AllocationRequest。它将该 AllocationRequest 作为发送到 Placement 以声明资源的请求的主体。
如果声明不成功,则表示另一个进程已经消耗了这些资源,并且该主机不再能够满足请求。在这种情况下,调度器将移动到列表中的下一个主机,重复该过程,直到成功声明资源为止。
一旦调度器找到一个成功声明资源的宿主机,它需要选择一些“备选”宿主机。这些是排序列表中与所选宿主机位于同一 cell 中的宿主机,如果所选宿主机上的构建因某种原因失败,则 cell conductor 可以使用它们。备选宿主机的数量由配置选项
scheduler.max_attempts确定。调度器为每个请求的实例创建两个列表结构:一个用于主机(所选主机 + 备选主机),另一个用于它们的匹配 AllocationRequest。
为了创建备选主机,调度器确定所选主机的 cell。然后,它遍历排序的 HostState 对象列表,以查找该 cell 中的其他主机。它将这些主机添加到主机列表,并将它们的 AllocationRequest 添加到分配列表。
创建这些列表后,调度器已完成对请求实例所需的操作。
调度器对任何其他请求的实例重复此过程。当所有实例都已调度后,它会创建一个 2 元组返回给超级 conductor,该元组的第一个元素是主机列表的列表,第二个元素是 AllocationRequest 列表的列表。
调度器将该 2 元组返回给超级 conductor。
对于每个请求的实例,超级 conductor 确定所选主机的 cell。然后,它将一个包含 ([hosts], [AllocationRequests]) 的 2 元组发送到目标 cell conductor。
目标 cell conductor 尝试在所选主机上构建实例。如果失败,它将使用该主机的 AllocationRequest 数据来取消声明所选主机的资源。然后,它通过首先尝试声明资源来迭代备选主机列表,如果成功,则在该主机上构建实例。只有当所有备选主机都失败时,构建请求才会失败。