Manila qos 类型

蓝图:https://blueprints.launchpad.net/manila/+spec/qos-types

此蓝图建议添加一个新的对象来表示服务质量 (QoS)。 QoS 类型对象将包含用于定义服务质量所需属性的规格。

问题描述

Manila 后端驱动程序支持服务质量 (QoS) 功能,该功能允许操作员在共享存储上定义某些质量参数。 QoS 的参数作为驱动程序特定的参数传递到共享类型 extra-specs 中。 操作员必须定义 extra-specs 来描述 QoS,这会导致重复、缺乏重用以及跨共享类型的可见性差。 后端驱动程序支持 DHSS=True 和 DHSS=False。 使用共享类型 extra-specs 定义 QoS 的方式适用于策略和资源管理发生在 Openstack 外部的部署。 但是对于 Manila 集成管理,在运行时定义资源和策略的情况下,由于上述原因,使用共享类型 extra-specs 并不是在 Manila 资源上定义 QoS 的有效方法。 本规范提出了一种方法,使 Manila 能够创建多个 qos_types,并选择性地在共享类型 extra-spec 中提及其中一个。 qos_type 代表将应用于资源(例如共享存储)的 QoS 策略。

用例

  1. 操作员希望定义可重用的 QoS 配置文件(例如“Gold-QoS”、“Silver-QoS”)并将它们转换为将应用于各种 Manila 资源的 QoS 策略。

  2. 租户需要在配置共享存储之前了解共享类型的 QoS 特性。

  3. 驱动程序可以通过使用用于定义 QoS 类型的键/值对来实施 QoS 策略。

提议的变更

引入一个新的顶级对象:qos_type。

  1. qos_type 包含一个 id、名称、描述以及一组 qos_specs(键/值对)。 名称必须是唯一的。

  2. qos_type 名称可以在名为 default_qos_type 的共享类型 extra-spec 中指定。 从此类共享类型创建共享存储时,将选择 qos_type 及其规格并传递给后端驱动程序。 调度器必须验证后端驱动程序报告能力 qos_type_support 是否会被过滤。

  3. qos_type 生命周期管理(创建、更新、删除)将严格限制为管理员,这得益于默认的 RBAC 策略。 所有非管理员用户只能列出它们。

  • qos_type APIs

    qos_type 创建/删除/更新/显示/列出 APIs。

  • qos_type_specs APIs

    qos_type_specs 创建/删除/更新/显示/列出 APIs。

  • 修改共享存储创建 API

    为了允许用户通过 qos_type 选择所需 QoS 策略,必须在共享类型 extra-spec default_qos_type 中定义 qos_type 名称。 从此类共享类型创建共享存储时,将选择 qos_type 及其规格并传递给后端驱动程序。 调度器必须验证后端驱动程序报告能力 qos_type_support 是否会被过滤。

  • 后端驱动程序中的更改

    QoS 类型及其规格将在创建共享存储和共享服务器时提供给存储后端驱动程序。 后端驱动程序将在不存在的情况下创建 qos 策略并将其应用于资源。

备选方案

  1. 继续使用 extra_specs:会导致重复和不一致。 用户可以在配置共享存储之前检查共享类型的 QoS 特性,但它仅限于资源(例如共享存储)的单个 QoS 策略。

  2. 仅驱动程序实施:缺乏 API 和 DB 层的可见性,跨后端不一致。

数据模型影响

  • 共享存储表中新增字段

    字段

    类型

    是否为空

    默认值

    额外信息

    qos_type_id

    string(36)

    YES

    NULL

  • 新增表 qos_types

    字段

    类型

    是否为空

    默认值

    额外信息

    id

    string(36)

    主键

    name

    string(255)

    UNIQUE

    NULL

    description

    string(255)

    YES

    NULL

    deleted

    string(36)

    YES

    NULL

  • 新增表 qos_specs

    字段

    类型

    是否为空

    默认值

    额外信息

    id

    int(11)

    主键

    qos_type_id

    string(36)

    NULL

    string(255)

    NULL

    value

    string(1023)

    NULL

    deleted

    int(11)

    YES

    NULL

