配置选项以控制未设置统一限制的行为¶
https://blueprints.launchpad.net/nova/+spec/unified-limits-nova-unset-limits
当 [quota]driver 设置为 nova.quota.UnifiedLimitsDriver 时,Nova 使用的 oslo.limit 配额强制执行库的默认行为是将没有注册限制设置的资源视为限制为零。这种行为可能过于严格,尤其是在启用统一限制配额的升级场景中(即,如果我们希望将统一限制作为默认设置)。如果在 Nova 内部使该行为可配置,我们可以帮助防止管理员/操作员升级或安装 Nova 后,由于超出配额而突然导致所有 API 请求被拒绝的情况。
问题描述¶
问题集中在使用 oslo.limit 配额强制执行库时,当给定资源没有设置注册限制时,其行为。如果未找到资源的注册限制,则强制执行函数会将该资源的限制视为 0,并且所有针对该资源的请求都将因超出配额而失败。
我们希望能够更改默认配额驱动程序为 UnifiedLimitsDriver,但上述行为引发了有关更改默认值的担忧。
如果我们要在 Nova 中将统一限制配额设为默认值,那么在升级之前未审核所有资源及其限制的任何管理员/操作员都可能在升级后立即遭受 Nova API 的完全服务拒绝。如果 Keystone 中缺少一个资源的注册限制,就可能发生这种情况。
虽然理想情况下,管理员/操作员在像这样升级的场景中不会遗漏设置任何注册限制,但遗漏单个资源限制的惩罚非常严厉,因为 API 会拒绝该资源的所有请求,从而导致立即出现紧急情况。
用例¶
作为管理员/操作员,我希望能够控制哪些资源需要设置限制。我还希望能够控制哪些资源不需要设置任何限制,方法是不将它们包含在所需的资源列表中。
作为管理员/操作员,我希望能够在 Keystone 中遗漏设置资源的注册限制时看到 DEBUG 日志消息,而不是让所有涉及该资源的 API 请求因超出配额而被拒绝。
提议的变更¶
本规范的建议是在 [quota] 组中添加新的配置选项,这些选项将使操作员能够
仅对特定资源强制执行限制,或者
对除特定资源之外的所有资源强制执行限制
这些选项的目标是使未设置统一限制的管理变得容易且长期可维护。
备选方案¶
或者,我们可以对 oslo.limit 库进行更改,以处理缺失的注册限制,而不用它今天的方式 [1]。这将更加困难,因为 oslo.limit 1) 具有既定的默认行为,并且 2) 提供适合所有 OpenStack 项目的新行为可能是不现实的。
之前提出的替代方案是一个布尔配置选项 [quota]strict_unified_limits,它只有两种模式:将未设置的限制视为零或将未设置的限制视为无限大 [2]。上次 PTG 的讨论表明,布尔选项可能过于通用,并且不会提供大多数操作员需要的控制级别。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
如果未配置资源以需要限制强制执行,则该资源将被视为具有无限配额,恶意调用者可能会尝试故意耗尽该资源。
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
使用新的配置选项来处理未设置限制的性能影响应该相对较小,因为它将在每次 1) 配额检查失败和 2) oslo.limit 返回资源的限制为 0 时添加一个额外的 Keystone API 调用。
其他部署者影响¶
管理员/操作员需要考虑是否以及何时需要调整配置值,如果新的 Placement 资源类被添加到他们的部署中。
此外,作为这项工作的一部分,nova-manage limits migrate_to_unified_limits CLI 命令将得到增强,以扫描数据库中的 flavors,查找没有设置注册限制的资源,并在输出中显示它们。目的是帮助管理员/操作员捕获所有资源并在启用统一限制配额之前为它们设置限制。
开发人员影响¶
无
升级影响¶
使用新的配置选项进行升级不应产生任何影响。
对于不使用 [quota]driver = nova.quota.UnifiedLimitsDriver 运行的部署者,配置选项无效。
对于已经使用 [quota]driver = nova.quota.UnifiedLimitsDriver 运行的部署者,他们必须已经为云中分配的所有资源设置注册限制(因为当前行为是默认将所有限制设置为零),并且不应经历这些资源的配额强制执行方式的任何变化。
但是,升级后,部署者添加到云中的任何 _新_ 资源将根据部署者配置的新选项,默认设置为无限配额或默认设置为零配额,直到部署者在 Keystone 中为其设置注册限制。如果部署者需要更新配置选项值,则需要为 nova-api 和 nova-conductor 服务更新它们。如果 [quota]recheck_quota = True(默认值),则 nova-conductor 服务执行配额“重新检查”。
对于在升级期间切换到 [quota]driver = nova.quota.UnifiedLimitsDriver 的部署者,默认行为只会需要配置选项中默认资源的限制(当前建议为 servers)。
建议这些部署者首先使用 nova-manage limits migrate_to_unified_limits 工具,让它从 Nova 数据库和 [quota] 配置选项中读取其旧的配额限制,并在 Keystone 中自动设置它们。该命令的输出还将显示在部署中使用的任何资源,但未在 Keystone 中设置注册限制。部署者可以使用此信息来了解需要在 Keystone 中设置限制的资源。
然后,部署者应根据他们希望强制执行配额的资源,从列表中添加或删除资源。所有其他资源将被视为具有无限配额,直到部署者在 Keystone 中为其设置注册限制。
实现¶
负责人¶
- 主要负责人
melwitt
- 其他贡献者
无
功能联络人¶
- 功能联络人
melwitt
工作项¶
添加配置选项以控制需要在 Keystone 中设置注册限制的资源
增强
nova-manage limits migrate_to_unified_limits命令以扫描数据库 flavors,检测没有设置注册限制的资源,并将它们显示给用户,以便他们知道需要设置哪些限制
依赖项¶
测试¶
将通过编写新的功能测试来测试新配置选项的功能。将测试添加到 nova-next CI 任务的后测试钩子也是一种可能性。
文档影响¶
将更新 统一限制文档,以包含有关新配置选项的信息。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
2024.2 达尔马提安 |
引入 |
2025.1 Epoxy |
重新提出更改 |