Placement API 支持实例预留

https://blueprints.launchpad.net/blazar/+spec/placement-api

Placement API 1 在 Nova 的 14.0.0 Newton 版本中被引入,用于分离资源提供商清单和用量的 API 和数据模型。它可以用于改进实例预留。

问题描述

当前的实例预留存在以下限制

  • 用户必须使用反亲和策略创建实例预留。因此,单个预留中的实例数量不能大于主机数量。

  • 用户在预留资源上启动实例时必须指定服务器组。如果未指定,可能会启动超过预留数量的实例。

用例

  • 用户希望使用任意亲和策略预留实例资源。

  • 用户希望预留比主机数量更多的实例。

提议的变更

使用 自定义资源类 表示预留资源,并使用 嵌套资源提供商 管理预留资源的容量和使用情况。以下章节描述了 Blazar 如何与 Nova 和 Placement 交互以支持实例预留。

创建主机时:

  1. 获取 hypervisor 信息并将其存储到 computehosts 表中。

  2. 通过调用 创建资源提供商 API,创建一个 嵌套资源提供商 作为计算节点资源提供商的子节点。可以通过调用带有 name 选项查询的 列出资源提供商 API 来检索计算节点资源提供商的 UUID,例如 GET /placement/resource_proiders?name=compute-1

    子资源提供商在以下章节中被称为 ‘预留提供商’

    创建预留提供商请求体示例

    POST /placement/resource_providers

{
    "name": "blazar_compute-1",
    "parent_provider_uuid": "542df8ed-9be2-49b9-b4db-6d3183ff8ec8"
}

注意

“542df8ed-9be2-49b9-b4db-6d3183ff8ec8” 是 “compute-1” 计算节点的 UUID。

  1. 将主机添加到 freepool 中。

创建租约时:

  1. 查找具有任意亲和策略的可用资源。

  2. 更新 computehost_allocations 表。

  3. 通过调用 创建资源类 API,创建一个自定义资源类 CUSTOM_RESERVATION_{reservation UUID}

    创建资源类请求体示例

    POST /placement/resource_classes

{
    "name": "CUSTOM_RESERVATION_4D17D41A_830D_47B2_91C7_4F9FC0AE611E"
}

注意

由于不能使用小写字母和连字符,因此自定义资源类名称使用大写字母和下划线。

  1. 创建一个私有 flavor,其 extra_spec 中包含 resources:CUSTOM_RESERVATION_{reservation UUID}=1

注意

  • 不再为每个实例预留创建主机聚合,因为可以通过预留提供商清单区分预留主机。

  • 不再创建服务器组,因为提出的方法不依赖于 ServerGroup(Anti)AffinityFilter。

启动租约时:

  1. 通过调用 更新资源提供商清单 API,将自定义资源类 CUSTOM_RESERVATION_{reservation UUID} 添加到预留提供商的清单中,其中 total 参数等于为该主机预留的实例数量。

    更新资源提供商清单请求体示例

    PUT /placement/resource_providers/{reservation_provider_uuid}/inventories

{
    "inventories": {
        "CUSTOM_RESERVATION_4D17D41A_830D_47B2_91C7_4F9FC0AE611E": {
            "total": 3,
            "allocation_ratio": 1.0,
            "min_unit": 1,
            "max_unit": 1,
            "step_size": 1
        },
        "snip"
    },
    "resource_provider_generation": 5
}

注意

在此规范实施之前创建的现有主机没有预留提供商。因此,在此步骤之前,检查预留提供商是否存在,如果不存在则创建它。

  1. 将租约所有者的项目添加到私有 flavor 访问权限列表中。

注意

之前的租约启动实现应保留,直到之前的实例预留被弃用并完全删除。可以通过检查 instance_reservations 表中的 aggregate_id 或 server_group_id 列来区分之前的实例预留。

从用户角度启动实例时:

  1. 租约所有者使用私有 flavor,实例在具有 CUSTOM_RESERVATION_{reservation UUID} 的预留主机上启动,即预留提供商清单中。

    Placement 会声明预留提供商清单中 CUSTOM_RESERVATION_{reservation UUID} 资源的消耗。这意味着预留资源的用法由 Placement 自动跟踪。

注意

虽然依赖于 BlazarFilter,但 BlazarFilter 最终将被移除。BlazarFilter 已更改为检查 flavor extra specs 中是否存在 resources:CUSTOM_RESERVATION_*,以区分来自普通(即非预留)实例创建请求的请求。

可以使用 Traits 或其他功能来解决 BlazarFilter 依赖关系。这将由另一个蓝图解决。