CLI API 影响

新的 OpenStackClient(OSC) 命令

openstack share qos type create <name> [--description <desc>]
                                [--spec <key=value>]

openstack share qos type list

openstack share qos type show <qos_type_id>

openstack share qos type set <qos_type_id> [--description <desc>]
                             [--spec <key=value>]

openstack share qos type delete <qos_type_id>

REST API 影响

** 创建 QoS 类型**

POST /v2/qos-types

如果是非管理员用户,则不应处理创建请求,API 将响应 403 Forbidden

请求

{
    "qos_type": {
        "name": "Gold-QoS",
        "description": "High-performance storage QoS",
        "specs": {
            "expected_iops": "500",
            "peak_iops": "5000",
            "peak_iops_allocation": "used-space",
        }
    }
}

响应(201)

{
    "qos_type": {
        "name": "Gold-QoS",
        "id": "b8b3d83f-96a2-45f2-9e39-ccf3ecf2ff33",
        "description": "High-performance storage QoS",
        "specs": {
            "expected_iops": "500",
            "peak_iops": "5000",
            "peak_iops_allocation": "used-space",
        },
        "created_at": "2025-09-04T10:00:00Z",
        "updated_at": None,
    }
}

** 显示 QoS 类型**

GET /v2/qos-types/{qos_type_id}

响应(200)

{
    "qos_type": {
        "name": "Gold-QoS",
        "id": "b8b3d83f-96a2-45f2-9e39-ccf3ecf2ff33",
        "description": "High-performance storage QoS",
        "specs": {
            "expected_iops": "500",
            "peak_iops": "5000",
            "peak_iops_allocation": "used-space",
        },
        "created_at": "2025-09-04T10:00:00Z",
        "updated_at": "2025-09-04T10:00:00Z",
    }
}

** 列出 QoS 类型。**

GET /v2/qos-types?{queries}

在详细和索引 APIs 中,查询将允许使用精确和不精确(“name”、“name~”等)属性进行过滤。

响应(200)

{
    "qos_types": [
        {
            "name": "Gold-QoS",
            "id": "b8b3d83f-96a2-45f2-9e39-ccf3ecf2ff33",
            "description": "High-performance storage QoS",
            "specs": {
                 "expected_iops": "500",
                 "peak_iops": "5000",
                 "peak_iops_allocation": "used-space",
            },
            "created_at": "2025-09-04T10:00:00Z",
            "updated_at": "2025-09-04T10:00:00Z",
        },
        {
            "name": "Silver-QoS",
            "id": "c8b3d83f-96a2-45f2-9e39-ccf3ecf2ff33",
            "description": "Mid-performance storage QoS",
            "specs": {
                 "expected_iops": "300",
                 "peak_iops": "3000",
                 "peak_iops_allocation": "used-space",
            },
            "created_at": "2025-09-04T11:00:00Z",
            "updated_at": "2025-09-04T11:00:00Z",
        }
    ]
}

** 更新 QoS 类型。**

PUT /v2/qos-types/{qos_type_id}

请求

{
    "qos_type": {
        "description": "High-performance storage QoS - Update",
    }
}

如果是非管理员用户,则不应处理更新请求,API 将响应 403 Forbidden

响应(200)

{
    "qos_type": {
        "name": "Gold-QoS",
        "id": "b8b3d83f-96a2-45f2-9e39-ccf3ecf2ff33",
        "description": "High-performance storage QoS - Update",
        "specs": {
            "expected_iops": "500",
            "peak_iops": "5000",
            "peak_iops_allocation": "used-space",
        },
        "created_at": "2025-09-04T10:00:00Z",
        "updated_at": "2025-09-04T11:00:00Z",
    }
}

** 删除 QoS 类型。**

DELETE /v2/qos-types/{qos_type_id}

