复制现有镜像到多个存储

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-directweb-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 文档已更新为

  • 镜像导入的新主体字段。

  • 镜像导入的新导入方法。

参考资料