支持按禁止的聚合过滤分配候选

https://blueprints.launchpad.net/nova/+spec/placement-req-filter-forbidden-aggregates

此蓝图建议在调度期间,在 GET /allocation_candidates placement API 的 member_of 查询参数中指定禁止的聚合。

问题描述

如果 flavor 或 image 不包含任何 requiredforbidden traits,那么所有资源提供者都将有资格在 GET /allocation_candidates API 调用中返回,具体取决于所请求资源的可用性。其中一些资源提供者(计算主机)可能是特殊的,例如 Licensed Windows Compute Host,这意味着在此计算主机上启动的任何 VM 都将被视为已许可的 Windows 镜像,并且根据 VM 操作员的使用情况对其最终用户收费。作为操作员,我希望避免在包含 Licensed Windows Compute Hosts 的聚合上启动非 Windows OS 镜像/卷。现有的 AggregateImagePropertiesIsolationFilter 调度器过滤器确实限制了 Windows 许可镜像到 Windows 许可主机聚合,但问题在于它不会排除不匹配元数据的其他镜像。

考虑以下示例来描述许可用例。操作员添加镜像元数据以将镜像分类如下

image 1 properties: {"os_distro": "windows"} (added by an operator)
image 2 properties: {} (added by a normal end user)

Host aggregate 1 metadata: {"os_distro": "windows"}

现在,当用户使用镜像 2 启动实例时,此调度器过滤器允许在主机聚合 1 中启动实例,这是一个问题。

用例

其中一些计算主机是 Licensed Windows Compute Host,这意味着在此类计算主机上启动的任何 VM 都将被视为已许可的 Windows 镜像,并且根据 VM 的使用情况,操作员将对其最终用户收费。作为操作员,我希望避免在 Licensed Windows Compute Hosts 上启动非 Windows OS 镜像/卷,从而使操作员能够

  • 避免浪费许可资源。

  • 正确地向用户收取 VM 使用费。

提议的变更

添加一个新的 placement 请求过滤器来提供隔离的聚合,以及一个新的布尔类型配置选项 enable_isolated_aggregate_filtering 来启用它。操作员将设置为 True 以启用请求过滤器。默认值将设置为 False。操作员需要设置聚合元数据键/值对 trait:<trait_name>=required,其中 traits 是他们期望与来自 request_spec 对象的 create server 请求的 flavor 和镜像中的 trait:<trait_name>=required 设置匹配的 traits。在新请求过滤器中,它将从 request_spec 对象中获取 flavor 和镜像中设置的 required traits,并将其与聚合元数据中设置的 required traits 进行比较。如果任何 traits 与聚合元数据不匹配,它将把该聚合作为禁止的聚合包含在 member_of 查询参数中 GET /allocation_candidates API。如果有多个禁止的聚合,那么查询参数应如下所示

&member_of=!in:<agg1>,<agg2>,<agg3>

示例,如何将多个 traits 设置到聚合的元数据中,

openstack aggregate set --property trait:CUSTOM_WINDOWS_LICENSED=required 123
openstack aggregate set --property trait:CUSTOM_XYZ=required 123

操作员需要将 trait:<trait_name>=required 设置为 Windows OS 镜像。

openstack image set --property trait:CUSTOM_WINDOWS_LICENSED=required <image_uuid>

示例,如何启用这个新的 placement 请求过滤器

[scheduler]
enable_isolated_aggregate_filtering = True

这个提供隔离聚合的 placement 请求过滤器取代了现有的 IsolatedHostsFilter,但它:

  • 依赖于聚合而不是单个主机(这在大型环境(如公共云)中无法扩展)。

  • 依赖于镜像属性而不是特定的镜像 ID,这同样无法扩展。

有了这个 placement 请求过滤器,我们有可能弃用 IsolatedHostsFilter 调度器过滤器,原因如上所述。

备选方案

选项 1: Strict-isolation-group-hosts-images 规范

此规范的主要问题是

  • 添加一个新的调度器过滤器,该过滤器再次依赖于主机聚合的元数据键。

  • 与多个主机聚合关联的计算节点。这是 nova 主机聚合的一个基本问题,在 placement 聚合中不存在。

选项 2: Bi-directional-enforcement-of-traits 规范

此规范的主要问题是

Placement 的工作不是让操作员的生活更轻松。应该要求操作员使用适当的 traits 设置其部署的提供者,将提供者放入适当的聚合,在其自己的镜像和 flavor 上放置适当的元数据,并使用允许这些事情正确使用的配置选项配置 Nova

选项 3: 使用 IsolatedHostsFilter 调度器过滤器

它在拥有数千个主机和镜像的大型公共云中无法真正扩展。此外,如果您在系统中添加新的主机,则需要修改 filter_scheduler 部分中的 isolated_hosts 配置选项并重新启动 nova 调度器服务。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

在此新的 placement 请求过滤器中,获取具有值 required 的聚合的 DB 调用将对每个 select_destination 请求的整体处理时间产生轻微的影响。

其他部署者影响

将在 nova.conf 中添加一个新的配置布尔选项 enable_isolated_aggregate_filtering,nova-scheduler 服务将使用它。此配置选项的默认值将设置为 false。

enable_isolated_aggregate_filtering=False

要启用提供隔离聚合的请求过滤器,操作员应将此配置选项设置为 true。

开发人员影响

无。

升级影响

从 Rocky 版本开始,nova 主机聚合在 placement 服务中镜像(在 mirror_nova_host_aggregates 中实现)。但是,如果镜像出现任何问题,操作员可以使用 nova-manage 命令手动同步它

nova-manage placement sync_aggregates

此规范不会将 traits 同步到 placement,也不会将这些 traits 添加到属于具有语法为 trait:<trait_name>=required 的元数据键值对的聚合的计算节点资源提供者。请参阅 Nova 会议记录邮件列表线程,我们已达成共识,让操作员手动同步这些 traits。将来,如果需要,可以开发一个同步这些 traits 的实用工具,这超出此规范的范围。

实现

负责人

主要负责人

shilpa.devharakar <shilpa.devharakar@nttdata.com>

工作项

  • 添加一个 placement 请求过滤器 isolate_aggregates

  • 修改 resources_from_request_spec 方法,以将隔离的聚合添加到 Destination 对象。

  • 修改 RequestGroupto_querystring 方法,以生成一个 member_of 查询参数,以格式 &member_of=!in:<agg1_uuid>,<agg2_uuid>,<agg3_uuid> 将隔离的聚合传递过去。

  • 添加单元和功能测试以进行更改。

  • 添加发布说明。

依赖项

此规范依赖于 negative-aggregate-membership,它支持在 member_of 查询参数中传递禁止的聚合。

测试

添加正常的函数和单元测试。

文档影响

添加文档以解释如何使用新添加的 placement 请求过滤器。

参考资料

历史

修订版

发布名称

描述

Stein

引入

Train

重新提出