支持 Glance v2 API

https://blueprints.launchpad.net/nova/+spec/use-glance-v2-api

本规范建议添加 Nova 使用 Glance v2 API 的能力,并启动对 Glance v1 API 支持的弃用阶段。

虽然 Nova 的部分组件已经使用 Glance v2 API,但此规范旨在使对 Glance v1 API 的依赖变为可选,以便在未来的版本中完全移除它。

问题描述

Glance 在 Kilo 版本中将 v1 的状态从 CURRENT 降级为 SUPPORTED。目前 Nova 需要访问 Glance v1 API。Glance 希望在 Newton 周期中弃用该 API,因此为了支持这一努力,Nova 应该停止使用 Glance v1 API。

由于多种原因,v1 不适合暴露给公众,其中一些原因如下:

  • 镜像 schema 未暴露;

  • 列出所有镜像的调用会显示详细信息,包括镜像上的所有属性,这可能导致查询缓慢甚至更糟;

  • 运维人员无法通过 schema 指定某些重要的属性作为其部署的一部分;

  • tags API 未暴露,如 API_WG 建议的那样;

  • 无法按多个字段排序;

  • 还有更多!

为了允许平滑升级,我们需要确保 Newton 支持使用 Glance v1 和 Glance v2,以便部署者有时间确保他们已部署 Glance v2,并且 Nova 可以使用它。

虽然 Nova 的某些区域已经使用 Glance v2,但仍有许多区域对 Glance v1 具有硬性依赖。仍然使用 Glance v1 的关键区域包括:

  • Nova 的 Image API,实际上只是 Glance v1 API 的代理;

  • Virt 驱动程序特定的镜像下载和镜像上传;

  • 镜像元数据的 CRUD 操作;

  • 在通用代码中创建和删除快照。

在我们可以停止 Nova 需要 Glance v1 并完全弃用对 Glance v1 的要求之前,我们需要移除上述所有 Glance v1 的使用。

注意

Nova 的外部 API 必须保持兼容性,无论它使用 Glance v1 还是 Glance v2,以便在版本之间实现平滑升级。

用例

目前,Nova 部署者被迫安装 Glance v1 和 Glance v2。这是因为 Nova 当前需要 Glance v1,但由于其明显的缺点,只有 Glance v2 才被认为可以安全地暴露给最终用户。

假设 Nova 对 Glance v2 的缺乏支持导致了混淆,阻碍了人们部署 Glance v2。这反过来又给 DefCore 工作带来了一些问题。

提议的变更

对 Glance v2 的支持将在 Nova 代码中完成。

注意

由于 Glance v1 正在移动到 DEPRECATED 状态并将被移除,因此 Nova 中的代码应该编写为优化将来删除 Glance v1 代码的便利性。这意味着在代码流程的早期做出 v1 / v2 API 决策,并且不要将 v1 / v2 处理合并到通用方法中。

约束

Nova Images API 仍然需要工作(在合理范围内)。它应该被移动到由 Glance v2 提供支持。一旦代理开始在后端使用 Glance V2 API,元数据的大小写问题是一个已知问题。

Nova 安装在生产环境中应该始终只使用 Glance API 的一个版本。在代码深处来回切换会增加很多复杂性。

Xen virt 驱动程序需要在 dom0 中使用一个运行 python 2.4 的辅助程序。

详细更改

在 [glance] 部分引入一个 CONF 项 use_glance_v1=True。这将消除自动发现 Glance API 版本的需要。 api_servers 配置今天指定无版本 API 服务器,因此与此一致。一旦我们有一个 CI 作业禁用 glance v1 API 并启用 glance V2 API 通过将标志设置为 False 并最终通过所有测试,该 conf 参数将被弃用。

如果在代码中存在 glance v1 / v2 方法和类的差异,则应该为 glance v1 与 v2 交互构建独立于类的代码。这允许我们将来轻松删除 v1 代码。

备选方案

无。

数据模型影响

无。

REST API 影响

Nova Images API 在元数据的大小写方面将存在不兼容性。这是不可避免的。

安全影响

无。

通知影响

无。

其他最终用户影响

