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。这对于
在升级期间同步旧的禁用计算节点。
同步 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 的更改将不会被持久化。
将不会为请求过滤器添加新的配置选项,这意味着它将始终启用。
备选方案¶
与其使用 forbidden trait,我们可以将一个资源提供者聚合 UUID 硬编码到 nova 中,并在 Placement 中将计算节点资源提供者添加到/从该聚合中,因为服务被禁用/启用。
优点:聚合可能更自然,因为它们是提供者的分组。
缺点:从操作角度来看,使用聚合会更难调试,因为提供者聚合没有任何名称或元数据,因此操作员可能会想知道为什么某个提供者不是调度的候选者,但位于他们未创建(或在 nova 主机聚合 API 中看不到)的聚合中。 使用具有清晰名称(如
COMPUTE_STATUS_DISABLED)的每个提供者的 trait 应该使人类明显地知道该提供者不是调度候选者,因为它被禁用了。
与其使用 forbidden trait 或聚合,nova 可以将每个资源类别的保留库存设置为每个提供者上的总库存,就像 ironic 驱动程序在节点正在维护期间应从调度考虑中移除时所做的那样。 [2]
优点:不需要新的 trait,可以遵循 ironic 驱动程序模式。
缺点:预计 ironic 节点资源提供者在库存中只有一个资源类别,因此更容易管理更改该类别的保留值,但对于非裸机提供者,他们正在报告至少三个资源类别(VCPU、MEMORY_MB 和 DISK_GB),因此在所有这些类别上设置保留 = 总数会更复杂。 此外,更改库存不像请求过滤器那样可配置。
从长远来看,我们可以考虑更改 ironic 驱动程序节点维护代码以仅设置/取消设置
COMPUTE_STATUS_DISABLEDtrait。与其让
os-servicesAPI 同步调用计算服务上的set_host_enabled方法,API 可以直接在受影响的提供者上切换该 trait。优点:API 到计算服务的阻塞调用减少了更改服务禁用状态,尽管有人可能会认为所提出的阻塞性质是有利的,因此管理员可以确认该服务已禁用,并且将在调度期间进行预过滤。
缺点:可能会出现代码重复,这可能违反单一职责原则。
什么都不做,而是专注于优化 nova 调度器的性能,这可能是大型部署需要严重限制
max_placement_results的根本原因。 [3] 然而,无论优化调度器(我们都应该这样做),使 nova 调度更快的一部分取决于 nova 向 Placement 提出更明智的问题,而 Placement 提供更小的分配候选者集合,即在 Placement(SQL)中而不是在 Python(nova)中进行过滤。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无。 操作员可以使用 osc-placement CLI 直接查看和管理提供者 trait。
性能影响¶
从某种程度上说,这应该可以提高大型云在升级或维护期间的调度器性能,因为 Placement 将返回更少的分配候选者供 nova 调度器过滤。
另一方面,这会增加 os-services API 在更改计算服务禁用状态时的开销。
其他部署者影响¶
无
开发人员影响¶
无
升级影响¶
此变更有一些升级注意事项。
API 将检查目标计算服务的 RPC API 版本,如果版本较旧,则不会调用
set_host_enabled方法。 当计算服务升级并重新启动时,update_provider_tree调用将同步该 trait。现有的禁用计算节点需要在升级时报告该 trait,这将通过在计算启动后升级期间调用的
update_available_resource流程(update_provider_tree)来完成。
实现¶
负责人¶
- 主要负责人
Matt Riedemann (mriedem) <mriedem.os@gmail.com>
- 其他贡献者
无
工作项¶
对计算服务进行变更
该
set_host_enabled方法该
update_provider_tree流程libvirt 驱动程序,以便在超visor 停止或启动时回调以添加/移除该 trait
将
os-servicesAPI 连接到计算服务方法set_host_enabled,以便在计算服务的禁用状态发生更改时调用该方法添加一个请求过滤器,该过滤器将向 RequestSpec 添加一个 forbidden trait,以在向 Placement 发送 GET /allocation_candidates 调用期间过滤掉禁用的计算节点资源提供者。
依赖项¶
需要将 COMPUTE_STATUS_DISABLED trait 添加到 os-traits 库。
测试¶
对于此功能,单元和功能测试就足够了。
文档影响¶
将在管理文档中记录新的调度器请求过滤器。 [4]
参考资料¶
脚注¶
其他¶
CERN 报告的原始错误:https://bugs.launchpad.net/nova/+bug/1805984
Train PTG 邮件列表提及:http://lists.openstack.org/pipermail/openstack-discuss/2019-May/005908.html
历史¶
发布名称 |
描述 |
|---|---|
Train |
引入 |