Pre-filter disabled computes

https://blueprints.launchpad.net/nova/+spec/pre-filter-disabled-computes

此蓝图建议 Nova 在计算服务禁用时向 Placement 报告一个 trait,以及调度器中的一个请求过滤器,它将使用该 trait 来过滤掉具有该禁用 trait 的分配候选者。

问题描述

在拥有数千个计算节点的庞大部署中,[scheduler]/max_placement_results 配置选项可能会受到限制,以至于 Placement 返回的分配候选者大多(或全部)是禁用的计算节点,这可能导致在调度期间出现 NoValidHost 错误。

用例

作为操作员,我希望限制 max_placement_results 以提高调度器吞吐量,但又不希望因为 Placement 只返回禁用的计算节点而出现 NoValidHost 错误。

作为开发人员,我希望在 Placement 中预先过滤掉禁用的计算节点,这应该比在 Python 中对结果运行遗留的 ComputeFilter 更快(在 SQL 中)。换句话说,我希望向 Placement 提出更好的问题,以获得更精确的结果。

作为用户,我希望能够创建和调整服务器的大小,而不会因为云正在执行滚动升级并禁用了计算节点而遇到 NoValidHost 错误。

提议的变更

总结

Nova 将开始向 Placement 报告一个 COMPUTE_STATUS_DISABLED trait,用于由禁用的计算服务主机管理的任何计算节点资源提供者。当服务启用时,该 trait 将被移除。

将添加一个调度器 请求过滤器,它将修改 RequestSpec 以使用 forbidden trait 过滤语法来过滤掉具有新 trait 的提供者。

计算变更

对于计算服务,有两个变更。

set_host_enabled

计算服务已经有一个 set_host_enabled 方法,这是一个同步 RPC 调用。 历史上,这仅由 xenapi 驱动程序 用于(现已弃用的)更新主机状态 API

此蓝图建议使用该计算方法来泛型地添加/移除管理该服务中的计算节点的 COMPUTE_STATUS_DISABLED trait(请注意,对于 ironic,一个计算服务主机可以管理多个节点)。该 trait 将仅在 Placement 中的根计算节点资源提供者上管理,而不管理任何嵌套提供者。

实际实现将是 ComputeVirtAPI 的一部分,以便 libvirt 驱动程序可以在超visor 事件自动禁用或启用计算节点时访问它。 [1]

update_provider_tree

update_available_resource 操作期间,该操作在服务启动期间和定期调用,update_provider_tree 流程将根据服务的当前禁用状态同步 COMPUTE_STATUS_DISABLED trait。这对于

  1. 在升级期间同步旧的禁用计算节点。

  2. 同步 trait,以防 API<>计算交互由于某种原因失败,例如掉落的 RPC 调用。

API 变更

当使用 os-services API 启用或禁用计算服务时,API 将通过 set_host_enabled RPC 方法同步调用计算服务,以适当地在 Placement 中的相关计算节点资源提供者上反映该 trait。 例如,如果计算服务 A 被禁用,则将添加该 trait。 当计算服务 A 启用时,将移除该 trait。

请参阅 升级影响 部分,了解如何在滚动升级期间处理旧的计算节点。

Down 状态的计算节点

由于当前禁用操作只是更新单元数据库中的 services.disabled 值,因此可以禁用处于 Down 状态的计算服务。 随着此变更,API 将不得不使用 服务组 API 检查计算服务是否处于 Up 状态。 如果服务处于 Down 状态,API 将不会调用 set_host_enabled 计算方法,而是像今天一样更新 DB 中的 services.disabled 值并返回。 当计算服务重新启动时,update_provider_tree 流程将同步该 trait。

调度器变更

将添加一个请求过滤器,它将修改 RequestSpec 以禁止具有 COMPUTE_STATUS_DISABLED trait 的提供者。 对 RequestSpec 的更改将不会被持久化。

不会为请求过滤器添加新的配置选项,这意味着它将始终启用。

注意

除了基于节点禁用状态进行过滤外,ComputeFilter 还执行一个 is_up 检查 使用服务组 API。 “is up” 检查的结果取决于服务是 强制 Down 还是在某些可配置的时间间隔内没有“报告”,这意味着该服务可能处于 Down 状态。 此蓝图不会尝试使用新的 trait 报告计算服务的 up/down 状态,因为它变得相当复杂,并且对于意外停机而言更多的是一种边缘情况。

