添加新的导入方法以支持从另一个 glance/区域下载镜像

https://blueprints.launchpad.net/glance/+spec/glance-download-import

本文档描述了一种名为 glance-download 的新导入方法,它在具有联合 Keystone 的多区域云中实现 glance 到 glance 的下载。

问题描述

在处理多区域云时,通常会出现操作员或客户需要将镜像从一个区域复制到另一个区域的情况,例如

  • 将所有公共镜像复制到您的区域之间(操作员)

  • 将实例快照复制到另一个区域以进行备份(用户)

  • 在一个区域的工厂中构建基本的应用程序镜像,然后将其传播到多个区域(用户)

我们不能依赖“copy-image”导入方法从一个后端复制镜像到另一个后端,因为它需要在同一区域的相同 glance 端点,这与我们在此处的用例不符。

现在我们唯一可以做到的是本地下载镜像数据并将其上传到其他地方,这需要一些编排,并且会造成巨大的磁盘空间和带宽损失。

提议的变更

实现一个基于现有内部插件 web-download 的内部插件 glance-download,它将导入存储在远程 glance 上的镜像。web-download 工作流程将保持不变,唯一的区别是从另一个 glance 端点而不是从任意 URL 获取可下载的数据。

我们应该注意几点

  • 为了在远程 glance 上进行身份验证,我们建议使用调用的上下文令牌,因此它需要在两个 Glance 之间使用联合 Keystone 环境。

  • 镜像的创建必须由最终用户处理,就像 web-download 插件一样,这意味着用户有责任处理新创建镜像的磁盘格式、容器格式和元数据。如果需要,插件将更新容器格式和磁盘格式以匹配源 glance 上设置的内容。

  • 该插件将包含一个额外的 taskflow 任务,该任务负责将容器格式和磁盘格式设置为与源 glance 上的格式相同。它还将复制在 glance_download_properties 部分的 extra_properties_prefixes 选项中定义的额外属性。默认的 extra_properties_prefixes 值是 ‘hw_’、‘trait:’、‘os_distro’、‘os_secure_boot’ 和 ‘os_type’,这些值对于确保实例可以在镜像上启动是必需的。操作员可以通过修改此配置变量来删除或添加其他额外属性。这个 extra_properties_prefixes 是一个前缀列表,这意味着所有以该列表中属于的前缀开头的元数据都将被复制。

[glance_download_properties]
extra_properties_prefixes = [
    hw_,
    trait:,
    os_distro,
    os_secure_boot,
    os_type
  ]
  • 如果目标 glance 上配置了元数据注入,它将覆盖元数据,因为注入在导入之后运行。

备选方案

我们可以想象一种提取替代方案,在这种方案中,源云中的镜像所有者生成一个有限使用的令牌化 URL,允许访问镜像而无需任何 keystone 身份验证。这种解决方案风险更大,因为我们没有访问远程镜像的任何身份验证机制。它还需要重写代码,因为没有现有的源代码。

这还需要开发一种管理临时 URL 的创建和到期机制,这将导致一个更复杂的解决方案,需要更多的时间来开发、记录和测试。

数据模型影响

REST API 影响

现有 API 资源的修改

  • 资源 /v2/images/<image id>/import

  • 方法:POST

  • 常用响应代码
    • 201:导入作业已排队

    • 400:带有详细信息的错误请求

    • 401:未授权

    • 403:禁止

  • JSON 正文定义

"method": {
    "name": {
        "description": "Name of the method used, here is glance-download",
        "type": "string"
    },
    "glance_image_id": {
        "description": "The image id to download on remote glance",
        "type": "string"
    },
    "glance_region": {
        "description": "The region name of remote glance",
        "type": "string"
    },
    "glance_service_interface": {
        "decription": "The interface of remote glance, default to 'public'",
        "type": "string"
    }
}

示例

 "method": {
     "name": "glance-download",
     "glance_image_id": "02ea04ba-72b3-4687-810d-8ba10c991a97",
     "glance_region": "REGION1",
     "glance_service_interface": "admin"
}

安全影响

我们使用请求的令牌在远程 glance 上进行身份验证。由于我们处于具有联合 keystone 的多区域上下文中,因此没有安全影响。

通知影响

其他最终用户影响

用户在更新他们的客户端后,将拥有一个新的导入机制。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

pslestang

其他贡献者

alistarle

工作项

  • glance

    • 创建一个基础下载类,web-download 和 glance-download 将继承该类

    • 修补 web-download 类以从基础下载类继承

    • 编写 glance-download 类

    • 修补 api 镜像导入以支持 glance-download 方法

    • 在 task flow 中添加一个类,负责

      • 设置正确的容器格式和磁盘格式

      • 复制 glance_download_properties 部分的 extra_properties 选项中定义的元数据。默认列表必须是 [‘hw_’、‘trait:’、‘os_distro’、‘os_secure_boot’、‘os_type’]

    • 该类必须作为常规任务添加到 taskflow 中,以便在需要时可重用。我们只需要检查输入参数才能知道是否可以运行它。

    • 在 setup 中添加 glance-download 内部插件

    • 编写单元/功能测试

    • 更新文档

    • glance 和 openstack 客户端

      • 添加对 glance-download 方法的支持

    • 更新文档

依赖项

测试

  • Glance 中的单元和功能测试

  • Tempest 测试。使用 g-api-r 分离的端点测试 glance-download 插件效果很好,即使它共享相同的数据库,也可以验证工作流程。

文档影响

需要更新文档以识别这种新的导入方法

参考资料