公开存储特定信息¶
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