支持 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 禁止用户指定一些镜像属性,如
id或size。
性能影响¶
无。
其他部署者影响¶
无。
开发人员影响¶
无。
实现¶
负责人¶
主要负责人
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 |
重新提出 |