直接部署接口通过HTTP服务器配置¶
https://storyboard.openstack.org/#!/story/1598852
本规范提出了一种机制,通过托管自定义HTTP服务作为镜像源提供程序,用于当使用Image服务时,direct 直接部署接口的配置。
问题描述¶
目前,direct 直接部署接口需要一个未认证的镜像源链接,以便在ramdisk上运行的agent可以从提供的链接下载镜像并将其部署到硬盘。
在典型的部署中,用户镜像由Image服务管理,并且在大多数情况下,访问由Identity服务控制。direct 直接部署接口依赖于Object Storage服务生成一个未认证的URL,该URL在一段时间内可访问(例如tempurl)。
问题在于,由于各种原因,Object Storage服务并非总是被采用于部署,并且它本身对部署施加了限制。例如:
它对小型云的益处不大,但会占用更多的硬件资源。
它要求裸机节点必须能够访问控制平面网络,这限制了网络拓扑。
它要求Image服务配置为使用swift作为后端,这可能会与原始后端冲突。
由于Ironic没有机制或手段来利用本地HTTP服务器来为IPA提供临时镜像文件以促进节点部署,因此本提案旨在通过提供对此的支持来提供替代方案。
提议的变更¶
要使此功能正常工作,需要在Ironic conductor节点上运行一个HTTP服务器。
目前有两种场景,如果 instance_info['image_source'] 指示它是一个glance镜像,direct 直接部署接口通过glance客户端生成tempurl,并将其存储到 instance_info['image_url'],否则它将直接作为 image_url 获取。这两种情况通常代表在云中使用Bare Metal服务或作为独立服务,分别。
本提案引入了一个新的字符串选项 [agent]image_download_source 来控制当 image_source 是glance镜像时将生成哪种类型的镜像URL。允许的值是 swift 和 http,默认值为 swift。
在不同的配置下,direct 直接部署接口的过程定义如下:
swift:保持当前逻辑,生成tempurl并将其更新到instance_info['image_url']。http:在节点部署之前,通过InstanceImageCache下载实例镜像,在本地HTTP服务可访问的目录中创建指向下载的实例镜像的符号链接,生成正确的URL并将其更新到instance_info['image_url']。
现有的 [deploy]http_root 将被重用以存储指向下载的实例镜像的符号链接。引入一个新的字符串选项 [deploy]http_image_subdir 以使其与iPXE相关脚本隔离。默认值为 agent_images。现有的 [deploy]http_url 将被重用以生成实例镜像URL。
direct 直接部署接口将使用相同的实例缓存进行镜像缓存,缓存将在 AgentDeploy.deploy 处执行。缓存实例镜像后,direct 直接部署接口将在 <http_root>/<http_image_subdir> 处创建指向实例镜像的符号链接以进行引用。如果一切按默认设置进行,它将是 /httpboot/agent_images/<node-uuid>。
direct 直接部署接口将在 AgentDeploy.prepare 处生成实例镜像的URL并将其更新到 instance_info。相应的镜像URL将是 <http_url>/<http_image_subdir>/<node-uuid>。符号链接将在节点部署完成时从状态 deploy failed 移除时,或在 AgentDeploy.clean_up 处移除。
转换镜像的规则¶
目前,iscsi 部署接口将在 [DEFAULT]force_raw_images 设置为True时将镜像转换为 raw。
而IPA以两种不同的方式处理实例镜像:
如果实例镜像格式为
raw,stream_raw_images为True且镜像类型为整个磁盘镜像,则镜像将被流式传输到Bare Metal的目标磁盘。否则,镜像将在写入磁盘之前缓存到内存中。
为了避免raw镜像被缓存到Bare Metal的内存中,direct 直接部署接口仅在满足以下条件时才将镜像转换为raw:
[DEFAULT]force_raw_images设置为True,[agent]stream_raw_images设置为True,实例镜像类型是整个磁盘镜像。
如果发生镜像转换,direct 直接部署接口将重新计算MD5校验和并更新必要的字段到 instance_info。
缓存共享¶
iscsi 和 direct 部署接口共享相同的缓存,但对镜像是否应转换为raw应用不同的规则。当两个接口同时使用时,这会导致缓存兼容性问题。
例如,假设我们使用iscsi部署节点A,使用分区镜像,然后使用direct部署节点B,使用相同的镜像。缓存中的镜像被转换为raw,但根据 direct 直接部署接口的规则,它假定镜像不会转换为raw,即使它将 force_raw 指定为false到镜像缓存,由于缓存命中,实际上不会执行任何镜像操作,这将导致 direct 直接部署接口实际上提供一个raw镜像但没有重新计算MD5校验和。
反之,如果我们反转上述顺序,iscsi 部署接口可能会获得一个qcow,而 [DEFAULT]force_raw_images 设置为true,虽然这可能不是问题,因为populate_image会在写入之前检查镜像格式。但它仍然不是一致的行为。
为了解决上述问题,本规范建议更新 ImageCache.fetch_image 以将输入参数 force_raw 纳入主镜像文件名中。
如果
force_raw设置为False,则主文件名不会更改。如果
force_raw设置为True,则主文件名将带有.converted作为文件扩展名,例如:/var/lib/ironic/master_images/6e2c5132-db24-4e0d-b612-478c3539da1e.converted
请注意,.converted 扩展名仅仅作为指示下载的镜像经过转换逻辑的指标。对于glance中的raw镜像,只要传入的 force_raw 参数为True,主镜像文件的名称仍然带有 .converted。
备选方案¶
另一种实现方法 支持agent直接从glance下载实例镜像 是支持IPA直接从glance下载实例镜像,此方法的部署限制与agent今天相同,裸机必须在配置网络上访问glance。但它可以解决对glance后端的依赖问题,因此可以作为进一步的工作。
与其从 direct 直接部署接口支持HTTP配置,也可以将其实现为新的部署接口,例如 direct-http。
数据模型影响¶
无
状态机影响¶
无。
REST API 影响¶
无
客户端 (CLI) 影响¶
无。
“ironic” CLI¶
“openstack baremetal” CLI¶
RPC API 影响¶
无。
驱动程序 API 影响¶
无。
Nova 驱动程序影响¶
无
Ramdisk 影响¶
无
安全影响¶
在Ironic conductor节点上提供HTTP服务会暴露可访问的端口,从而可能产生安全影响。有几种方法可以提高安全性:
将端口绑定到专门用于配置网络的网络接口。
配置防火墙以防止来自配置网络以外的源IP地址的访问。
可能还有其他方法,但这超出了本规范的范围。
为了允许HTTP服务器访问缓存目录中的实例镜像,Ironic conductor服务的用户的文件创建掩码应配置为可被HTTP服务的用户访问。大多数系统使用022或002作为默认umask,这应该足够了。如果不是这种情况,则会产生安全影响。
其他最终用户影响¶
无
可扩展性影响¶
一旦将 [agent]image_download_source 设置为 http,实例镜像将缓存到Ironic conductor节点上,如果conductor节点之前使用 direct 直接部署接口,则会占用更多的磁盘空间。预期的空间使用量基本上不应超过 iscsi 部署接口。
IPA直接从conductor节点下载实例镜像,这将减少控制平面网络上的流量,但代价是增加每个conductor节点上的流量。消耗量不应超过 iscsi 部署接口。
性能影响¶
根据硬件和镜像类型,重新计算raw镜像的MD5校验和可能会消耗大量的CPU/IO资源。如果担心Ironic conductor节点的性能,请将 [DEFAULT]force_raw_images 设置为 False(该选项默认值为 True)。
其他部署者影响¶
在使用此功能时,应在每个Ironic conductor节点上设置并配置HTTP服务器。
每个HTTP服务器应配置为遵循实例镜像的符号链接,以便从外部请求访问。如果使用Apache HTTP服务器,请参考 FollowSymLinks,如果使用Nginx HTTP服务器,请参考 disable_symlinks。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
kaifeng
- 其他贡献者
sambetts
工作项¶
将实例缓存提升为全局缓存,可供其他接口使用。
实现
direct直接部署接口的提议工作,包括镜像缓存、校验和重新计算、符号链接管理等。更新文档。
依赖项¶
无
测试¶
此功能将通过单元测试覆盖。
升级和向后兼容性¶
本功能引入了两个新选项 [agent]image_download_source 和 [deploy]http_image_subdir。
[agent]image_download_source 默认值为 swift,不应影响升级。
缓存文件名称的更改可能会在升级后使一些缓存的实例镜像失效,它们将在使用时重新缓存,未引用的镜像最终将被清理。如果升级前禁用了缓存,则不会产生影响。
文档影响¶
更新admin/interfaces/deploy.rst以描述此功能的使用。
参考资料¶
无