如果是非管理员用户,则不应处理删除请求,API 将响应 403 Forbidden。 此外,如果 qos_type 被共享存储使用,API 将响应 400 BadRequest

响应(204)

None

** 创建 QoS 类型规格**

POST /v2/qos-types/{qos_type_id}/specs

如果是非管理员用户,则不应处理创建请求,API 将响应 403 Forbidden

请求

{
    "specs": {
        "expected_iops": "500",
        "peak_iops": "5000",
        "peak_iops_allocation": "used-space",
    }
}

响应(202)

{
    "specs": {
        "expected_iops": "500",
        "peak_iops": "5000",
        "peak_iops_allocation": "used-space",
    }
}

** 列出 QoS 类型规格**

GET /v2/qos-types/{qos_type_id}/specs

响应(200)

{
    "specs": {
        "expected_iops": "500",
        "peak_iops": "5000",
        "peak_iops_allocation": "used-space",
    }
}

** 显示 QoS 类型规格**

GET /v2/qos-types/{qos_type_id}/specs/{key}

响应(200)

{
    "expected_iops": "500",
}

** 更新 QoS 类型规格。**

PUT /v2/qos-types/{qos_type_id}/specs

请求

{
    "expected_iops": "600",
}

如果是非管理员用户,则不应处理更新请求,API 将响应 403 Forbidden

响应(200)

{
    "expected_iops": "600",
}

** 删除 QoS 类型规格。**

DELETE /v2/qos-types/{qos_type_id}/specs/{key}

如果是非管理员用户,则不应处理删除请求,API 将响应 403 Forbidden

响应(204)

None

驱动程序影响

后端驱动程序需要实施

  • 驱动程序支持 qos_type 将报告 qos_type_support 能力。

  • 存储后端驱动程序将在创建共享存储或共享服务器等资源期间接收 qos_type 及其规格。 然后,驱动程序决定如何使用这些规格来创建和将 QoS 策略应用于资源。

  • 修改 QoS 类型规格在创建共享存储之后会导致不确定的行为,必须避免。 修改不会在存储后端强制执行。 这意味着某些驱动程序可以选择仅对新的共享存储应用修改,并保持现有共享存储不变,而其他驱动程序可能会更改现有共享存储和新共享存储的行为。 但是,只有在创建新的共享存储时才会触发此修改。

安全影响

由于默认的 RBAC,QoS 类型和规格的创建/更新/删除操作仅适用于管理员用户。 所有用户只能列出和使用 QoS 类型及其规格。

通知影响

对于各自的操作,将发出“qos_type.create”、“qos_type.update”和“qos_type.delete”通知事件。

其他最终用户影响

性能影响

  • 列出 QoS 类型时的最小开销。

其他部署者影响

当云升级到支持此功能的版本并且管理员想要启用此功能时,他需要遵循以下步骤。

  1. 创建一个或多个 qos_types

  2. 为 qos_type 创建有效的规格

  3. 对于共享类型 extra-spec,添加 extra-spec default_qos_type 并将 qos_type 名称作为值。 从此类共享类型创建的共享存储将考虑 qos_type,假设驱动程序支持 qos_type_support 能力。

开发人员影响

为 Manila-core 以及参考驱动程序实施此功能。

实现

负责人

主要负责人

工作项

  • 添加 DB 迁移和 ORM 模型。

  • 实施 DB API 函数用于 CRUD 和关联。

  • 实施 qos_type 和 qos_type_specs 的 REST API 控制器。

  • 添加 OSC 插件命令。

  • Horizon UI 更新。

  • Tempest 和单元测试覆盖率。

  • 文档和发行说明。

未来工作项目

可以通过将它们与共享类型关联来支持单个共享类型下的多个 qos_types。 如果出现这种情况,可以增强当前的规范。

依赖项

测试

  • 单元测试

  • Tempest 测试

文档影响

  • 文档字符串

  • Devref

  • 用户指南

  • 管理员指南

  • 发布说明

参考资料