公开存储特定信息

https://blueprints.launchpad.net/glance/+spec/expose-store-specific-info

问题描述

当我们将来自 cinder 的 RBD 后端上传的卷作为镜像上传到 glance 的 RBD 后端时,会执行通用的逐块复制数据代码路径,这使得操作非常缓慢。可以通过对 rbd 后端使用 COW 克隆来优化此过程,为此 Cinder 需要来自 glance 侧的存储类型和 rbd 特定存储信息。

提议的变更

目前 Discovery (GET /v2/info/stores) API 提供了多个后端和默认存储的列表,但没有提供存储的类型。

我们将通过添加一个新的 API (GET /v2/info/stores/detail) 来扩展 Discovery (GET /v2/info/stores) API 的功能,该 API 将暴露有关存储的存储特定细节,例如存储类型和其他特定的存储属性。

由于存储特定信息主要供其他服务(如 cinder)或操作员使用,而不是供最终用户使用,因此此操作将仅限管理员访问,我们将引入一个新的策略 stores_info_detail,该策略默认设置为仅限管理员规则,以限制非管理员用户访问。未来,当 keystone 中的 service 角色到位以促进服务之间的交互时,将相应地调整此策略规则。

我们将使用现有的方法 get_store_from_store_identifier,该方法返回存储类实例,并利用它来获取存储特定信息,并通过 API 以定义的格式返回。有关更多详细信息,请参阅 REST API 影响 部分。

备选方案

数据模型影响

REST API 影响

我们将添加一个新的 API GET /v2/info/stores/detail,它将返回存储细节,例如存储类型和存储特定属性。它将通过新的策略规则 stores_info_detail 进行验证,该规则默认设置为仅限管理员,然后将返回与存储相关的详细信息。

GET /v2/info/stores/detail

输出如下

{
    "stores": [
        {
            "id":"reliable",
            "type": "rbd",
            "description": "More expensive store with data redundancy",
            "default": true,
            "properties": {
                "pool": "pool1"
            }
        },
        {
            "id":"cheap",
            "type": "file",
            "description": "Less expensive store for seldom-used images",
            "properties": {}
        },
    ]
}

我们将添加一个字段 type 来指定存储类型。我们还将添加一个字段 properties,它将是一种 JSON 对象类型,并包含存储特定的属性。对于当前用例,我们仅添加 RBD 存储信息,并将其他存储的属性保留为空 JSON 对象 {}

安全影响

由于此优化跳过了 glance 侧发生的镜像写入,因此它也会跳过在这种情况下计算的校验和和哈希值。由于上述情况,我们将在 cinder 侧添加一个新的配置选项来启用/禁用此优化。默认情况下,它将被禁用。

另一个情况是,我们需要在镜像详细信息响应中包含 direct-url 和镜像位置,以便受益于 nova-glance 或 cinder-glance 交互中的任何优化,这是一种在 OSSN-0065 中描述的安全问题。

通知影响

其他最终用户影响

将在 glanceclient 侧的 stores info 命令中添加一个新的可选参数 --detail

该参数将接受布尔值。如果 True,它将暴露存储特定信息,否则将显示有关存储的非详细信息,就像当前的工作方式一样。

  • 存储详细信息:glance stores-info --detail

    --detail

    在拥有足够权限的情况下,显示有关存储的附加信息。

性能影响

将显著改进 cinder RBD 到 glance RBD 的卷上传。

镜像大小

2GB

3GB

5GB

未使用 COW 克隆时的时长

1分17秒

1分15秒

2分49秒

使用 COW 克隆时的时长

1.29秒

2.32秒

1.63秒

-98%

-97%

-99%

其他部署者影响

开发人员影响

开发者影响

实现

负责人

主要负责人

mrjoshi, whoami-rajat

其他贡献者

工作项

  • 在 glanceclient 侧的 stores-info 命令中添加一个可选参数 --detail

  • 在 glance 中添加一个新的 API GET /v2/info/stores/detail

  • 创建一个新的策略 stores_info_detail,该策略默认设置为仅限管理员规则,并在传递 detail 标志时强制执行它。

依赖项

测试

  • 单元测试

  • 功能测试

  • Tempest 测试

文档影响

需要在 api-ref 中为新的 API GET /v2/info/stores/detail 添加一个新部分。

参考资料

https://review.opendev.org/c/openstack/cinder-specs/+/810363