支持禁用 cell

https://blueprints.launchpad.net/nova/+spec/cell-disable

如果能够通过支持禁用 cell 的概念,完全停止向特定 cell 或一组 cell 调度,将会很有用。鉴于我们目前没有任何现有的禁用 cell 的手段,本规范提出了一种简单的解决方案来支持 nova 中的此新功能。

问题描述

目前,我们有多种方法可以预先选择希望将虚拟机调度到的 cell,例如使用主机聚合或调度器过滤器。然而,这些机制是白名单,通过选择合适的宿主机来间接预先选择一个 cell。因此,虽然我们有办法排除不希望被选中的宿主机,但大型部署可能并不总是希望在宿主机级别进行操作。如果他们只想停止向一组 cell 调度,目前他们必须以某种方式将这些 cell 中的所有宿主机从调度器的考虑范围中排除,因为没有办法简单地将这些 cell 列入黑名单。

因此,本规范试图解决的问题是,没有一种优雅的方法可以阻止向一组 cell 调度。

用例

作为操作员,我希望能够禁用一组 cell(例如在故障或干预期间,不应生成新的实例),从而停止向其调度,而无需处理单个计算节点(微观管理)。

提议的变更

本规范旨在对 nova_api.cell_mappings 表模式进行更改,并在 CellMapping 对象中添加一个新字段,通过该字段调度器的 host_manager 将了解哪些 cell 被禁用,从而在从 placement 返回给调度器的宿主机状态时,不会查询属于禁用 cell 的那些计算节点和服务。下面详细说明了计划如何实现此操作

  1. 在 nova_api.cell_mappings 表中添加一个新列 disabled,可以将其设置为 True 或 False。设置为 True 表示该 cell 已禁用;默认情况下,此值设置为 False。

  2. 在 CellMapping 对象中添加一个新字段 disabled,它将表示 cell_mappings 表中新添加列的值。

  3. 为 CellMappingList 对象添加一个查询方法,以仅查询启用的 cell。

  4. 目前,调度器调用 host_manager 的 get_host_states_by_uuids,host_manager 通过调用 get_host_states_by_uuids 函数中的 _get_computes_for_cells 来查询 cell 中的 compute_nodes 和 services。在 get_host_states_by_uuids 函数中加载 cell 时,将过滤掉禁用的 cell,并且仅将启用的 cell 传递给 _get_computes_for_cells 函数,通过新添加到 CellMappingList 的查询来实现。因此,只有启用 cell 中的宿主机状态才会传递回过滤器调度器,从而不会向禁用的 cell 进行调度。

  5. 由于 cell 列表当前全局缓存(以提高性能),在每次启用/禁用 cell 后,将刷新此缓存,以反映新的更改。刷新将使用在调度器中创建的“SIGHUP”处理程序完成,并在禁用列更改期间向此处理程序发送信号。

由于我们有 nova-manage 实用程序供操作员使用,因此可以使用以下方式重用 nova-manage 命令来更新 cell_mappings 表中的字段,从而允许操作员启用/禁用 cell。

  • nova-manage cell_v2 update_cell 命令添加新的标志 -

    • nova-manage cell_v2 --update_cell --cell_uuid <cell_uuid> [--disable]

      这将禁用启用的 cell,即设置此 cell 的 cell_mapping 记录在 api DB 中的 disabled 字段为 1。

    • nova-manage cell_v2 --update_cell --cell_uuid <cell_uuid> [--enable]

      这将启用禁用的 cell,即设置此 cell_mapping 记录的 disabled 字段回 0。

在创建新 cell 时,默认情况下 cell 将处于启用状态,但是将在 nova-manage cell_v2 create_cell 命令中添加一个 disabled 选项,用户可以使用该选项创建预先禁用的 cell,并在需要时稍后启用它们。

由于 disabled 列对于操作员来说很有用,因此它也将添加到使用 nova-manage cell_v2 list_cells 命令显示的列列表中。

本规范的范围仅限于考虑使用过滤器调度器的情况,因为它是维护的调度器。另外请注意,本规范仅侧重于停止向禁用的 cell 调度,并且不会妨碍禁用 cell 中现有 VM 的任何用户操作,例如调整大小。例如,即使 RequestSpec.request_destination.cell 设置为禁用的 cell,也不会阻止此操作。

备选方案

  1. 也可以将其作为通过调度器中的配置布尔值启用的后置 placement 过滤器来实现,以过滤掉禁用的 cell,但由于这仍然需要 cell_mappings 中的新字段,因此如果通过 host_manager 中的简单查询更改来实现,则会更集成。

  2. 另一种方法是循环遍历该 cell 中的所有计算服务并启用/禁用它们,但这在 cell 具有大量计算的情况下可能不是理想的。

数据模型影响

需要对 nova_api DB 模式进行更改,以便将类型为 Boolean 的 disabled 列添加到 nova_api.cell_mappings 表中。需要 api_migration。此列默认设置为 False。

此外,CellMapping 对象需要获得一个名为 disabled 的新字段。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

用户将获得现有 nova-manage cell_v2 update_cell 命令的两个新选项,称为 disableenable,以及现有 nova-manage cell_v2 create_cell 命令的新选项 disabled。将更新文档以使用户受益。

性能影响

对性能没有重大影响。调度器将不再查询所有 cell 以获取宿主机状态,而是仅查询启用的 cell。

其他部署者影响

对部署操作没有影响,因为默认情况下所有 cell 均已启用,并且调度将正常工作。支持 cell 禁用只会使其更具灵活性,因为部署程序现在可以阻止向一组 cell 调度,而不是参与到这些 cell 中的服务的微观管理,这意味着单独处理这些 cell 中的每个服务,通过过滤或禁用该 cell 中的每个计算服务。

开发人员影响

升级影响

由于 api DB 模式将发生更改,因此必须运行 nova-manage api_db sync 命令以更新 cell_mappings 表。

实现

负责人

主要负责人

<tssurya>

其他贡献者

<belmoreira>

工作项

  1. 在 nova_api.cell_mappings 表中添加一个新列 disabled

  2. 在 CellMapping 对象中添加一个新字段 disabled

  3. 添加一个查询方法到 CellMappingList 以获取所有已启用 cell 的 cell 映射记录。

  4. 更改 host_manager 中查询宿主机状态的方法,仅查询已启用的 cell,并添加 SIGHUP 处理程序。

  5. 将新的标志添加到 nova-manage cell_v2 update_cell 命令。

  6. 将新的标志添加到 nova-manage cell_v2 create_cell 命令。

  7. 修改 nova-manage cell_v2 list_cells 命令以打印新列。

依赖项

无。

测试

  1. 用于验证禁用机制工作的单元和功能测试

文档影响

将通过记录 nova-manage cell_v2 update_cell 命令和 nova-manage cell_v2 create_cell 命令的新标志,在 nova-manage.rst 文件中更新用户文档。

参考资料

无。

历史

修订版

发布名称

描述

Rocky

引入