支持 Blazar 的抢占式实例

https://blueprints.launchpad.net/blazar/+spec/blazar-preemptible-instances

本规范建议为 Blazar 添加对抢占式实例的支持。这将允许通过填充预留之间的空隙来提高利用率,并提供不需要修改 Nova 计算服务的抢占式实例的实现。

问题描述

为了确保在预留到达开始时间时,为预留分配的资源未被使用,Blazar 依赖于对专用资源池的独占管理。对于计算资源,由 Blazar 管理的计算主机最初会移动到名为 freepool 的主机聚合中。未在预留内部启动的常规实例不允许在 freepool 中的节点上运行。如果预留未充分利用 Blazar 管理的资源,这可能导致利用率低下。本规范建议添加对抢占式实例的支持,即当基础设施需要时可以随时终止的实例,以通过填充预留之间的空隙来提高利用率。

此功能还将为 OpenStack 提供一种最小侵入性的抢占式实例实现:基于向 Nova 添加 挂起状态 的替代实现已被证明难以被接受。

用例

此功能主要面向希望通过填充用户预留之间的空隙来提高基础设施利用率的 Blazar 操作员。它还将使最终用户受益,他们可以通过提供额外的资源来运行抢占式工作负载。

提议的变更

由于 Blazar 的设计,只需对代码进行少量修改即可支持抢占式实例。需要以下机制

  1. 一种识别不同类型的实例创建请求和正在运行的实例的方法:常规(非预留)实例、预留实例和抢占式实例。

  2. 修改自定义 Nova 调度器过滤器 BlazarFilter,以允许被视为抢占式的实例在 freepool 中的主机上启动,并且仅在 freepool 中启动:我们不希望抢占式实例在未由 Blazar 管理的主机或属于预留的主机上运行。

  3. 在租约变为活动状态之前,实现实例预留和主机预留的 Blazar 计算插件将终止在分配的主机上运行的任何抢占式实例,使用前面提到的方法识别它们。

这些机制将在下面更详细地描述。

识别抢占式实例创建请求

要将实例创建请求识别为抢占式实例的请求,可以使用一些可能的方法:

  1. 操作员将通过 Blazar 静态配置或 API 调用配置一个项目 ID 列表,该列表描述了任何实例创建请求都被视为抢占式实例的请求的项目。

    • 优点:可以将抢占式实例限制到特定项目

    • 缺点:除非使用特殊的通配模式,否则无法允许所有项目的抢占式实例;可能还需要一种方法让项目请求非抢占式实例;可能难以识别正在运行的抢占式实例。

  2. 通过调度器提示:如果传递了调度器提示 preemptible=true,则将实例创建请求识别为抢占式实例。

    • 优点:无需操作员配置即可由任何项目使用

    • 缺点:无需操作员配置即可由任何项目使用;可能难以识别正在运行的抢占式实例。

  3. 通过 flavor 属性:使用 flavor 属性来识别抢占式实例。例如,可以使用以下方法配置现有 flavor 以启动抢占式实例:openstack flavor set FLAVOR-NAME --property blazar:preemptible=true

    • 优点:flavor 可以公开或仅与特定项目共享;易于识别正在运行的抢占式实例。

    • 缺点:如果所有 flavor 都有可能被抢占,则会使 flavor 的数量翻倍

  4. 通过镜像属性:使用镜像属性来识别抢占式实例。例如,可以使用以下方法配置现有镜像以启动抢占式实例:openstack image set --property blazar:preemptible=true IMAGE_UUID

    • 优点:易于识别正在运行的抢占式实例

    • 缺点:除非策略阻止设置镜像属性,否则任何项目都可以使用抢占式实例;还需要涵盖卷;可能导致镜像重复。

识别正在运行的抢占式实例

对于分配给主机预留的计算主机,正在运行的抢占式实例只是在任何预留之外在分配的主机上执行的实例。

对于分配给实例预留的计算主机,作为预留的一部分启动的实例通过它们使用的 flavor 识别,该 flavor 编码为预留信息中的 flavor_id。Blazar flavor 还遵循特定的命名方案:reservation:<reservation_id>。在分配的主机上运行的不使用此类 flavor 的实例将被识别为抢占式实例。

终止抢占式实例

需要在租约变为活动状态之前终止抢占式实例。实现实例预留和主机预留的 Blazar 计算插件将终止在分配的主机上运行的任何抢占式实例,使用前面提到的方法识别它们。

为了允许抢占式实例干净地终止其工作负载,可以首先触发软关机操作,然后进行硬关机(实例删除)。为了使租约启动操作快速,我们可能希望实现一个 before_start_lease 事件,类似于 before_end_lease 事件,该事件将在触发 start_lease 事件之前终止任何抢占式实例。

但是,我们也希望防止在发送实例终止请求后启动任何新的抢占式实例。如果使用 before_start_lease 方法,这可能难以从 BlazarFilter 实现,因为它无法访问 Blazar 数据库,因此无法有效地检查租约和事件的状态。向 Blazar 的 API 调用可能太慢,无法处理通过过滤器的大量主机。

与配额的交互

抢占式实例将计入 Nova 配额中的实例数量、vCPU、内存和磁盘的常规实例。这意味着通过运行抢占式实例达到配额的项目将无法启动任何新的常规实例:他们首先需要终止抢占式实例以将其使用量降低到其配额允许的最大值以下。

操作员可以通过配置专门的项目来专门运行抢占式实例来防止这种情况,即不在同一项目中混合抢占式实例和常规实例。

备选方案

Nova 中的本机实现将更加灵活,因为它允许抢占式实例在常规实例主动使用它们之前在保留主机上运行。但是,基于引入 挂起状态 的提议实现已被社区证明难以接受。

数据模型影响

REST API 影响

安全影响

必须正确处理 Nova 调度器和 Blazar 管理器之间的竞争条件,以防止在启动预留时启动抢占式实例。未能终止所有抢占式实例将导致预留所有者无法完全使用其预留。

通知影响

其他最终用户影响

Nova 最终用户将使用前面描述的机制之一来请求抢占式实例。

性能影响

on_start() 期间终止抢占式实例会使租约启动时间更长,尤其是在向实例发送软关机信号时。基于引入新事件的解决方案前面在本规范中描述过,但它存在缺点。

其他部署者影响

以下配置选项将添加到 blazar.conf

  • [preemptible]/graceful_shutdown_time: 在软关机请求和终止请求之间等待的时间

开发者影响

升级影响

实现

负责人

主要负责人

priteau

工作项

  1. 仅主机预留插件的 PoC

  2. 实例预留的支持

  3. 常规改进(例如,软关机信号)

  4. 文档和 Tempest 场景测试

依赖项

测试

必须实现一个 Tempest 场景,以验证在预留启动时可以启动和终止抢占式实例。这需要一个完整的 OpenStack 环境。当前 DevStack 可以使用。

文档影响

启动抢占式实例的操作员和用户受此更改的影响最大。应更新管理员和用户指南。

参考资料

历史记录

修订版

发布名称

描述

Ussuri

引入