另一方面,解决了对以下过滤器的依赖。这些过滤器不再需要。

  • AggregateInstanceExtraSpecsFilter

  • AggregateMultiTenancyIsolationFilter

  • ServerGroupAntiAffinityFilter

请注意,为了保持向后兼容性,直到之前的实例预留被弃用并完全删除,上述过滤器和 BlazarFilter 中的现有逻辑应保留。

终止租约时:

  1. 删除相关实例和私有 flavor。

  2. 通过调用 删除资源提供商清单 API,从预留提供商的清单中删除 CUSTOM_RESERVATION_{reservation UUID} 类。

  3. 通过调用 删除资源类 API,删除 CUSTOM_RESERVATION_{reservation_UUID} 资源类。

注意

之前的租约终止实现应保留,直到之前的实例预留被弃用并完全删除。可以通过检查 instance_reservations 表中的 aggregate_id 或 server_group_id 列来区分之前的实例预留。

删除主机时:

  1. 通过调用 删除资源提供商 API,删除与主机关联的预留提供商。

  2. 将主机从 freepool 中删除。

  3. 更新 computehosts 表。

备选方案

虚拟资源方法

更新 freepool 中计算节点的常规资源(例如 VCPU)的清单,使其为 zeroreserved。并向清单中添加虚拟资源,例如 CUSTOM_VCPU_{reservation UUID}。这种方法使资源使用情况跟踪复杂化,因为无法通过顶级计算节点清单查看每个常规资源的实际使用情况。

Traits 方法

使用 Traits 来表达预留资源。问题是 traits 只是 traits,它们不能用于管理预留资源的容量和使用情况。

数据模型影响

instance_reservations 表的 affinity 列已更改为允许 NULLNULL 表示 未应用亲和策略,而 True 表示 应用了亲和策略False 表示 应用了反亲和策略

instance_reservations 表

ALTER TABLE instance_reservations
    ALTER COLUMN affinity NULL;

在弃用并完全删除之前的实例预留后,删除 instance_reservations 表中的以下列

ALTER TABLE instance_reservations
    DROP COLUMN aggregate_id, server_group_id;

REST API 影响

创建租约 APIaffinity 参数已更改为可选参数。如果未提供 affinity 参数,则不应用亲和策略。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

  • Placement API 必须是 Ver. 1.29 或更高版本。

  • 要从以前的版本升级,请运行 DB 升级脚本,并将更新 instance_reservations 表的模式。

开发者影响

实现

负责人

主要负责人

<tetsuro>

其他贡献者

<hiro-kobayashi>

工作项

基础

  • 更新 DB 模式:更新 instance_reservations 表。

  • 在 blazar/utils/openstack 模块中添加 placement 库。

支持主机创建

  • 更新主机插件的 create_computehost() 以调用 Placement API 并更新相关表。

支持主机删除

  • 更新主机插件的 delete_computehost() 以删除 Placement 相关资源。

支持租约创建

  • 更新 query_available_hosts() 以返回每个可用主机可以启动多少个实例。

  • 更新 pickup_hosts() 以支持任意亲和策略。

  • 更新 reserve_resource() 和 update_reservation() 以支持具有相同 reservation_id 和 computehost_id 对的多个分配。

  • 更新实例插件的 _create_resources() 以创建 CUSTOM_RESERVATION_{reservation UUID} 类并将其添加到私有 flavor extra specs 中。

支持启动租约

  • 更新实例插件的 on_start() 以将 CUSTOM_RESERVATION_{reservation UUID} 添加到预留提供商清单中。total 参数等于具有相同 reservation id 和 computehost id 的 computehost_allocations 表中的条目数。

支持启动预留实例

  • 更新 BlazarFilter

支持终止租约

  • 更新实例插件的 on_end() 以从预留提供商清单中删除自定义资源并删除类本身。

其他

  • 更新 api 模块和 python-blazarclient 以支持任意亲和策略。

  • 更新 blazar-dashboard 以支持任意亲和策略。

  • 更新文档。

依赖项

WIP:检查 Placement API 开发状态。

测试

  • 为每个工作项部分中描述的新功能添加单元测试。

  • 添加具有亲和策略和无亲和策略的实例预留测试场景。

文档影响

  • 将更新创建租约 API 参考的参数描述。

  • 将更新实例预留部分的命令行界面参考。

  • 将添加发行说明。

参考资料

1

https://docs.openstack.org/nova/latest/user/placement.html

历史记录

修订版

发布名称

描述

Rocky

引入