嵌套资源提供者 - 分配候选

https://blueprints.launchpad.net/nova/+spec/nested-resource-providers-allocation-candidates

嵌套资源提供者功能已在 Queens 和 Pike 版本中添加到 nova 和 placement 中,但是仍有许多功能需要完善才能使该特性完全可用。其中之一是在 placement 服务中 GET /allocation_candidates HTTP 端点返回的分配请求中完全集成嵌套资源提供者。

问题描述

通过 update_provider_tree 工作,资源跟踪器和 virt 驱动程序现在能够构建一个嵌套资源提供者的树,每个提供者都装饰有各种 traits 并包含各种资源类的库存记录。

虽然这对于正确表示子提供者与父提供者的层次关系至关重要,但该层次结构尚未用于计算在预过滤计算主机期间返回给 nova 调度器的分配请求集合。

placement 服务需要考虑提供者在树中的成员关系,以确定提供者是否可以满足特定请求中的资源。

考虑以下安排,一个计算节点具有一些 VCPU 和 MEMORY_MB 库存,以及两个 SR-IOV 物理功能,具有 SR-IOV 虚拟功能的库存。只有其中一个物理功能装饰了代表不同类型卸载的 trait

                       compute node  -- VCPU: 16, MEMORY_MB: 16384
                       /           \
                      /             \
                 NUMA NODE 0    NUMA NODE 1
                     |              |
                     |              |
SRIOV_NET_VF:4 --  PF 0           PF 1 -- SRIOV_NET_VF:4
                                          HW_NIC_OFFLOAD_GRO

如果我们请求 2 个 VCPU 和 1 个 SRIOV_NET_VF 资源,我们期望得到 2 个分配请求,每个分配请求包含计算节点资源提供者用于 VCPU 资源,以及用于 SRIOV_NET_VF 资源的一个物理功能资源提供者。

然而,目前,我们将从 GET /allocation_candidates 获得 0 个结果。 同样,如果我们请求 2 个 VCPU 和 1 个 SRIOV_NET_VF 以及 HW_NIC_OFFLOAD_GRO 作为必需的 trait,我们期望得到 1 个分配请求,其中包含具有所需 trait 的 PF。 但是,我们目前得到 0 个结果,因为分配候选的计算方式“不了解嵌套”。

用例

提议的变更

更新 AllocationCandidates.get_by_requests() 方法,使其理解当存在提供者树时,资源可以由子提供者提供。 在评估必需的 traits 时,placement 服务必须确保 traits 与实际提供满足分配请求的库存的提供者相关联。

具体来说,使用 问题描述 中描述的主机,

GET /allocation_candidates?resources=VCPU:2,SRIOV_NET_VF=1

将提供以下结果

{
    "allocation_requests": [
        {
            "allocations": {
                "35791f28-fb45-4717-9ea9-435b3ef7c3b3": {
                    "resources": {
                        "VCPU": 2
                    },
                },
                "7d2590ae-fb85-4080-9306-058b4c915e3f": {
                    "resources": {
                        "SRIOV_NET_VF": 1
                    },
                },
            },
        },
        {
            "allocations": {
                "35791f28-fb45-4717-9ea9-435b3ef7c3b3": {
                    "resources": {
                        "VCPU": 2
                    },
                },
                "99c09379-6e52-4ef8-9a95-b9ce6f68452e": {
                    "resources": {
                        "SRIOV_NET_VF": 1
                    },
                },
            },
        },
    ],
    "provider_summaries": {
        "35791f28-fb45-4717-9ea9-435b3ef7c3b3": {
            "resources": {
                "VCPU": {
                    "used": 0,
                    "capacity": 16
                },
            "traits": []
            },
        },
        "7d2590ae-fb85-4080-9306-058b4c915e3f": {
            "resources": {
                "SRIOV_NET_VF": {
                    "used": 0,
                    "capacity": 4
                },
            "traits": []
            },
        },
        "99c09379-6e52-4ef8-9a95-b9ce6f68452e": {
            "resources": {
                "SRIOV_NET_VF": {
                    "used": 0,
                    "capacity": 4
                },
            },
            "traits": [
                "HW_NIC_OFFLOAD_GRO"
            ]
        },
    },
}

请注意,在 provider_summaries 中,我们将仅显示位于 allocation_requests 中的资源提供者。

我们还希望调整 placement 服务,以便在 provider_summaries 中返回特定提供者树中与搜索条件匹配的所有提供者。 这由另一个 spec 顺序启用,Return resources of entire trees in Placement

备选方案

数据模型影响

REST API 影响

引入一个新的微版本来指示提供者树现在在 GET /allocation_candidates 的返回中得到正确处理。

安全影响

通知影响

其他最终用户影响

性能影响

当存在提供者树时,评估分配候选将会更慢。 别无选择。

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

jaypipes

工作项

  • 添加一个函数来检索满足一组请求资源量和所需 traits 的提供者树

  • 将该函数集成到 AllocationCandidates.get_by_requests() 方法中,并添加一个微版本来指示新的行为

依赖项

测试

需要大量的函数测试来测试各种级别的嵌套

文档影响

当系统中存在嵌套资源提供者时,在评估资源和 traits 的请求时,placement 服务的行为应该非常明确。

参考资料