操作员维护的镜像生命周期

https://blueprints.launchpad.net/glance/+spec/hidden-images

本规范解决了云操作员需要维护一个只包含最新镜像版本的公共镜像列表的问题。

问题描述

云操作员提供公共镜像,供最终用户启动服务器使用。例如,包含 CentOS 7 操作系统的镜像。随着安全问题等的出现,这些镜像需要更新。然而,在 Glance 中,镜像数据是不可变的,因此每次更新都会产生一个新的公共镜像。此外,操作员不希望删除“旧”公共镜像,因为最终用户可能需要它们用于不同的用例,例如服务器重建。因此,最终用户的默认镜像列表会变得非常大。此外,默认镜像列表可能包含多个 CentOS 7 镜像,例如,这使得最终用户难以确定使用哪个镜像。

注意

示例

操作员为 CentOS 7 提供一个带有标准软件包的镜像 1。OpenSSL 中发现了一个小的安全问题,因此操作员提供了带有更新的 OpenSSL 的 CentOS 7 镜像 2。然后,发现了一个内核漏洞,操作员发布了带有更新的 OpenSSL 和修补的内核的 CentOS 7 镜像 3。这些都是镜像的“版本”,但都是相同版本的 CentOS 7。操作员希望新用户从镜像 3 开始,但使用时间较长的用户可能希望继续使用镜像 1 并自行修补/升级(例如,OpenSSL 更新引入了一个与用户正在运行的关键软件冲突的依赖项)。如果所有三个镜像都具有公共可见性,那么所有三个镜像都会出现在最终用户的默认镜像列表中。

当前的做法是通过在镜像上添加自定义属性来解决此问题,例如,"is_current": "yes",但这特定于操作员且不可互操作。然而,这只能解决问题的一部分,因为最终用户必须了解查找 "is_current" 镜像属性。如果只有具有 "is_current": "yes" 的镜像包含在最终用户的默认镜像列表中,那会更好。

提议的变更

本规范建议在镜像表中添加一个新的布尔列 "os_hidden"。对于 "os_hidden" = True 的镜像,将从呈现给用户的镜像列表中省略。这将适用于所有镜像可见性。但是,这些镜像将继续可被发现。

注意

示例

用户想要一个 CentOS 7 提供商镜像,因此他使用:"?visibility=public"GET v2/images 调用上。他看到一个 CentOS 7 镜像,但注意到它是在今天创建的,所以他意识到这不是他正在寻找的镜像。所以现在他使用 "?visibility=public&os_hidden=true" 来获取所有可用镜像的列表。

如果镜像具有 "os_hidden" = False,则该镜像不会从镜像列表中省略。它保留了当前行为。

在镜像创建时,如果未指定,则使用 "os_hidden" = False

更改属性“os_hidden”将被视为镜像更新。因为,该策略已经为此操作定义,所以不需要其他更改。

在创建/显示镜像的响应中,新属性将显示为 os_hidden。如果 Rocky 之前的镜像已经具有名为 os_hidden 的自定义属性,则该属性将不再在 Rocky 版本的响应中可见。

考虑到定义的策略,镜像中的所有操作将继续可用。

备选方案

与其使用新的镜像属性,我们可以使用新的可见性 = “hidden”。具有这种新可见性状态的镜像将不在默认镜像列表中。要列出具有可见性“hidden”的镜像,需要显式请求它。例如:"property --visibility=hide" 具有“hidden”可见性的镜像始终可以被用户发现。

此解决方案的灵活性较低,因为可见性“hidden”可能与“public”具有相同的范围。需要通过策略控制可以使用此可见性的用户角色。

另一种方法是使用建议的新镜像属性“hidden”,但不使这些镜像通过 API 可被发现。但是,存在项目可能需要特定镜像版本的情况(例如:不同的操作系统版本,如 CentOS7.4 到 CentOS7.5;支持其软件在特定镜像上的设备供应商)。如果“hidden”镜像不可发现,云管理员需要实施他们自己的解决方案来公开这些镜像。

数据模型影响

在镜像表中添加“os_hidden”布尔列。

对于 E-M-C 迁移策略,建议采用

  • 触发器:不需要。Rocky 之前的 glance 版本将拒绝设置“os_hidden”的镜像更新调用,并返回 400 错误,因为它不识别该字段。

  • 扩展:将在镜像表中添加一个布尔“os_hidden”列。

  • 契约:不需要

  • 数据迁移:不需要。

REST API 影响

GET 调用将接受一个新的属性“os_hidden”。GET v2/images … os_hidden=true/false 默认情况下,API 将认为 os_hidden=false。

安全影响

通知影响

其他最终用户影响

最终用户需要知道云提供商可能会“隐藏”旧镜像。这特定于每个云提供商。

性能影响

开发人员影响

实现

负责人

主要负责人:- Abhishek Kekane

工作项

  • 在 GET 调用中添加对属性“os_hidden”的支持。考虑默认“os_hidden=false”。

  • 更改镜像表模式,添加一个新字段。

  • 更改 glance-client 以支持新属性。

依赖项

测试

待定

参考资料