管理统一限制配额

注意

本节提供关于配额功能的部署信息。有关配额的最终用户信息,包括可用配额类型的相关信息,请参阅 用户指南

Nova 28.0.0 (2023.2 Bobcat) 版本发布以来,建议使用 Keystone 统一限制 作为 Nova 配额限制。

有关传统配额限制的信息,请参阅 传统配额文档

配额

为了防止系统容量在没有通知的情况下耗尽,您可以设置配额。配额是运行限制。例如,可以控制每个项目允许的服务器数量,从而优化云资源。配额可以在全局(默认)级别和项目级别进行强制执行。

统一限制

统一限制是一种现代配额系统,其中配额限制集中在 Keystone 身份服务中。在此模型中,配额强制执行分为三个步骤

  1. 通过调用 Keystone 统一限制 API 来检索配额限制

  2. 配额使用情况来自 Placement API 服务

  3. 使用 oslo.limit 限制强制执行库在本地强制执行配额

在统一限制中,术语与传统配额略有不同

  • 一个 已注册的限制 是适用于所有项目的全局或默认限制

  • 一个 限制 是适用于特定项目的项目范围限制

云运营商需要通过直接调用 API 或使用 OpenStackClient (OSC) 已注册的限制限制 命令来管理他们的配额限制。

角色

默认情况下,Keystone API 策略要求用户具有以下角色和范围才能执行与统一限制相关的操作。

行动

角色

范围

列出已注册的限制

*

*

获取已注册的限制

*

*

创建已注册的限制

admin(管理员)

system=all

更新已注册的限制

admin(管理员)

system=all

删除已注册的限制

admin(管理员)

system=all

列出限制

*

*

获取限制

*

*

创建限制

admin(管理员)

system=all

更新限制

admin(管理员)

system=all

删除限制

admin(管理员)

system=all

配置

要启用统一限制配额,需要对 nova-api-wsginova-conductor 服务的 Nova 进行一些配置。

将配额驱动程序设置为 nova.quota.UnifiedLimitsDriver

[quota]
driver = nova.quota.UnifiedLimitsDriver

添加 oslo.limit 的配置部分

[oslo_limit]
username = nova
user_domain_name = $SERVICE_DOMAIN_NAME
auth_url = $KEYSTONE_SERVICE_URI
auth_type = password
password = $SERVICE_PASSWORD
system_scope = all
endpoint_id = $SERVICE_ENDPOINT_ID

注意

可以通过 openstack endpoint list --service nova -f value -c ID 获取 Nova 服务端点 ID

确保 nova 服务用户具有 reader 角色和 system 范围

openstack role add --user nova --user-domain $SERVICE_DOMAIN_NAME \
   --system all reader

设置资源配额限制

云中可以请求的任何资源都必须设置已注册的限制。由于 oslo.limit 将未注册的资源视为限制为 0,因此在设置已注册的限制之前,对没有已注册限制的云资源的配额检查将继续失败。

配额类型

作为 Placement API 服务中的 资源类 跟踪的资源的统一限制资源名称遵循 class: 前缀后跟资源类名称的命名模式。例如:class:VCPU、class:PCPU、class:MEMORY_MB、class:DISK_GB、class:VGPU。

配额名称

描述

class:VCPU

每个项目允许的共享 CPU 核心 (VCPU) 数量

class:PCPU

每个项目允许的专用 CPU 核心 (PCPU) 数量

servers

每个项目允许的实例数量

server_key_pairs

每个用户允许的密钥对数量

server_metadata_items

每个实例允许的元数据项数量

class:MEMORY_MB

每个项目允许的实例内存(以 MB 为单位)

server_groups

每个项目的服务器组数量

server_group_members

每个服务器组的服务器数量

class:DISK_GB

每个项目允许的实例磁盘(以 GB 为单位)

class:$RESOURCE_CLASS

Placement API 服务中的任何资源类都可以为其指定配额限制(例如:class:VGPU)

OpenStack CLI 命令

有关完整的 OpenStackClient 文档,请参阅 https://docs.openstack.org/python-openstackclient/2025.2/index.html

已注册的限制

要列出 Nova 的默认限制

openstack registered limit list --service nova

要显示默认限制的详细信息

openstack registered limit show $REGISTERED_LIMIT_ID

要创建默认限制

openstack registered limit create --service nova --default-limit $LIMIT \
   $RESOURCE

要更新默认限制

openstack registered limit set --default-limit $LIMIT $REGISTERED_LIMIT_ID

要删除默认限制

openstack registered limit delete $REGISTERED_LIMIT_ID

限制

要列出 Nova 的项目限制

openstack limit list --service nova

要列出特定项目的限制

openstack limit list --service nova --project $PROJECT_ID

要显示项目限制的详细信息

openstack limit show $LIMIT_ID

要创建项目限制

openstack limit create --service nova --project $PROJECT_ID \
   --resource-limit $LIMIT $RESOURCE

要更新项目限制

openstack limit set --resource-limit $LIMIT $LIMIT_ID

要删除项目限制

openstack limit delete $LIMIT_ID

配额强制执行

