为调度器获取池 API 添加容量因子

https://blueprints.launchpad.net/cinder/+spec/add-capacity-factors-to-pool

本规范建议在响应获取池 API 请求时添加新的容量因子。

问题描述

通常,针对 Cinder 部署及其存储阵列会设置一些监控和告警,以警告/提醒云操作员存储空间不足或已用尽。目前 Cinder 查看其管理的后端容量因子的唯一机制是调用 Cinder API 获取池。这将返回有关后端/池的一些基本信息。但它并不能真正说明全部情况。

新的容量因子是 Cinder 在每次配置请求时计算的容量管理的各个方面。这些因子中的每一个都在运行时用于确定卷是否可以降落在特定池上。这些因子决定了池是已满还是未满,具体取决于几个因素,包括:

  • 薄/厚配置支持

  • 存储阵列报告的总容量

  • 存储阵列报告的可用容量

  • 保留百分比

  • 最大超额订阅率

根据这些配置设置和池功能,会计算出一组更广泛的因子来确定后端/池上的容量可用性。所有这些因子都决定了后端/池是否有空间、空间不足或 Cinder 可以使用的空间已用尽。

用例

作为 Cinder 的操作员,我希望 Cinder 报告其用于确定 Cinder 的后端/池是否有可用空间的所有因子和计算结果。只有 Cinder 拥有所有信息,并且 calculate_capacity_factors() 可以创建调度器使用的信息。它还应在池 API 请求中报告这些信息,以便监控和告警工具与 Cinder 调度器保持同步。

提议的变更

将从 calculate_capacity_factors() 创建的字典添加到获取池响应中的每个池信息中。容量因子与现在报告的功能不同。容量因子是基于后端存储看到的驱动程序报告的功能对容量计算的细分。根据每个池中的功能,例如 thin_provisioning_support 和 thick_provisioning_support,如果池支持,将为每个薄/厚配置计算因子。

{
  "total_capacity": 5120.0,
  "free_capacity": 4616,
  "reserved_capacity": 1024,
  "total_reserved_available_capacity": 4096,
  "max_over_subscription_ratio": None,
  "total_available_capacity": 4096,
  "provisioned_capacity": 500,
  "calculated_free_capacity": 3596,
  "virtual_free_capacity": 3596,
  "free_percent": 87.79296875,
  "provisioned_ratio": 0.1220703125,
  "provisioned_type": "thick"
}

备选方案

utils.py 中的 calculate_capacity_factors() 函数可以复制/粘贴到一些外部工具中,这些工具可以执行告警,但它容易与 Cinder 的版本不同步。因此,Cinder 本身应报告其计算出的每个后端/池的所有容量因子。然后 Cinder 将是其看到的和可以使用的容量的明确答案。

数据模型影响

REST API 影响

需要一个新的微版本,如果兼容,Cinder 将在池响应中返回 capacity_factors 字典。

GET /v3/{project_id}/scheduler-stats/get_pools?detail=True
{
    "pools": [
        {
            "name": "pool1",
            "capabilities": {
                "updated": "2014-10-28T00:00:00-00:00",
                "total_capacity_gb": 1024,
                "free_capacity_gb": 100,
                "volume_backend_name": "pool1",
                "reserved_percentage": 5,
                "driver_version": "1.0.0",
                "storage_protocol": "iSCSI",
                "QoS_support": false,
                "thin_provisioning_support": true,
                "thick_provisioning_support": true,
            },
            "capacity_factors": [
                {
                    "total_capacity": 1024,
                    "free_capacity": 100,
                    "reserved_capacity": 51,
                    "total_reserved_available_capacity": 973,
                    "max_over_subscription_ratio": None,
                    "total_available_capacity": 973,
                    "provisioned_capacity": 100,
                    "calculated_free_capacity": 873,
                    "virtual_free_capacity": 873,
                    "free_percent": 89.72,
                    "provisioned_ratio": 0.1028,
                    "provisioned_type": "thick"
                },
                {
                    "total_capacity": 1024,
                    "free_capacity": 100,
                    "reserved_capacity": 51,
                    "total_reserved_available_capacity": 973,
                    "max_over_subscription_ratio": 2,
                    "total_available_capacity": 1946,
                    "provisioned_capacity": 100,
                    "calculated_free_capacity": 1846,
                    "virtual_free_capacity": 1846,
                    "free_percent": 94.86,
                    "provisioned_ratio": 0.05,
                    "provisioned_type": "thin"
                }
            ],
        }
    ]
}

安全影响

Active/Active HA 影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

hemna (Walter A. Boring IV)

工作项

  • 添加新的微版本

  • 在获取池 API 响应中添加 capacity_factors

依赖项

测试

添加新的单元测试以显示 API 调用中返回的因子。

文档影响

添加文档以描述容量因子和 API 响应更改

参考资料

这在 Zed PTG 中进行了深入讨论:https://etherpad.opendev.org/p/zed-ptg-cinder

讨论的 Youtube 视频:https://www.youtube.com/watch?v=6yuOlGckkGE

容量因子定义 https://specs.openstack.org/openstack/cinder-specs/specs/queens/provisioning-improvements.html