调度器向 Placement API 声明资源

https://blueprints.launchpad.net/nova/+spec/placement-claims

让 Nova 调度器在选择计算主机后在 Placement API 中创建分配记录,并在重新调度或迁移操作时删除这些分配。

问题描述

调度器当前调用 Placement API 以获取与特定资源类数量请求匹配的 ResourceProvider 列表。目前,nova-compute 服务中的 ResourceTracker (RT) 负责更新 Placement 服务中资源提供程序(例如计算节点)的库存和分配值。在 RT 中更新分配值被称为“声明”。

这种模型非常适合拥有大量剩余容量的云,但在资源受限的环境中,可能会导致争用和增加重试操作。

在本规范中,我们建议让调度器分配资源,而不是计算节点。鉴于 Placement API 未实现所有调度器过滤器和称重器,建议调度器首先获取资源提供程序列表,使用过滤器和称重器遍历这些资源提供程序,并在 consume_from_request() 同步操作中减少资源使用量后,将分配发布到找到的目标。这样,我们既可以减少重试操作的发生,也可以减少可能发生竞争条件的时期。

用例

作为操作员,我希望最小化请求资源和实际消耗该资源之间的时间,以避免级联调度失败。

提议的变更

该规范的目标是修改创建分配的时间/地点,并提出调度器主动写入这些分配,而不是让 ResourceTracker (RT) 发布分配。我们将使用服务版本检查在调度器中,以确保系统中的所有计算主机都可以处理已经由调度器服务写入分配的请求。

然后,计算服务将查询 Placement API 以获取与特定消费者(实例)相关的分配,如果存在,则 RT 将不会在声明操作期间调用 Placement API 以添加分配。该声明上下文管理器本身将变得轻量级,因为它只会验证尚未由 Placement API 处理的 PCI 和 NUMA 资源。鉴于 virt 驱动程序可以返回特定实例的开销,然后将其用于在 RT 中声明资源,并且开销对于不同的 hypervisor 类型、版本和实例 flavor 非常具体,因此对于 Placement 能够正确验证这些开销,我们建议的操作员更新当前与 hypervisor 偏移量相关的“reserved”配置选项,以满足运行所需的每种资源类别的最大数量。

迁移操作和重新调度(如果实例启动时发生意外故障)将通过让 conductor 调用 DELETE /allocations/{instance_id} 来删除原始分配,并完成操作。

在终止实例时,关联的分配已经在计算主机上物理删除实例时从 Placement API 中删除。也就是说,存在一个现有的 bug report [1] 关于本地删除(如果删除实例时 RPC 计算服务未启动)没有删除分配,因此 bugfix 将是该规范的工作项。

总而言之,Cells V2 的重新调度存在一个当前问题,计算服务会回调 conductor。不幸的是,鉴于它会调用一个 cell conductor,而 conductor 无法再次调用调度器,因为后者不在同一个消息队列中。虽然这是一个 Cells V2 的问题,但我们同意它与此规范无关。

备选方案

我们可以通过将它们作为方法参数添加到 RPC 调用计算服务时传递分配,但鉴于 Allocation 对象是 Placement 特定的模型,我们更喜欢不在 Nova 中直接使用它们。

最后一个论点可能是关于在哪里调用 Placement API 来创建和删除分配,是在 conductor 还是在调度器服务中,但我们将留待在实施期间的审查讨论中。我们可能会保留自己使用一些基准测试工具来验证这两种替代方案之间的性能。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

Placement HTTP 调用将在调度器服务中进行,而不是计算服务中,用于分配实例。

其他部署者影响

滚动升级将保持遗留行为,直到所有计算节点完全升级,并且过渡将是自动的。

操作员需要修改 reserved_host_disk_mbreserved_host_memory_mb 和一个新创建的 reserved_host_cpus 配置选项,以接受每个 hypervisor 类型提供的实例开销。这些配置选项的值应等于他们希望为每个 hypervisor 留下的数量,加上最小大小的 flavor 数量乘以该 flavor 的开销。

开发人员影响

无。

实现

负责人

主要负责人

sylvain-bauza

其他贡献者

工作项

  • 修复关于本地实例删除时未删除分配的 bug [1]。

  • 添加一个新的 reserved_host_cpus 配置选项,并由 RT 使用。

  • 修改 RT 以在进行自愈检查时过滤掉尚未设置 host 的实例的分配。

  • 使计算节点 GET /allocations/<instance_id> 用于验证是否已创建,如果是,则不要向 Placement 服务 POST 分配。

  • 修改 conductor 以在重新调度或迁移操作时 DELETE /allocations/<instance_id>。

  • 修改调度器以在所有计算节点都是新的情况下向 Placement POST 分配。

依赖项

无。

测试

没什么特别的,经典的单元和功能测试覆盖。

文档影响

无。

参考资料

[1] https://bugs.launchpad.net/nova/+bug/1679750 [2] https://etherpad.openstack.org/p/nova-pike-claims-in-scheduler