在分配候选对象中支持 Traits

https://blueprints.launchpad.net/nova/+spec/add-trait-support-in-allocation-candidates

Placement API 已经支持过滤具有请求资源数量容量的资源提供者。除了请求的这些定量方面之外,Placement API 还需过滤掉不具备一组所需定性属性的资源提供者。

问题描述

GET /allocation_candidates 目前仅支持使用 resources 查询参数按定量方面进行查询。对于定性方面,我们需要一个额外的参数,required

用例

这是一个 Nova 和 Placement 之间内部交互的 API 提案。最终用例是,最终用户希望在具有 AVX CPU 特性的计算节点上启动实例,即使它们具有容量,也不会返回不具备 AVX CPU 特性的计算节点。

提议的变更

建议向 GET /allocation_candidates API 添加 required 查询参数。它将接受一个 Traits 列表,API 将返回一组分配请求,这些分配请求中的资源提供者都具备参数 required 中的每个 Traits。

对于嵌套的资源提供者,定义在父 RP 上的 Traits 假定属于其所有子(后代)RP。但是,定义在子 RP 上的 Traits 不适用于父(祖先)RP。聚合内不存在 Traits 的隐式共享。

备选方案

还有一个关于 preferred_traits 参数的提案,这意味着拥有一系列 Traits 更好。但目前还没有明确的使用场景,因此它不包含在提案中。

数据模型影响

REST API 影响

建议向 GET /allocation_candidates 添加 required 参数。它接受用 , 分隔的 Traits 列表。例如

GET /allocation_candidates?resources=VCPU:8,MEMORY_MB:1024,DISK_GB:4096&required=HW_CPU_X86_AVX,STORAGE_DISK_SSD

在上述请求中,Traits HW_CPU_X86_AVXSTORAGE_DISK_SSD 是必需的。

required 的验证如下

  • required 是可选的,但 resources 是必需的参数。因此,应在指定 resources 的情况下指定 required

  • required 参数中的任何无效 Traits 将导致 HTTPBadRequest 400。无效的 Traits 指的是 Traits 不在 os-traits 库中,也不是 Traits API 定义的自定义 Traits。

  • required 中的空值不可接受,也会导致 HTTPBadRequest 400

API 将返回一组分配请求,每个分配请求是根资源提供者、嵌套资源提供者和共享资源提供者的组合。所需的 Traits 可能分布在这些资源提供者中。

例如,计算节点资源提供者可能具有 HW_CPU_X86_AVX Traits,但不具有 STORAGE_DISK_SSD Traits。该 Traits 可能与正在为请求提供 DISK_GB 资源的共享存储提供者相关联。对于上述请求,API 将返回一个包含两个资源提供者的分配请求,计算节点资源提供者提供具有 Traits HW_CPU_X86_AVXVCPUMEMORY_MB 资源,共享存储提供者正在共享具有 Traits STORAGE_DISK_GBDISK_GB 资源。

资源提供者拥有的所有 Traits 都将包含在响应的提供者摘要中

{
  "allocation_requests": [
      {
          "allocations": [
              {
                  "resource_provider": {
                      "uuid": "88a5187d-e0a4-426d-bed4-54e7e89b2adb"
                  },
                  "resources": {
                      "VCPU": 8,
                      "MEMORY_MB": 1024,
                  }
              },
              {
                  "resource_provider": {
                      "uuid": "0d684632-eca3-40a9-ab6b-b7457227143c"
                  },
                  "resources": {
                      "DISK_GB": 4096
                  }
              }
          ]
      }
  ],
  "provider_summaries": {
      "88a5187d-e0a4-426d-bed4-54e7e89b2adb": {
          "resources": {
              "VCPU": {
                  "capacity": 128,
                  "used": 1
              }
              "MEMORY_MB": {
                  "capacity": 8096,
                  "used": 0
              }
          },
          "traits": [
              "HW_CPU_X86_SSE",
              "HW_CPU_X86_SSE2",
              "HW_CPU_X86_AVX",
              "HW_CPU_X86_AVX2",
              ...
          ]
      },
      "0d684632-eca3-40a9-ab6b-b7457227143c": {
          "resources": {
              "DISK_GB": {
                  "capacity": 40960,
                  "used": 0
              }
          },
          "traits": [
              "STORAGE_DISK_SSD"
          ]
      }
  }
}

当资源提供者没有 Traits 时,traits 属性仍然存在于响应中,并且为空列表。

以上所有更改都在一个新的微版本中。

安全影响

通知影响

其他最终用户影响

性能影响

在实现中,将使用单独的 SQL 查询具有所需 Traits 的资源提供者。然后在主 SQL 中过滤这些资源提供者。这将比单个 SQL 慢,但可以接受。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Alex Xu <hejie.xu@intel.com>

其他贡献者

Lei Zhang <lei.a.zhang@intel.com>

工作项

  • 添加一个公共方法来查询具有所需 Traits 的资源提供者。

  • 将公共查询方法集成到主查询中。

  • 将 Traits 填充到 ProviderSummaries 对象中。

  • 使用新的微版本在 GET /allocation_candidates API 中公开 required 参数。

依赖项

测试

需要 DB 和 API 功能测试。

文档影响

Placement API 参考应使用新参数进行更新。

参考资料

历史

修订版

发布名称

描述

Queens

引入