备选方案

  1. 与其使用 forbidden trait,我们可以将一个资源提供者聚合 UUID 硬编码到 nova 中,并在 Placement 中将计算节点资源提供者添加到/从该聚合中,因为服务被禁用/启用。

    • 优点:聚合可能更自然,因为它们是提供者的分组。

    • 缺点:从操作角度来看,使用聚合会更难调试,因为提供者聚合没有任何名称或元数据,因此操作员可能会想知道为什么某个提供者不是调度的候选者,但位于他们未创建(或在 nova 主机聚合 API 中看不到)的聚合中。 使用具有清晰名称(如 COMPUTE_STATUS_DISABLED)的每个提供者的 trait 应该使人类明显地知道该提供者不是调度候选者,因为它被禁用了。

  2. 与其使用 forbidden trait 或聚合,nova 可以将每个资源类别的保留库存设置为每个提供者上的总库存,就像 ironic 驱动程序在节点正在维护期间应从调度考虑中移除时所做的那样。 [2]

    • 优点:不需要新的 trait,可以遵循 ironic 驱动程序模式。

    • 缺点:预计 ironic 节点资源提供者在库存中只有一个资源类别,因此更容易管理更改该类别的保留值,但对于非裸机提供者,他们正在报告至少三个资源类别(VCPU、MEMORY_MB 和 DISK_GB),因此在所有这些类别上设置保留 = 总数会更复杂。 此外,更改库存不像请求过滤器那样可配置。

    从长远来看,我们可以考虑更改 ironic 驱动程序节点维护代码以仅设置/取消设置 COMPUTE_STATUS_DISABLED trait。

  3. 与其让 os-services API 同步调用计算服务上的 set_host_enabled 方法,API 可以直接在受影响的提供者上切换该 trait。

    • 优点:API 到计算服务的阻塞调用减少了更改服务禁用状态,尽管有人可能会认为所提出的阻塞性质是有利的,因此管理员可以确认该服务已禁用,并且将在调度期间进行预过滤。

    • 缺点:可能会出现代码重复,这可能违反单一职责原则。

  4. 什么都不做,而是专注于优化 nova 调度器的性能,这可能是大型部署需要严重限制 max_placement_results 的根本原因。 [3] 然而,无论优化调度器(我们都应该这样做),使 nova 调度更快的一部分取决于 nova 向 Placement 提出更明智的问题,而 Placement 提供更小的分配候选者集合,即在 Placement(SQL)中而不是在 Python(nova)中进行过滤。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

无。 操作员可以使用 osc-placement CLI 直接查看和管理提供者 trait。

性能影响

从某种程度上说,这应该可以提高大型云在升级或维护期间的调度器性能,因为 Placement 将返回更少的分配候选者供 nova 调度器过滤。

另一方面,这会增加 os-services API 在更改计算服务禁用状态时的开销。

其他部署者影响

开发人员影响

升级影响

此变更有一些升级注意事项。

  1. API 将检查目标计算服务的 RPC API 版本,如果版本较旧,则不会调用 set_host_enabled 方法。 当计算服务升级并重新启动时,update_provider_tree 调用将同步该 trait。

  2. 现有的禁用计算节点需要在升级时报告该 trait,这将通过在计算启动后升级期间调用的 update_available_resource 流程(update_provider_tree)来完成。

实现

负责人

主要负责人

Matt Riedemann (mriedem) <mriedem.os@gmail.com>

其他贡献者

工作项

  • 对计算服务进行变更

    • set_host_enabled 方法

    • update_provider_tree 流程

    • libvirt 驱动程序,以便在超visor 停止或启动时回调以添加/移除该 trait

  • os-services API 连接到计算服务方法 set_host_enabled,以便在计算服务的禁用状态发生更改时调用该方法

  • 添加一个请求过滤器,该过滤器将向 RequestSpec 添加一个 forbidden trait,以在向 Placement 发送 GET /allocation_candidates 调用期间过滤掉禁用的计算节点资源提供者。

依赖项

需要将 COMPUTE_STATUS_DISABLED trait 添加到 os-traits 库。

测试

对于此功能,单元和功能测试就足够了。

文档影响

将在管理文档中记录新的调度器请求过滤器。 [4]

参考资料

脚注

其他

历史

修订历史

发布名称

描述

Train

引入