在为给定资源和项目强制执行限制时,将按以下顺序进行检查

  1. 限制(项目特定)

    根据资源,Keystone 限制中是否有项目特定的资源限制?如果是,则将其用作限制。如果不是,则继续检查已注册的默认限制。

  2. 已注册的限制(默认)

    根据资源,Keystone 限制中是否有默认限制?如果是,则将其用作限制。如果不是,oslo.limit 将认为限制为 0,配额检查将失败,并会引发配额超出异常。

警告

云中可以请求的每个资源 必须 至少设置一个已注册的限制。由于 oslo.limit 将未注册的资源视为限制为 0,因此未设置已注册限制的任何资源将导致配额强制执行失败。

重新检查配额

如果 quota.recheck_quota = True(默认情况下为 True),Nova 将在分配资源后执行第二次配额检查。第一次配额检查在分配资源之前执行。重新检查配额可确保严格执行配额限制,并防止在并行 API 请求发生竞争时出现资源分配超出配额限制的可能性。

如果严格的配额执行对运营商不重要,可以通过设置 quota.recheck_quota = False 来禁用它。

来自 Placement 的配额使用情况

使用统一限制配额,要求从 Placement API 服务计算配额资源使用情况。因此,当 quota.driver 设置为 nova.quota.UnifiedLimitsDriver 时,quota.count_usage_from_placement 配置选项将被忽略。

在从 Placement API 服务计算配额资源使用情况时,需要注意以下几点

  • 在多个 Nova 部署共享 Placement 部署的环境中,计算的使用情况将不准确,因为 Placement 当前无法在不同的 Nova 部署之间划分资源提供者。正在运行共享 Placement 部署的多个 Nova 部署的运营商不应使用 nova.quota.UnifiedLimitsDriver

  • 对于调整大小,行为会有所不同。在调整大小期间,资源将在源和目标上保留(即使在同一主机上,请参阅 https://bugs.launchpad.net/nova/+bug/1790204)直到确认或撤销调整大小。处于此状态的服务器的配额使用量将会膨胀。

  • 必须在从 Placement 计算使用情况之前完成 populate_queued_for_deletepopulate_user_id 联机数据迁移。在完成数据迁移之前,系统将回退到从单元数据库计算传统配额使用情况,具体取决于每次配额检查期间数据库 EXISTS 查询的结果。使用 nova-manage db online_data_migrations 运行联机数据迁移。

  • 处于 ERROR 状态的未计划服务器的行为会有所不同。从未计划到计算主机的 ERROR 状态的服务器将没有 Placement 分配,因此不会消耗核心和内存的配额使用量。

  • 处于 SHELVED_OFFLOADED 状态的服务器的行为会有所不同。处于 SHELVED_OFFLOADED 状态的服务器将没有 Placement 分配,因此不会消耗核心和内存的配额使用量。请注意,由于此原因,如果用户没有足够的配额来支持需要取消搁置的服务器所需的内核和内存,则取消搁置服务器的请求可能会被拒绝。

迁移到统一限制配额

有一个 nova-manage 命令可用于帮助从传统 Nova 数据库配额迁移到 Keystone 统一限制配额。该命令将从 Nova 数据库读取配额限制,并调用 Keystone API 创建相应的统一限制。

$ nova-manage limits migrate_to_unified_limits -h
usage: nova-manage limits migrate_to_unified_limits
[-h] [--project-id <project-id>] [--region-id <region-id>] [--verbose]
[--dry-run]

Copy quota limits from the Nova API database to Keystone.

options:
  -h, --help            show this help message and exit
  --project-id <project-id>
                        Project ID for which to migrate quota limits
  --region-id <region-id>
                        Region ID for which to migrate quota limits
  --verbose             Provide verbose output during execution.
  --dry-run             Show what limits would be created without actually
                        creating them.

重要提示

每个用户的配额限制将 不会 复制到 Keystone,因为统一限制不支持每个用户的配额。

需要或忽略资源

配置选项 quota.unified_limits_resource_strategyquota.unified_limits_resource_list 可供运营商指定他们将要求在 Keystone 中设置已注册限制的云资源。默认策略为 require,默认资源列表包含 servers 资源。

unified_limits_resource_strategy = require 时,如果在 unified_limits_resource_list 中请求的资源没有设置已注册的限制,则该资源的配额限制将被视为 0,并且所有分配该资源的请求都将被拒绝,因为超出配额。不在列表中的任何资源将被视为具有无限配额。

unified_limits_resource_strategy = ignore 时,如果在 unified_limits_resource_list 中请求的资源没有设置已注册的限制,则该资源的配额限制将被视为无限,并且所有分配该资源的请求都将被接受。不在列表中的任何资源将被视为具有 0 配额。

应为 nova-api-wsginova-conductor 服务配置这些选项。nova-conductor 服务在 quota.recheck_quotaTrue(默认值)时执行配额强制执行。

可以将 unified_limits_resource_list 列表设置为一个空列表。

示例配置值

[quota]
unified_limits_resource_strategy = require
unified_limits_resource_list = servers,class:VCPU,class:MEMORY_MB,class:DISK_GB