通过隔离聚合来过滤主机

背景

我想设置一个名为 ABC 的聚合,其中的主机只允许运行某些授权许可的镜像。我可以将诸如 <LICENSED=WINDOWS> 之类的元数据标记到聚合中。然后,如果我启动一个包含属性 <LICENSED=WINDOWS> 的镜像的实例,它将落在聚合 ABC 中的一个主机上。但是,如果用户创建一个不包含 <LICENSED=WINDOWS> 元数据的新的镜像,那么使用该镜像启动的实例仍然可能落在聚合 ABC 中的一个主机上,如 launchpad bug 1677217 中所述。即使聚合元数据 <LICENSED=WINDOWS> 不存在于镜像属性中,AggregateImagePropertiesIsolation 调度器过滤器仍然会通过。

解决方案

上述问题通过蓝图 placement-req-filter-forbidden-aggregates 得到解决,该蓝图已在 20.0.0 Train 版本中实现。

以下示例假定您已配置聚合 ABC 并在 Nova 中将主机 HOST1HOST2 添加到其中,并且您希望隔离这些主机以仅运行需要 Windows 许可的实例。

  1. 在 nova.conf 中将 scheduler.enable_isolated_aggregate_filtering 配置选项设置为 true 并重新启动 nova-scheduler 服务。

  2. 在 Placement 服务中,将 trait CUSTOM_LICENSED_WINDOWS 添加到 HOST1HOST2 的资源提供程序。

    首先创建 CUSTOM_LICENSED_WINDOWS trait

    # openstack --os-placement-api-version 1.6 trait create CUSTOM_LICENSED_WINDOWS
    

    假设 <HOST1_UUID>HOST1 的 UUID,它与它的资源提供程序 UUID 相同。

    首先收集 HOST1 的现有 traits,开始构建命令行

    # traits=$(openstack --os-placement-api-version 1.6 resource provider trait list -f value <HOST1_UUID> | sed 's/^/--trait /')
    

    替换 HOST1 的 traits,添加 CUSTOM_LICENSED_WINDOWS

    # openstack --os-placement-api-version 1.6 resource provider trait set $traits --trait CUSTOM_LICENSED_WINDOWS <HOST1_UUID>
    

    HOST2 重复上述步骤。

  3. trait:CUSTOM_LICENSED_WINDOWS=required 元数据属性添加到聚合 ABC

    # openstack --os-compute-api-version 2.53 aggregate set --property trait:CUSTOM_LICENSED_WINDOWS=required ABC
    

与之前一样,使用包含 trait:CUSTOM_LICENSED_WINDOWS=required 的 flavor 或镜像启动的任何实例都将落在 HOST1HOST2 上,因为这些主机暴露了该 trait。

但是,现在配置了 isolate_aggregates 请求过滤器,其 flavor 或镜像包含 trait:CUSTOM_LICENSED_WINDOWS=required 的任何实例将落在 HOST1HOST2 上,因为聚合 ABC 需要该 trait。

上述示例使用 CUSTOM_LICENSED_WINDOWS trait,但您可以以类似的方式使用任何自定义或 标准 trait

该过滤器支持在多个聚合中使用多个 traits。flavor 和镜像元数据的组合必须需要为了通过,聚合上配置的所有 traits。