最终用户必须记住 v1 和 v2 apis 之间存在一些不兼容性

  • v1 中的镜像属性通过 http headers 传递,这使得它们不区分大小写。在 v2 中,镜像信息作为 json 文档传递,‘MyProperty’ 和 ‘myproperty’ 是两个不同的属性。

  • 在 v1 中,用户可以创建自定义属性,如 ‘owner’ 或 ‘created_at’,它们存储在特殊的字典 ‘properties’ 中。v2 镜像具有扁平结构,这意味着所有自定义属性都位于与基本属性相同的级别。这导致如果 v1 镜像具有与基本属性名称相同的自定义属性,则该属性在 v2 中将被忽略。示例输出差异

    • v1 镜像输出

      {
        "name": "image_name",
        "owner": "image_owner"
        "properties":
           {
              "name": "just a custom property",
              "owner": "another custom property",
              "licence": "gpl v2",
           }
      }
      
    • v2 镜像输出

      {
        "name": "image_name",
        "owner": "image_owner"
        "licence": "gpl v2",
      }
      

Nova 代理应该具有代码,以确保即使在后端使用 Glance V2 API 时也能保留 V1 输出格式。

  • v2 禁止用户指定一些镜像属性,如 idsize

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

mfedosin

其他贡献者

flaper87 sudipto nikhil-komawar

工作项

  • 引入一个顶级布尔标志来区分 Glance V1 和 V2 路径。布尔值 use_glance_v1 默认设置为 True,以确保默认情况下使用 Glance V1 API。一旦布尔值翻转为 False,Nova 代理将开始使用 Glance V2 API。

  • 引入 GlanceImageServiceV2 作为与 GlanceImageService 类似的类。预计这两个类之间存在代码重复,但是一旦 V1 API 被弃用,所有与 GlanceImageService 相关联的代码都应该被删除。

  • 进行以下代码重构,以确保对 Glance V2 API 执行的 CRUD 操作的输出与默认使用 Glance V1 的现有 Nova 代理输出保持一致

    • 添加另一个“基于 schema”的处理程序,将 glance v2 镜像输出转换为 nova.image 中采用的格式。

    • 添加额外的处理程序,将 v1 镜像过滤器转换为 v2。相关功能请求:https://bugs.launchpad.net/nova/+bug/1201266

    • 添加对两步镜像创建(在 db 中创建记录 + 文件上传)的转换。

    • 添加一个特殊处理程序,用于创建带有大小为 ‘0’ 的不带镜像数据的活动镜像。

    • 添加设置镜像自定义位置的能力。它需要 libvirt 驱动程序,用于 Ceph 后端。

      注意

      show_multiple_locations 选项必须在 glance 配置中启用才能使其工作。在 v1 中,默认情况下启用自定义位置设置,对于 v2,必须显式激活此选项。相关的策略必须进行修改以允许这样做。

    • 添加一个特殊处理程序来删除镜像中的自定义属性:v1 中的 purge_props 标志与 v2 中的 props_to_remove 列表。

  • 调整 Xen virt 驱动程序以支持 v2 api。

  • 确保代码库的其余部分可以使用现有的镜像代码与 Glance v1 或 Glance v2 通信,默认情况下使用 Glance V1,然后如上所述切换到 Glance V2。

  • 确保所有 virt 驱动程序都支持 Glance v2 或回退到 v1。

  • 如果在日志中运行 Glance v1,添加弃用警告。

依赖项

必须在合并代码之前修复 Bug https://bugs.launchpad.net/nova/+bug/1539698

测试

今天的 gate 作业启用 glance v1 和 v2。CONF.glance.use_glance_v1 选项默认设置为 True,因此补丁将针对 v1 进行测试。然后我们将添加一个作业来禁用 glance v1 并仅启用 glance v2,并配置 nova 将 CONF.glance.use_glance_v1 设置为 False,我们将针对 glance v2 集成系列中的顶级更改运行该作业。

那时我们弃用 use_glance_v1 选项,一旦我们知道它只通过 v2 堆栈测试。

文档影响

  • 需要记录 Glance API 版本配置选项

  • 发布说明应指出 Glance v1 支持的部分弃用

  • 发布说明应警告任何无法与 Glance v2 运行的 virt 驱动程序。

  • 应更新文档,以突出显示前面规范中提到的关于大小写问题。

参考资料

无。

历史

修订版

发布名称

描述

Liberty

引入

Mitaka

部分实现

Newton

重新提出