复制现有镜像到多个存储¶
https://blueprints.launchpad.net/glance/+spec/copy-existing-image
尽管镜像服务支持多种后端来存储虚拟机镜像,但目前没有办法将现有的镜像数据复制到多个存储中,避免操作员手动复制数据并更新镜像位置。
问题描述¶
目前,如果云提供商决定将其云升级到 Train 版本以使用 Glance 配置多个存储的能力,那么就没有办法将现有的镜像数据复制到新添加的存储中。因此,今天操作员需要执行许多手动步骤来复制 Glance 存储上的镜像数据,即使使用了“enabled_backends”配置选项也是如此。
注意
示例
一位操作员将其现有的 OpenStack 云升级配置为不同的站点,每个站点都有自己的本地 Glance 存储,Nova 主机直接访问这些存储(Ceph)。
该操作员使用多存储支持,并希望其镜像在每个存储中可用,以防止每次创建新的虚拟机时都通过 Glance 下载镜像,并让 Nova 使用 COW。
为此,他需要手动将现有的镜像数据复制到 store2 到 storeN 中,并使用 Glance API 注册这些其他位置的 URL。
由于 Glance 支持多存储,因此应该提出一项功能,以便一次性将现有的镜像数据复制到这些存储中,以方便操作员的工作。
提议的变更¶
此规范依赖于 将镜像导入到多个存储的能力 [1] 将镜像复制到多个存储中。除了上述更改和现有的导入方法 glance-direct 和 web-download 之外,此规范建议引入额外的导入方法 copy-image。
如果需要复制数据的镜像未处于活动状态,则 API 应拒绝该请求。如果镜像存在,则它将被复制到暂存区域。一旦复制到暂存任务完成,导入任务将把数据导入到所有指定的存储中。如果在将现有数据复制到暂存区域或成功完成将数据复制/导入到指定存储的过程中发生任何故障,则暂存区域中的镜像数据将被删除。
引入一个额外的任务,它将是内部插件,允许我们将现有的镜像复制到暂存区域。为了将现有的镜像复制到暂存区域,我们将首先优先考虑该特定 glance-api 节点的 default_backend。如果镜像未与 default_backend 关联,我们将遍历该特定 glance-api 节点的 所有可用后端,以从该位置复制(下载)镜像到暂存区域。故障机制与依赖规范 将镜像导入到多个存储的能力 [1] 相同。
如果指定了布尔字段“all_stores”,则 API 应拒绝该请求。
如果指定了不可用的镜像,则 API 应拒绝该请求。
如果指定了不可用的存储,则 API 应拒绝该请求。
如果镜像已存在于指定位置,则 API 应拒绝该请求。
如果在将数据复制到新存储时删除了基本镜像,则复制过程将被终止,并且复制的数据也将被删除。
如果将“all_stores_must_succeed”设置为“true”(默认行为),并且在至少一个存储中发生错误,则应拒绝该请求,数据将被删除从已完成复制的存储(不是暂存)中删除,并且镜像的状态保持不变。
如果将“all_stores_must_succeed”设置为“false”,则请求仅在用户指定的 所有存储上上传失败时才会失败。在部分成功的情况下,添加到镜像的位置将是已正确上传数据 的存储。
在复制/导入到指定存储的过程中发生故障或成功完成的情况下,暂存区域中的镜像数据将被删除。
用户可以通过查看 2 个保留的镜像自定义属性来跟踪复制/导入操作的进度
os_glance_importing_to_stores: 此属性包含尚未处理的存储列表。在复制/导入流程开始时,它将填充请求中提供的存储。每次完全处理一个存储时,它将从列表中删除。即使发生错误并且仍有剩余存储,此属性也会在流程结束时清空。
os_glance_failed_import: 每次在存储中导入失败时,它都会添加到此列表中。此属性在复制/导入流程开始时清空。
每次在存储中成功上传/复制时,镜像位置都会更新(包含此存储的信息)。
当前的位置策略模块不应受到这些更改的影响,因为我们不会更改镜像位置的行为。目前可以通过修补镜像并指定位置列表来实现相同的功能。
同样,由于在导入工作流中使用存储时已经可以选择存储,因此无需添加新的策略来限制将镜像复制到多个存储。
备选方案¶
继续手动将镜像复制到不同的存储,并使用位置 API 更新位置。
数据模型影响¶
无
REST API 影响¶
此规范提出了以下 API 更改
修改后的 API
导入镜像。
常见响应代码
正常的 http 响应代码:202
202: 已接受
预期的错误 http 响应代码:400、401、404、409、410
400: 错误请求,包含详细信息。
401: 未授权
404: 未找到(镜像不存在或不属于调用者所有)
409: 冲突(镜像状态不合适)
410: 已消失(镜像在操作进行中被删除)
API 版本
此更改需要次要版本更新。所有 URL 都在 v2 Glance API 下。如果未明确指定,则假定为 /v2/<url>。
[修改后的 API] 将镜像导入到存储
将镜像导入到存储
POST /v2/images/{image_id}/import
If present, copy this image in multiple stores specified using `stores`
option.
示例 curl 用法
curl -i -X POST -H "X-Auth-Token: $token"
-H "Content-Type: application/json"
-d '{"method":{"name":"copy-image"},
"stores": ["ceph1", "ceph2"],
"allow_failure": false}'
$image_url/v2/images/{image_id}/import
安全影响¶
无
通知影响¶
每次镜像成功复制时,都会发送通知。
其他最终用户影响¶
无
性能影响¶
由于我们将数据写入多个存储,这将根据指定的存储数量增加 Glance 节点的 IO。从用户角度来看,导入工作流也将花费更多时间,具体取决于复制的存储。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
主要负责人
abhishekk
评审人员¶
核心评审人
jokke
rosmaita
工作项¶
实施任务可能包括
编写新的内部插件,将镜像数据复制到暂存区域
依赖项¶
无
测试¶
适当的单元和功能测试,以确保 Glance 的更改正常工作。主要的测试项目是确保如果复制 taskflow 失败,数据将仅从新存储中删除,而不是从镜像已经存在的存储中删除,并且镜像状态不会更改。
文档影响¶
我们需要确保 Glance 文档已更新为
镜像导入的新主体字段。
镜像导入的新导入方法。