Placement API 支持实例预留¶
https://blueprints.launchpad.net/blazar/+spec/placement-api
Placement API 1 在 Nova 的 14.0.0 Newton 版本中被引入,用于分离资源提供商清单和用量的 API 和数据模型。它可以用于改进实例预留。
问题描述¶
当前的实例预留存在以下限制
用户必须使用反亲和策略创建实例预留。因此,单个预留中的实例数量不能大于主机数量。
用户在预留资源上启动实例时必须指定服务器组。如果未指定,可能会启动超过预留数量的实例。
用例¶
用户希望使用任意亲和策略预留实例资源。
用户希望预留比主机数量更多的实例。
提议的变更¶
使用 自定义资源类 表示预留资源,并使用 嵌套资源提供商 管理预留资源的容量和使用情况。以下章节描述了 Blazar 如何与 Nova 和 Placement 交互以支持实例预留。
创建主机时:¶
获取 hypervisor 信息并将其存储到 computehosts 表中。
通过调用 创建资源提供商 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。
将主机添加到 freepool 中。
创建租约时:¶
查找具有任意亲和策略的可用资源。
更新 computehost_allocations 表。
通过调用 创建资源类 API,创建一个自定义资源类 CUSTOM_RESERVATION_{reservation UUID}。
创建资源类请求体示例
POST /placement/resource_classes
{
"name": "CUSTOM_RESERVATION_4D17D41A_830D_47B2_91C7_4F9FC0AE611E"
}
注意
由于不能使用小写字母和连字符,因此自定义资源类名称使用大写字母和下划线。
创建一个私有 flavor,其 extra_spec 中包含
resources:CUSTOM_RESERVATION_{reservation UUID}=1。
注意
不再为每个实例预留创建主机聚合,因为可以通过预留提供商清单区分预留主机。
不再创建服务器组,因为提出的方法不依赖于 ServerGroup(Anti)AffinityFilter。
启动租约时:¶
通过调用 更新资源提供商清单 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
}
注意
在此规范实施之前创建的现有主机没有预留提供商。因此,在此步骤之前,检查预留提供商是否存在,如果不存在则创建它。
将租约所有者的项目添加到私有 flavor 访问权限列表中。
注意
之前的租约启动实现应保留,直到之前的实例预留被弃用并完全删除。可以通过检查 instance_reservations 表中的 aggregate_id 或 server_group_id 列来区分之前的实例预留。
从用户角度启动实例时:¶
租约所有者使用私有 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 中的现有逻辑应保留。
终止租约时:¶
删除相关实例和私有 flavor。
通过调用 删除资源提供商清单 API,从预留提供商的清单中删除 CUSTOM_RESERVATION_{reservation UUID} 类。
通过调用 删除资源类 API,删除 CUSTOM_RESERVATION_{reservation_UUID} 资源类。
注意
之前的租约终止实现应保留,直到之前的实例预留被弃用并完全删除。可以通过检查 instance_reservations 表中的 aggregate_id 或 server_group_id 列来区分之前的实例预留。
删除主机时:¶
通过调用 删除资源提供商 API,删除与主机关联的预留提供商。
将主机从 freepool 中删除。
更新 computehosts 表。
备选方案¶
虚拟资源方法¶
更新 freepool 中计算节点的常规资源(例如 VCPU)的清单,使其为 zero 或 reserved。并向清单中添加虚拟资源,例如 CUSTOM_VCPU_{reservation UUID}。这种方法使资源使用情况跟踪复杂化,因为无法通过顶级计算节点清单查看每个常规资源的实际使用情况。
Traits 方法¶
使用 Traits 来表达预留资源。问题是 traits 只是 traits,它们不能用于管理预留资源的容量和使用情况。
数据模型影响¶
instance_reservations 表的 affinity 列已更改为允许 NULL。 NULL 表示 未应用亲和策略,而 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 影响¶
创建租约 API 的 affinity 参数已更改为可选参数。如果未提供 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 参考的参数描述。
将更新实例预留部分的命令行界面参考。
将添加发行说明。
参考资料¶
历史记录¶
发布名称 |
描述 |
|---|---|
Rocky |
引入 |