为代理镜像下载提供 HTTP(S) 代理支持

https://bugs.launchpad.net/ironic/+bug/1526222

此功能为代理下载镜像增加了代理配置的支持。

问题描述

目前,Ironic Python Agent (IPA) 能够通过直接的 HTTP(S) 链接下载镜像,但不支持代理配置。如果 IPA 支持镜像下载的代理配置,用户可以在与节点位于相同物理网络段的缓存代理中部署,从而减少整体网络流量和部署时间。当 Ironic 使用 IPA 部署时,有两种不同的镜像源:Glance UUID 和 HTTP(S) URL。当使用 HTTP(s) URL 时,我们可以简单地利用 HTTP(S) 代理配置参数,不需要额外的 Ironic 功能。当使用 Glance UUID 时,由于当前时间用于生成临时 URL,因此存在 Swift 临时 URL 的问题。在代理服务器中,带有查询字符串参数的请求会为每个唯一的查询字符串单独缓存,因此,如果使用 Swift 临时 URL,则无法在代理服务器端有效地缓存镜像。

提议的变更

将向代理部署驱动程序添加三个新的可选参数:image_http_proxyimage_https_proxyimage_no_proxy。前两个参数是格式为“PROTOCOL://PROXY_IP:PROXY_PORT”的字符串。image_no_proxy 是一个逗号分隔的 URL 列表,应该排除在代理之外。代理部署驱动程序方法的新的行为

  • get_properties() - 返回新参数的描述。

  • validate() - 验证新的参数(如果存在)。

  • continue_deploy() - 如果存在参数,则在“image_info”字典中添加“proxies”和“no_proxy”键

    proxies = {'http': 'http://192.168.0.2:8080',
               'https': 'https://192.168.0.3:4444'}
    
    no_proxy='192.168.1.5,10.0.0.3'
    

如果存在“proxies”键,IPA 会将参数添加到 requests.get() 方法中。Requests 库 [0] 仅将“no_proxy”作为环境变量支持,而不是作为 get() 参数。如果设置了“no_proxy”参数,则代理应该在调用 get() 之前将其添加到 Python 的“os.environ”中。

Swift 临时 URL 变更

对于缓存代理,不同的 URL 映射到缓存中的不同的文件。因此,应该在 conductor 上实现 Swift 临时 URL 的镜像缓存。当为镜像创建临时 URL 时,代理驱动程序将其存储到缓存中,并将 Glance 镜像的 UUID 作为键。代理驱动程序对相同的 UUID 使用缓存中的 URL,并检查临时 URL 的过期时间。将向 glance 组添加一个新的整数配置参数 swift_temp_url_cachetime。如果它大于零,则代理驱动程序将启用 URL 缓存,并将其值用于新的临时 URL 持续时间。

关于代理服务的说明

  • 代理应支持 HTTP/1.1 分块传输编码。

  • 对于 SSL 镜像 URL,应配置代理以终止客户端在代理侧的 SSL 连接。

  • 应在代理上启用大文件的缓存。

备选方案

数据模型影响

状态机影响

REST API 影响

客户端 (CLI) 影响

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

N/A

安全影响

不建议在代理服务器端解密包含机密信息的 HTTPS 数据。

其他最终用户影响

可扩展性影响

在正确配置的环境中,代理下载镜像可以提高可扩展性(减少网络流量和部署时间)。

性能影响

其他部署者影响

  • 将为节点驱动程序信息添加新的可选参数:image_http_proxyimage_https_proxyimage_no_proxy

  • 将在 glance 组中添加一个新的配置选项 swift_temp_url_cachetime

  • 部署者必须安装和配置代理服务。

开发人员影响

实现

负责人

主要负责人

yuriyz

工作项

  • 实现 IPA 部署驱动程序的代理参数。

  • 实现 Swift 临时 URL 缓存。

  • 添加单元测试。

依赖项

测试

将添加单元测试。

升级和向后兼容性

文档影响

将记录代理配置的使用方法。

参考资料