支持按聚合成员关系过滤分配候选

https://blueprints.launchpad.net/nova/+spec/alloc-candidates-member-of

提供支持,根据底层资源提供商在一个或多个聚合中的成员关系来过滤分配候选。

问题描述

Placement API 的 GET /allocation_candidates 返回的资源提供商列表可能非常大,尤其是在许多计算主机为空时。有时 Nova 可能会有信息,允许显著减少计算主机数量。例如,如果 Nova 知道某个特定项目“固定”到主机聚合,那么 Nova 当前会要求 Placement 提供满足风味资源需求的所有资源提供商,然后立即丢弃所有不在该特定主机聚合中的计算主机(在聚合多租户隔离过滤器中)。

如果 Nova 调度器只需要求 Placement 只返回与 Nova 主机聚合关联的计算主机,那么这个过程可以更高效。

用例

简单的预处理调度器过滤器,例如聚合多租户隔离过滤器,可以用更高效的 Placement 端过滤来替换。这只需要能够提供一个聚合列表,候选必须属于其中一个聚合即可。

当需要表达多个基于聚合的要求时,会出现更复杂的情况。例如,想象一下上述租户被限制在一组聚合中的情况,再加上用户请求启动到特定的 AZ(聚合)的情况。为了表达这一点,我们需要能够提供多个 OR 连接的聚合集,每个集合都 AND 连接在一起。这将允许我们表达一个逻辑查询,例如

Give me all allocation candidates that are allowed to house tenant
"foo" (either "tenant_foo_old_computes" or
"tenant_foo_new_computes") and are also in AZ "US Chicago".

所需的节点是资源提供商,它们位于定义分配给租户的合适计算的运算符定义的所有聚合的并集,与定义用户请求的 AZ 的聚合相交。

提议的变更

现有的 GET /resource_providers Placement REST API 调用支持一个 member_of 查询 参数_。该参数是“表示聚合 uuid 的字符串;或者以:开头,后跟逗号分隔的字符串列表,表示聚合 uuid。返回的资源提供商必须与由 uuid 标识的至少一个聚合关联。”

这提供了足够的表达能力来查询上述第一个用例中所需的提供商集合。对于第二个用例,我们必须能够提供多个这样的集合,并取结果的交集。

我们建议为 GET /allocation_candidates Placement REST API 调用支持完全相同的参数。

如果提供了多个 member_of 参数,则底层实现会将相应的值视为 AND 连接在一起。换句话说,以下查询字符串

&member_of=in:agg1,agg2&member_of=agg3

在逻辑上会转换为

候选资源提供商应该位于 agg1 或 agg2 中的一个,但肯定位于 agg3 中。

为了保持一致性,GET /resource_providers REST API 调用也应进行扩展,以以与上述相同的方式处理多个 member_of 查询集。

备选方案

我们可以继续通过查看调度器过滤器中的主机聚合关系来对计算主机进行后处理。但是,正如所指出的,这是效率低下的。

数据模型影响

无。

REST API 影响

member_of 参数添加到 GET /allocation_candidates REST API 调用。使行为和规范与 GET /resource_providers REST API 调用同名的参数完全相同。将使用新的微版本来指示客户端可以使用新的参数。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

预期在调度器可以限制其操作的计算主机数量的情况下,整体调度器性能会提高。

其他部署者影响

在“S”发布后,我们应该能够弃用聚合多租户隔离和可用区调度器过滤器。

开发人员影响

无。

升级影响

无。

实现

负责人

主要负责人

jaypipes

其他贡献者

cdent

工作项

  • nova.objects.AllocationCandidates.get_by_requests() 方法添加对 member_of 过滤器的支持。这将需要对 RequestGroup 对象进行更改

  • 为 Placement REST API 添加新的微版本以支持 member_of 查询参数

  • nova.objects.AllocationCandidates.get_by_requests() 方法添加对多个 member_of 查询集的支持。

  • 为 Placement REST API 添加新的微版本以支持多个集合。

依赖项

为了使此功能有用,Nova 主机聚合应“镜像”到 Placement 服务中。目前,Nova 主机聚合尚未自动显示在 Placement 服务中。为此将有一个单独的 blueprint_ 作为这项工作的一个软依赖。

测试

正常的函数和单元测试。

文档影响

在适当的参考文档中记录 REST API 微版本。

参考资料

placement-req-filter blueprint (用例): https://review.openstack.org/544585