计算镜像虚拟大小

https://blueprints.launchpad.net/glance/+spec/calculate-virtual-size

应在镜像上设置 ‘virtual_size’,以避免在消费者节点上运行 qemu_img 操作。

问题描述

镜像表中的 images 表格中存在 virtual_size 字段,但除非我们使用 taskflow introspect 创建镜像,否则该字段永远不会被设置。Glance 的消费者,如 nova 或 cinder,在计算虚拟大小之前从不使用镜像,这意味着每次他们请求镜像时,都需要执行 qemu_img info 调用来计算镜像的虚拟大小。

用例:

应在镜像上设置 ‘virtual_size’,以避免在消费者节点上运行 qemu_img 操作。

提议的变更

所有支持的稀疏磁盘镜像格式(即 glance 所说的 disk_format)模拟比实际存储的数据更大的虚拟磁盘,并将该虚拟大小记录在元数据中。我们建议为每种格式添加一个处理程序,该处理程序可以在流式传输镜像时检查块,以提取相关元数据来确定虚拟磁盘大小。

在 glance 中,用户可以使用两种方式创建镜像。1) 创建镜像 API 2) 导入镜像 API

通过此更改,即使用户尝试使用上述两种方法之一创建镜像,虚拟大小也会被设置为镜像。此外,由 nova(nova-snapshot,除了 ‘direct-to-backend snapshot’)或 cinder(volume-upload-to-image)创建的镜像也能够将虚拟大小设置为镜像。

注意:首先,我们将仅为 container-format 为 bare 或其他 uncompressed 格式的镜像计算虚拟大小。 稍后,根据需要或预期,我们将为其他 container-format 进行增强。

我们将在此操作在上传镜像数据到 glance 存储期间执行,因此对于镜像导入,这将发生在实际导入阶段,而不是阶段阶段。

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

danms

其他贡献者

评审人员

核心评审人

abhishek-kekane jokke rosmaita

其他审核员

whoami-rajat

工作项

  • 为每种 disk-format 添加处理程序

  • 为分块读取器添加包装器以计算虚拟大小

  • 添加单元测试以进行覆盖

  • 添加功能测试

依赖项

测试

Tempest 测试,用于验证使用 glance、nova snapshot 和 cinder upload-to-image 操作在镜像上设置虚拟大小。

文档影响

请参考 ‘其他部署者影响’

参考资料

https://review.opendev.org/#/c/744234