Cyborg 资源配额使用

Launchpad 蓝图: https://blueprints.launchpad.net/openstack-cyborg/+spec/cyborg-resource-quota

OpenStack 云可以有多种切分方式。对这些不同的切分施加配额,可以限制资源的消耗量,从而有助于在创建时保证“公平性”或资源的公平分配。如果某个项目需要更多资源,配额的概念使其能够根据需求增加资源数量,前提是不超过系统限制。

问题描述

目前在 Cyborg 中,我们还没有加速资源的配额概念,因此用户可以消耗任意数量的资源。配额与物理资源和可计费实体密切相关,因此从 Cyborg 的角度来看,它可以帮助限制特定类型资源在某个值上的分配和消耗。

与像其他服务一样实现配额不同,我们希望启用 Keystone 提供的统一限制来管理我们的配额限制[1]。使用统一限制,所有限制都将设置在 Keystone 中,并由 oslo.limit 强制执行。因此,我们决定首先实现配额使用部分。一旦 oslo.limit 为其他服务准备就绪,Cyborg 将调用 oslo.limit 来获取限制信息并进行限制检查等。

本规范旨在实现 Cyborg 中的配额使用。由于 oslo.limit 尚未完成,我们可以直接手动设置限制值,并保留调用 oslo.limit 的函数,并在函数内部使用“pass”占位。

用例

Alice 是一个管理员。她希望有一个功能,可以让她了解 Cyborg 加速资源消耗的详细信息,以便她能够适当地管理她的资源。

她可能会遇到以下场景

  • 能够了解当前的资源消耗情况。

  • 能够禁止项目过度使用资源。

  • 防止由于其他项目中的用户消耗了所有资源而导致项目中的用户资源匮乏的情况。“配额管理”有助于保证“公平性”。

  • 防止用户发起类似 DOS 类型的攻击、滥用或错误,从而导致过度分配资源。

提议的变更

提议的更改是引入一个 Quota_Usage 表,主要存储为每个项目分配的每个资源的配额使用情况,以及一个 Reservation 表来存储资源使用情况的每次修改。

当新的资源分配请求到来时,Quota usages 表中的“reserved”字段将被更新。此加速资源正被用于设置虚拟机。例如,fpga 配额硬限制为 5,并且已经使用了 3 个 fpga,然后来了两个新的 fpga 请求。由于我们已经使用了 3 个 fpga,因此“used”字段将被设置为 3。现在,“reserved”字段将被设置为 2,直到 fpga 附加成功。一旦完成附加,此字段将被重置为 0,并且“used”计数将从 3 更新为 5。因此,此时,硬限制为 5,used 为 5,in-progress 为 0。如果再有一个请求到来,由于没有足够的配额可用,此请求将被拒绝。

通常来说,

可用资源配额 = 资源硬限制 - [(已保留的资源 + 项目已分配的资源)]

在本规范中,我们只关注配额使用情况的更新,并且不会检查用户是否已经超过了他的配额限制。限制管理将在 Keystone 中设置,我们只需要调用 oslo.limit 即可。

备选方案

目前 Cyborg 中没有配额基础设施。

在编排层添加配额管理层可能是一种替代方案。但是,我们的方法将在 IaaS 层提供对资源消耗情况的更细致的视图,这可以在配置 Cyborg 资源时使用。

数据模型影响

将向 Cyborg 数据库引入新的 Quota usages 和 reservation 表,以存储每个项目中每个资源的配额消耗情况。

配额使用表

字段

类型

是否为空

默认值

额外信息

created_at updated_at id project_id resource reserved used

datetime datetime int(11) varchar(255) varchar(255) int(11) int(11)

是 是 否 是 否 否 否

主键 唯一

NULL NULL NULL NULL NULL NULL NULL

自增

配额预留表

字段

类型

是否为空

默认值

额外信息

created_at updated_at deleted_at deleted id uuid usage_id project_id resource delta expire

datetime datetime datetime tinyint(1) int(11) varchar(36) int(11) varchar(255) varchar(255) int(11) datetime

是 是 是 是 否 否 是 是 否 是

主键

唯一 唯一

NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

自增

我们还将引入 QuotaEngine 类,它代表一组已识别的配额,以及 DbQuotaDriver 类,它执行配额的检查和强制执行,并允许获取配额信息。

REST API 影响

在 oslo.limit 稳定下来之前,我们是否需要公开 GET 配额使用情况还不确定。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发者影响

实现

负责人

主要负责人:王欣然

其他贡献者:无

工作项

  • 在 Cyborg 数据库中引入配额使用和预留表。

  • 在资源分配和释放期间更新这两个表。

  • 保留调用 oslo.limit 的函数的位置,并在函数内部使用“pass”占位。

  • 添加分配失败时的回滚机制。

依赖项

测试

  • 每个提交都将附带单元测试。

  • 还将涵盖门控功能测试。

文档影响

参考资料

[1] https://review.opendev.org/#/c/540803