自动向非管理员镜像注入元数据属性¶
https://blueprints.launchpad.net/glance/+spec/inject-automatic-metadata
云操作员希望基于不同计算节点上的某些镜像元数据属性来启动虚拟机。
问题描述¶
操作员向用户提供公共镜像,用户也可以在 glance 中添加自己的镜像并使用这些镜像来启动虚拟机。作为操作员,所有由操作员提供的镜像都应在特定的计算节点集上启动,而由非管理员用户创建的镜像应在其他计算节点集上启动。启动虚拟机到特定计算节点的决策将基于镜像元数据。当操作员创建镜像时,他们可以指定某些镜像元数据,这些元数据将由 placement api 或调度服务用来决定虚拟机应该启动在何处,但如果用户创建镜像,用户将不知道应该设置哪些镜像元数据属性,因此在当前的 placement api 和调度逻辑中,有可能在任何计算节点上启动虚拟机。这是一个大问题。
用例:¶
操作员希望基于镜像元数据属性,将用户创建的镜像启动到特定的计算节点集(主机聚合组)上。
提议的变更¶
提供一种机制,通过属性保护,在将镜像添加到 glance 后端时,自动向非管理员镜像注入镜像元数据。我们计划引入两个新的配置选项来实现这一点。1) ‘ignore_user_roles’ 是一个逗号分隔的角色列表。默认值为 admin。2) ‘inject’ 默认值为 None。
‘inject’ 配置选项将包含 json 格式(键值对)的镜像元数据,操作员希望将其添加到新创建的镜像中,如果用户角色与 ‘ignore_user_roles’ 配置选项中提到的角色不符。如果用户角色与 ‘ignore_user_roles’ 中提到的角色不相同,并且 ‘inject’ 不包含任何元数据属性,则不会向非管理员镜像注入任何元数据。
我们建议创建新的配置文件 ‘glance-image-import.conf’,其中将包含所有与镜像导入任务相关的配置选项。每个可插拔的任务都可以有自己的部分,该部分定义其在该文件中的配置选项。
例如,对于注入元数据属性,‘glance-image-import.conf’ 将具有如下 ‘property_injections’ 部分:
[inject_metadata_properties] ignore_user_roles = admin,… inject = { “property1”: “value”, “property2”: “value,another value” }
注意:当用户从镜像创建卷时,所有镜像元数据都将被复制到卷中,并作为 volume_image_metadata 提供。现在,当用户将卷复制回镜像时,它将尝试添加 ‘property1’ 元数据,并且会失败,因为它仅允许由管理员创建。为了解决这个问题,需要提供一种机制,如果请求来自角色未在 ‘ignore_user_roles’ 配置选项中指定的用户的请求,则忽略 ‘inject’ 配置选项中指定的所有属性。例如,当用户执行将卷复制回镜像时,如果 inject 选项中提到的属性将被静默忽略,即从卷创建的新镜像不包含 ‘inject’ 配置选项中提到的特殊元数据属性。
[some_other_yet_undefined_task] will_have = “it’s own configs”
我们将使用属性保护,以便非管理员用户无法添加、更新或删除自动注入的元数据属性。但是,非管理员用户可以查看这些元数据属性。例如,如果 ‘inject’ 设置为 ‘property1=value’,那么在 property_protections.conf 文件中,操作员需要限制非管理员用户对 ‘property1’ 的写入和删除访问权限,如下所示:
[property1] create = admin read = admin,member,_member_ update = admin delete = admin
在 glance 中,用户可以使用两种方式创建镜像。1) create image API 2) Import image API
对于 import image API,因为它使用 taskflow,将创建一个额外的任务 ‘InjectMetadataProperties’ 来注入元数据。如果 ‘inject’ 属性不是 None,则只有 ‘InjectMetadataProperties’ 才会成为任务的一部分,否则将被简单地忽略。
不会对 create image API 进行任何更改。其意图是旧的上传工作流仅由服务使用,在大多数部署中不会暴露给最终用户。
注意:用户可以设置到镜像的镜像元数据属性数量有限制,可以使用 ‘image_property_quota’ 配置选项进行配置。如果其值为 128,并且假设 ‘inject’ 配置选项的数量为 3,那么用户自己只能添加 125 个元数据项,其余 3 个将自动注入。如果用户在 import image api 调用中尝试添加超过 125 个元数据项,则任务将被标记为失败,并显示适当的失败消息。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
对可以拥有的额外镜像元数据属性数量有限制,默认值为 128。可以使用 ‘image_property_quota’ 选项进行配置。如果操作员将此限制设置为更高的值,并且注入了更多的元数据属性,那么在 image-list 或 image-show 调用期间,性能会受到影响。
这种影响并非具体由本规范中的提案引起,在当前情况下也是如此。
其他部署者影响¶
管理员需要在 ‘inject_metadata_properties’ 部分的 ‘glance-image-import.conf’ 配置文件中设置 ‘ignore_user_roles’ 和 ‘inject’ 配置选项,以便为非管理员用户的新的镜像注入元数据属性。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
<bhagyashri-shewale>
- 其他贡献者
无
评审人员¶
- 核心评审人
Erno Kuvaja, Brian Rosmaita
- 其他审核员
无
工作项¶
提供从新的 glance-image-import.conf 读取配置选项的机制
添加两个新的配置选项
为 import 调用添加 ‘InjectMetadataProperties’ 任务
添加单元测试以覆盖
添加功能测试
依赖项¶
无
测试¶
将添加功能测试,以验证仅对非管理员镜像注入元数据。
文档影响¶
请参考 ‘Other deployer impact’
参考资料¶
无