通过隔离聚合来过滤主机¶
背景¶
我想设置一个名为 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 中将主机 HOST1 和 HOST2 添加到其中,并且您希望隔离这些主机以仅运行需要 Windows 许可的实例。
在 nova.conf 中将
scheduler.enable_isolated_aggregate_filtering配置选项设置为true并重新启动 nova-scheduler 服务。在 Placement 服务中,将 trait
CUSTOM_LICENSED_WINDOWS添加到HOST1和HOST2的资源提供程序。首先创建
CUSTOM_LICENSED_WINDOWStrait# 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重复上述步骤。将
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 或镜像启动的任何实例都将落在 HOST1 或 HOST2 上,因为这些主机暴露了该 trait。
但是,现在配置了 isolate_aggregates 请求过滤器,其 flavor 或镜像不包含 trait:CUSTOM_LICENSED_WINDOWS=required 的任何实例将不落在 HOST1 或 HOST2 上,因为聚合 ABC 需要该 trait。
上述示例使用 CUSTOM_LICENSED_WINDOWS trait,但您可以以类似的方式使用任何自定义或 标准 trait。
该过滤器支持在多个聚合中使用多个 traits。flavor 和镜像元数据的组合必须需要为了通过,聚合上配置的所有 traits。