新的实例预留¶
https://blueprints.launchpad.net/blazar/+spec/new-instance-reservation
电信运营商出于各种原因希望保留实例插槽,例如计划扩展、维护工作、灾难恢复等,以及为了在特定时间窗口内为超视器的优先级 VNF 服务保留实例插槽,以便接受网络中预期的工作负载增加,例如大型活动、体育赛事等。 另一方面,他们还需要保留一些空闲的实例插槽或超视器,以应对意外工作负载增加的非计划扩展,例如突发流量。
公共云用户通常对 OpenStack 中的资源(如实例和超视器)印象深刻,认为资源是无限的,这是因为公共云提供商的规模,但实际上资源是有限的。运营商需要处理这种不一致性。
问题描述¶
容量管理开发提案[1]中很好地描述了一些问题。请查看该故事以了解问题的详细信息。
用例¶
作为一家电信运营商的项目负责人魏,我想指定我为计划事件的资源使用请求。一些基于时间的用量请求示例
我计划从 2017 年 06 月 01 日到 2017 年 08 月 14 日使用最多 60 个 vCPU 和 240GB 的 RAM。
我希望保证访问 4 个实例,每个实例配置 1 个 vCPU、1GB 的 RAM 和 10GB 的磁盘。 此示例类似于 VNFD[2] 中描述的内容。
提议的变更¶
Blazar 允许用户指定特定风味的实例数量。 如用例所述,预留实例的用户指定实例数量和实例风味定义的一个元组。 风味定义包含三条信息:vCPU 的数量、RAM 的数量和磁盘的大小。
一个基本思路和变更顺序如下
租户用户在 Blazar 中创建其预留,称为“租赁”,其中包含一组时间框架、预留实例的风味定义以及实例数量。
如果请求中定义的实例总数(例如,风味大小乘以实例数量)小于在时间框架内预留的未使用容量,Blazar 会向用户颁发租赁 ID。 Blazar 租赁可以包含多个预留。 Blazar 检查未使用容量是否可以容纳所有预留。 如果不能,Blazar 不会颁发租赁 ID。
用户通过 Nova API 使用预留 ID 创建其实例。 仅在预留时间框架内才接受带有 ID 的请求。
Nova 将实例创建到 Blazar 标记为具有预留容量的超视器上。
为了实现这个顺序,这个 BP 引入了一个新的资源插件“virtual:instance”用于 Blazar 项目。 由于以下原因,该插件将分两个阶段实现。
短期目标¶
关于亲和性和反亲和性规则,实例预留仅支持反亲和性规则预留,因为亲和性规则预留已经通过主机预留实现。 通过主机预留功能实现亲和性规则预留不是一个理想的目标。 为了提高数据中心的使用效率,主机预留不是一个好的选择,因为预留中的总资源量通常小于一个超视器的规格。 这会导致保留的超视器中出现未使用的实例插槽。
另一方面,OpenStack 集群中的一个超视器必须接受一个预留中的实例总数,即实例大小乘以实例数量,作为亲和性规则预留。 因此,已经实现的主机预留功能可以处理具有亲和性规则的实例预留。
先决条件
要使用实例预留,必须在 nova.conf 中定义以下三个调度器配置值
AggregateInstanceExtraSpecsFilter
AggregateMultiTenancyIsolationFilter
ServerGroupAntiAffinityFilter
对于反亲和性规则,Blazar 将执行以下步骤
作为准备,Blazar 将 filter_tenant_id=blazar-user-id 添加到 freepool 集群,以防止非预留实例被调度到 freepool。
租户用户创建其预留,在 Blazar 中称为“租赁”,其中包含时间框架、实例大小和实例数量。
Blazar 中的一个“预留”表示 <风味,具有该风味的实例数量> 的一个元组,一个“租赁”可以有多个“预留”。 因此,一个租赁可以有多种实例类型。
Blazar 检查在时间框架内预留是否可接受。 如果可接受,Blazar 会将其数据库中的预留请求记录下来,并更新 freepool 中的超视器使用情况。 然后 Blazar 返回预留 ID。 如果不可接受,Blazar 会回复预留不可接受,并向租户提供其他信息,例如,预留的实例数量大于实例配额。
在预留的开始时间,Blazar 创建一个服务器组、一个风味和一个与预留相关的宿主聚合。 然后它将预留实例被调度到的超视器添加到聚合中。
Blazar 在这里所做的技巧是
使用反亲和性策略创建服务器组
创建一个风味,其中包含两个 extra_specs,is_public=False 和风味访问权限到用户。 extra_specs 是 aggregate_instance_extra_specs:reservations:<reservation-id> 和 affinity_id:<server-group-id>
创建一个新的宿主聚合,其中包含上述 aggregate_instance_extra_specs 和请求用户项目 ID 的 filter_tenant_id
不会将超视器从 freepool 中移除,因为其他用户的预留也使用超视器中的其他实例插槽
- 用户通过调用风味 show API 获取 server_group id
Nova,然后使用调度提示(例如 –hint group=group-id)和新创建的风味创建预留实例。
Nova 中的调度机制¶
Blazar 管理一些宿主聚合来处理 Nova 中的实例调度。 Blazar 期望 Nova 按照以下方式调度实例:非预留实例(常规实例)、与主机预留相关的实例以及与实例预留相关的实例
非预留实例:调度到位于 freepool 聚合和预留相关聚合之外的超视器。
与主机预留相关的实例:调度到位于预留相关聚合内的超视器。 超视器不包含在 freepool 聚合中。
与实例预留相关的实例:调度到位于预留相关聚合内的超视器。 超视器包含在 freepool 聚合中。
Blazar 使用的 Nova 过滤器会根据以下规则选择超视器
AggregateInstanceExtraSpecsFilter 如果请求与实例预留相关,则基于风味的 extra_specs 从与实例预留相关的聚合中选择超视器。 否则,过滤器会从预留相关聚合或 freepool 中选择超视器。
BlazarFilter 如果请求与主机预留相关,则基于“预留”调度器提示从与主机预留相关的聚合中选择超视器。 否则,过滤器会从主机预留相关聚合或 freepool 中选择超视器。
AggregateMultiTenancyIsolationFilter 阻止没有活动预留的用户被调度到 freepool。
AggregateInstanceExtraSpecsFilter 和 AggregateMultiTenancyIsolationFilter 的组合使使用实例预留的请求能够在相应的聚合中被调度。
ServerGroupAntiAffinityFilter 确保与实例预留相关的实例分布在不同的超视器上。
短期目标的总结¶
将主机预留功能用于亲和性规则预留。
使用新的实例预留功能用于反亲和性规则预留。
使用保留的风味和调度提示创建预留实例。
长期目标¶
实例预留支持亲和性规则和反亲和性规则。
Nova 团队正在开发 placement API[1]。 该 API 已经具有自定义资源类[2],现在正在实现一个使用自定义资源类的调度器功能[3]。 它使运营商能够更有效地管理 freepool 中的超视器。
Blazar 将执行以下步骤
租户用户创建其预留,Blazar 术语称为“租赁”,其中包含时间框架、实例大小和实例数量。
Blazar 检查在时间框架内预留是否可接受。 如果可接受,Blazar 会将其数据库中的预留请求记录下来,并更新 freepool 中超视器的使用情况。 然后 Blazar 返回预留 ID。 如果不可接受,Blazar 会回复预留不可接受。
在预留的开始时间,Blazar 创建一个自定义资源类、一个风味和自定义资源类的资源提供者。
用户使用新创建的风味创建预留实例。
Placement API 的一些功能正在实施中。 一旦开发完成,Blazar 团队将开始使用 Placement API。
备选方案¶
此功能可以在 Blazar 端或 Nova 端实现。
Blazar 端方法¶
一个预留代表一个实例
在上述序列中,租户用户创建的预留仅配置了实例大小(例如,风味),仅预留一个实例。
虽然从技术上来说,这对于用户来说是可行的,但当他们想要使用多个实例时,他们需要在客户端处理大量的预留。 用例表明用户希望为一个预留创建多个实例。
Nova 端方法¶
通过停止的实例预先阻塞插槽
用户创建他们想要预留的那么多实例,然后在开始时间之前停止它们。 从用户角度来看,这将有效。
另一方面,从云提供商的角度来看,很难接受这种“预留”方法。 停止的实例会继续占用超视器的资源,例如 vCPU,即使它们已停止。 这意味着云提供商需要计划他们的超视器容量以接受未来预留的总使用量。 例如,如果所有用户提前一年预留他们的实例,云提供商需要计划能够接受明年预留的实例总数的超视器。
当然,我们不会阻止用户停止他们的实例:用户可以出于自己的原因调用停止 API,云提供商会向他们收取超视器插槽使用费。 但是,从 NFV 的动机来看,电信运营商无法提前准备和部署具有足够容量以适应未来使用需求的超视器。
通过搁置的实例准备预留的镜像
用户创建他们想要预留的那么多实例,然后在开始时间之前将它们搁置。 从云提供商的角度来看,这将有效:搁置的实例会释放其超视器插槽,因此之前在“停止实例”解决方案中描述的问题不会发生。
另一方面,从用户角度来看,可能会发生一些问题。 如动机部分所述,VNF 应用程序需要实例放置的亲和性或反亲和性规则。 Nova 具有用于亲和性和反亲和性放置的“服务器组”API,但它不能保证所需的实例数量可以位于同一主机上。 同样,它不能保证当超视器插槽被其他人占用时,所需的实例数量可以被超视器容纳。
当然,云提供商通常应该计划足够的资源来满足用户请求。 但是,很难计划足够的超视器,使云看起来像无限资源在 NFV 用例中。 需要大量的备用超视器是不现实的。
数据模型影响¶
Blazar 数据库中引入了一个名为“instance_reservations”的新表。 实例预留功能使用现有的 computehost_allocations 表来存储分配信息。 表的使用方式如下
在创建租赁/预留时,Blazar 查询用于实例预留或在预留时间窗口内未被任何预留使用的宿主。
如果某些宿主已经被用于实例预留,Blazar 会检查预留的实例是否可以分配到这些宿主上。
如果某些宿主未被任何预留使用,Blazar 会将预留映射到 computehost 作为 computehost_allocations 表。
对于主机预留,当前的设计永远不会在预留时间窗口内选择具有映射、预留到宿主的宿主,因此实例预留不会影响主机预留查询。
该表具有保留的风味大小、vcpu、MB 内存大小和 GB 磁盘大小、创建具有该风味的实例数量以及一个亲和性标志。
CREATE TABLE instance_reservations ( id VARCHAR(36) NOT NULL, reservation_id VARCHAR(255) NOT NULL, vcpus INT UNSIGNED NOT NULL, memory_mb INT UNSIGNED NOT NULL, disk_gb INT UNSIGNED NOT NULL, amount INT UNSIGNED NOT NULL, affinity BOOLEAN NOT NULL, flavor_id VARCHAR(36), aggregate_id INT, server_group_id VARCHAR(36), PRIMARY key (id), INDEX (id, reservation_id) FOREIGN KEY (reservation_id) REFERENCES reservations(id) ON DELETE CASCADE, );
在短期目标中,亲和性标志仅支持 False,因为实例预留仅支持反亲和性规则。 该插件管理多种 Nova 资源。 与每种资源到列数据的映射如下
在 db * reservations.resource_id 等于 instance_reservations.id
与 Nova 资源
flavor id 等于 reservations.id
调度 extra_spec,aggregate_instance_extra_specs,等于 prefix+reservations.id
aggregate 名称等于 reservations.id
调度元数据等于 prefix+reservations.id
server_group id 记录在风味的 extra_spec 中。 该 id 将在长期目标中删除,因为它在 Nova API 中更好地封装。
REST API 影响¶
URL: POST /v1/leases
为预留引入新的 resource_type “virtual:instance”
请求示例
{ "name": "instance-reservation-1", "reservations": [ { "resource_type": "virtual:instance", "vcpus": 4, "memory_mb": 4096, "disk_gb": 10, "amount": 5, "affinity": false } ], "start": "2017-05-17 09:07" "end": "2017-05-17 09:10", "events": [] }
响应示例
{ "lease": { "reservations": [ { "id": "reservation-id", "status": "pending", "lease_id": "lease-id-1", "resource_id": "resource_id", "resource_type": "virtual:instance", "vcpus": 4, "memory_mb": 4096, "disk_gb": 10, "amount": 5, "affinity": false, "created_at": "2017-05-01 10:00:00", "updated_at": "2017-05-01 11:00:00", }], "snippet": "..." } }
URL: GET /v1/leases
URL: GET /v1/leases/{lease-id}
URL: PUT /v1/leases/{lease-id}
URL: DELETE /v1/leases/{lease-id}
更改与 POST /v1/leases 相同
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
python-blazarclient 需要在租赁处理命令中支持 virtual:instance 类型的资源预留。
性能影响¶
无
其他部署者影响¶
物理:host 插件中使用的 freepool 也由 virtual:instance 插件使用,如果部署者激活了新的插件。
开发者影响¶
无
实现¶
负责人¶
- 主要负责人
muroi-masahito
- 其他贡献者
无
工作项¶
在 blazar 中创建新表
创建实例预留插件
更改 reservation_pool.py 和 nova_inventory.py 以更加通用,因为 host_plugin 和 instance_plugin 都将使用这些类
更改 BlazarFilter 以传递位于实例预留聚合中的宿主,如果指定了预留的 extra_spec。
在 python-blazarclient 中添加实例预留支持
在 gate job 中添加场景测试,主要是 Tempest job
依赖项¶
对于长期目标,Placement API 需要支持自定义资源类和一种使用它们进行 Nova 调度的机制。
测试¶
应测试以下场景
创建一个反亲和性预留,并验证属于该预留的所有实例都调度到不同的宿主上。
验证主机预留和实例预留都从同一个 freepool 中选择宿主,并且 Blazar 正确协调所有预留。
文档影响¶
API 参考
参考资料¶
Placement API: https://docs.openstack.org/developer/nova/placement.html
历史记录¶
发布名称 |
描述 |
|---|---|
Pike |
引入 |