允许根据策略复制未拥有的镜像

https://blueprints.launchpad.net/glance/+spec/copy-unowned-image

目前 Glance 有一种机制,允许用户在两个(或更多)后端存储之间复制镜像。这仅适用于他们自己拥有的镜像,涵盖了该功能的大部分用例。但是,考虑到不同类型的云,管理员可能希望用户能够复制他们不拥有的镜像,以优化性能和提高存储效率。

问题描述

目前,用户只能复制他们拥有的镜像,没有办法允许其他操作。这可能会导致反模式行为,例如下载镜像并重新上传,以便可以复制它。此外,它可能会阻止优化,例如用户预先将公共镜像复制到存储中,以便边缘站点提高启动时间,以及 CoW 重用。

具体来说,Nova 正在开发一项功能,以自动改进存储效率,在许多情况下,这依赖于此能力。Glance 已经支持多种后端存储一段时间了,但 Nova(特别是 ceph/rbd 镜像后端)只能与 Glance 在单个 ceph 集群上进行协作。如果涉及多个集群,最坏的情况是 Nova 将通过 HTTP 从 Glance 下载镜像,然后将其上传到 ceph 后端存储,作为私有于实例的基础镜像。这将导致快速快照能力丧失以及存储效率大幅降低。请参阅 Nova 关于 Glance 多存储能力规范

提议的变更

允许 copy-image 导入方法检查策略以获取权限,而不是硬编码“是管理员或所有者”行为。如果策略授予了权限,则使用管理员上下文代表请求用户启动实际的导入任务。

由于“是管理员或所有者”行为深深嵌入到 Glance 的许多层中,因此启用此功能需要大量工作。作为此过程的一部分,导入任务会将所有可能委托给非所有者的镜像操作合并到一个位置,以帮助进行审计。只有当策略授予此权限时(仅适用于 copy-image),才会向任务提供一个具有管理员权限的 ImageRepo,供其在镜像属性操作中使用。

当通过此机制由非所有者执行 copy-image 操作时,应该清楚的是,镜像的所有权(以及在此过程中创建的任何新资源)保持不变。

备选方案

  • 一种替代方案是直接说“抱歉,只有拥有的镜像才能被复制”。

  • 另一种替代方案是让 Nova 存储 Glance 管理员凭据,并有效地在 Nova 端实现策略检查,必要时使用管理员用户复制镜像。

数据模型影响

无。

REST API 影响

没有添加新的 API 或返回代码。存在一种小的隐含行为变化,即用户可能能够复制他们以前无法复制的镜像。

安全影响

与任何策略更改一样,存在意外地将提升的权限授予某些用户的可能性。假设代码正确,这与其他策略旋钮没有区别。此操作的默认策略将保持“是管理员或所有者”,因此除非操作员选择启用,否则不会发生实际更改。

使用管理员上下文进行操作也存在潜在影响,与以往相比,它更有可能造成损害或泄露信息。通过以下设计要点可以减轻这种影响

  • 管理员上下文不会传递给导入任务,而是仅用于获取具有管理员权限的 ImageRepo,并将其提供给任务。

  • 作为管理员代表用户执行的所有相关操作都限制在一个“actions”对象中,以便于审计。

  • 这仅(目前)应用于 copy-image 导入方法,这意味着(理想情况下)最大的权限提升是将用户已经可以查看的镜像复制到新的后端存储。

通知影响

无。

其他最终用户影响

无。

性能影响

对 Glance 没有影响,但在 Nova 能够使用此功能将镜像放置在给定远程站点的后端的情况下,对整个系统有净积极影响。

其他部署者影响

无。

开发人员影响

API 和任务本身之间洋葱层中存在许多更改。这主要围绕着可选的 admin_repo 参数,该参数可以通过 gatewayproxy 传递到任务。

实现

负责人

主要负责人

danms

工作项

  • 添加测试来验证当前行为,并在功能成型时提供更改的度量。

  • 重构任务创建代码,以允许从 API 到任务传递可选的 admin_repo

  • 添加一个 context.elevated() 助手,就像其他项目一样,它保留了用户的大部分上下文,但具有管理员权限。

  • 重构 api_image_import 模块,以整合所有需要委托给 admin_repo 的镜像操作(如果它从 API 传递而来)。

  • copy_image 添加一个策略操作,这是管理员启用此功能的关键旋钮。

  • 更新 image_importcopy-image 方法的文档,以解释管理员、所有者和用户委托的期望,当允许非所有者执行此操作时。

依赖项

无。

测试

  • 在进行实际更改之前,将添加新的功能和单元测试来验证当前行为。一路上的每个补丁都将修改或扩充这些测试,以测试新行为并确保没有回归。

  • Nova 将最终获得一个测试作业,该作业将部署多个存储,包括一个 rbd 支持的存储,并将代表一个不拥有公共 cirros 镜像的 tempest 临时租户发起一个 copy-image 导入。

文档影响

可能需要有关策略旋钮的文档,解释其作用、如何使用以及管理员可能希望使用它的原因。

参考资料