支持 OVF 单磁盘镜像上传

https://blueprints.launchpad.net/glance/+spec/ovf-lite

开放虚拟化格式 (OVF) 是一种开放标准,用于打包和分发虚拟设备,它与虚拟机监控程序和处理器架构无关。企业和电信网络功能虚拟化 (NVF) 提供商都希望 OpenStack 支持 OVF,以便以标准格式分发设备镜像和部署需求,以确保最佳性能。OVF 包,也称为 OVA(文件扩展名为 ova),本质上是一个 tar 包,其中包含磁盘镜像、清单和 ovf xml 文件。一个常见用例是包含部署元数据的 ovf 文件的单个磁盘镜像包。特别是 NFV 工作负载往往需要增强的平台功能和细粒度的资源配置,以满足其性能标准。例如,特殊指令、硬件加速器、高速 IO、NUMA 感知等。我们建议提取单个根磁盘镜像及其元数据,并以相同的方式保存到 Glance 中,目的是简化配置,特别是消除手动编辑镜像元数据的容易出错的需求。Glance 镜像元数据可用于自定义过滤器(在 Mitaka 版本中无法上游 nova 镜像属性过滤器更改),或通过使用 CIM 命名空间[H] 中的标签定义主机聚合,该命名空间用于在 OVF 中标识合适的计算主机。

问题描述

OVF 镜像格式是一种受行业支持的格式(VMware、Ericsson、IBM 和 Red Hat 等),也是欧洲电信标准化研究所支持的格式。一个常见用例是单个磁盘镜像 OVF 包。为了处理相同的问题,VMware 甚至开发了一种专门的 Nova 驱动程序,该驱动程序使用上传的 OVF 包和单个镜像启动虚拟机。但是,每次使用 OVF 镜像时,都需要对其进行解析并提取镜像及其元数据,因为它不是 Glance 的一类镜像,从而产生性能开销。

提议的变更

我们建议通过添加一个能够提取包数据和元数据的任务来支持 OVF 包。支持将限制为提取根磁盘镜像并将其保存到 Glance 镜像存储中,然后解析 .ovf 文件以提取通过配置文件指定所需的元数据。请注意,OVF 文件(XML 格式)可能很复杂,并且 XML 允许用户自由地将特别的叶值表示为元素或属性,这使得解析变得不简单。在本版本中,我们将仅限于 CIM_ProcessorAllocationSettingData 中的项目,因为它们对我们而言在 VM 编排目的方面至关重要。提取的元数据将记录为 Glance 镜像记录上的镜像属性。通常,镜像提供程序将指定与硬件要求和部署参数相关的元数据,以确保最佳性能。目前,此导入功能将限制为管理员用户,并且可以使用 [L] 中建议的功能通过配置启用或禁用该功能。这些元数据可以帮助 Nova 进行最佳的放置/编排,以确保满足供应商的性能、合规性和其他要求。

备选方案

另一种方法是手动输入镜像元数据,就像今天所做的那样,这既繁琐又容易出错,即使我们试图在云中自动化服务交付。

一个完整的解决方案,其中 OVF 包包含多个磁盘镜像,超出了本次工作的范围,但它是该功能的逻辑演进。我们预计未来将创建 OVF 工件并将它们的内容转换为 Heat 工件。OVF 的丰富性需要在 Heat 中捕获,包括其网络方面。

数据模型影响

REST API 影响

安全影响

解包未知的 OVA tar 文件可能存在安全风险,即 gzip 扩展和 tar 权限提升攻击[J]。在初始实现中,我们将限制 OVA 导入对管理员用户的访问。在未来的扩展中,我们可以解决其中一些漏洞,例如,首先检查 tar 清单 (tar tvf foo.ova) 以确认没有提及系统路径或高价值文件,如 /etc/passwd。为了防止 gzip 炸弹式攻击,防病毒程序会派上用场,并且应该将其编入流程中。签名验证功能将能够向非管理员用户开放导入功能,特别是对于受信任的镜像供应商。

通知影响

虽然 OVA 处理开始和完成的通知可能很有帮助,但目前不会提供这些通知。

其他最终用户影响

易于使用。

性能影响

在镜像上传时,会进行额外的处理以提取和解析镜像数据和元数据,但这仅影响 OVA 文件。其他格式不受影响。

关于 Nova,由于在导入时(一次)处理 OVF 包,而不是每次使用时,因此启动 OVF 包的速度会更快。

其他部署者影响

Glance 中现有的 OVF 包可以使用 VMware 驱动程序像以前一样部署。在交付此功能后,磁盘镜像可以直接部署,例如 qcow 和其他镜像。在所有 OVF 包都使用这种新策略处理之前,无法弃用 Nova OVF 驱动程序。请注意,此功能需要磁盘空间来支持解压缩存档,并且由于磁盘资源不足,操作可能会失败。此外,部署者应检查 glance-api.conf 中的 image_property_quota 的值,以确保该配额设置足够高,以便将所有所需的 OVF 元数据存储为镜像属性。

开发人员影响

实现

  1. 一个全局配置参数,用于指定要提取的感兴趣的元数据。根据反馈,这将在单独的文件 ovf-metadata.conf 中维护,并提供一个示例文件。例如

    {
      ovf_metadata_properties:
          ProcessorArchitecture,
          InstructionSet,
          InstructionSetExtensionName,
          ..
    }
    

    可能的值

    ProcessorArchitecture: x86, x86-64, ARM, MIPS
    InstructionSet: ARM A32, ARM A64, MIPS32 (32-bit), MIPS64 (64-bit), POWER
    InstructionSetExtensionName:
        Advanced Vector Extensions (AVX),
        RDRAND (aka SecureKey),
        Advanced Encryption Standard New Instruction (Intel® AES-NI).
    

    有关详尽列表,请参阅 [H]。

  2. 下载 OVA

  3. 处理嵌入的 .ovf 描述符文件以提取元数据和根磁盘。解析将使用 [G] 中的模式

  4. 将根磁盘镜像保存到 Glance

  5. 将提取的元数据作为已保存磁盘镜像的镜像属性附加

在初始实现中,我们不会处理加密密钥或 OVF 证书。但是,这样做会增加该功能的安全性,并可能减少 [J] 中提到的威胁。Liberty 中经过重构的镜像 TaskFlow 也通过限制导入大小和所花费的时间来提高安全性。

使用 Liberty 中的 TaskFlow 任务执行器进行初始实现已经准备就绪。当重构的镜像导入 API 可用时,通过仅将 OVF lite 导入功能限制为管理员,迁移到相同的 API 应该会很顺利。需要进行测试以确定相同的结果。因此,可以在并行进行这两项工作。

如果我们放弃支持上传压缩的 ova 的愿望,就可以消除压缩攻击的威胁。结合首先检查嵌入的 ovf 文件,可以确定磁盘镜像的预期大小,并在继续上传之前确保其在配额范围内。感谢 Mike Gerdt 提出的压缩约束放松建议,使该功能更通用,而不受管理员用户限制。但是,对于 Mitaka,我们将仅将此功能限制为管理员用户,从而允许压缩文件,并从而更好地利用网络带宽,更重要的是符合正在进行中的镜像上传重构工作 [M]。

负责人

主要负责人:* Deepti Ramakrishna (dramakri) * Lin Yang (ling-a-yang)

其他贡献者:* Jakub Jasek * Kent Wang

评审人员

核心评审员:* nikhil-komawar * Erno Kuvaja * Ian Cordasco * Flavio Percoco * Sabari Murugesan

其他评审员:* Brian Rosmaita

工作项

  • 创建任务的工作流程,以解析 .ovf 文件,以使用元数据创建 Glance 镜像。我们的 Liberty 解决方案错过了截止日期。

  • 更新配置文件以指示感兴趣的元数据。

  • 更新配置和使用文档

依赖项

  • 镜像保存任务,应确认或增强其检查用户配额。

测试

  1. 上传测试,涵盖有效和无效输入,例如无效的 tar 包、没有 .ovf 文件的目录、零大小和过大的输入文件大小。

  2. 使用 OVF Lite,我们将同时上传 OVF 文件和 Glance 中的常规镜像。我们可以配置 OpenStack 以跳过保存 OVF 文件。

  3. 集成测试将涉及能够使用 Nova boot 命令启动已加载的镜像,而无需使用 VMware OVF 驱动程序。

文档影响

需要记录 OVF API 以进行 CRUD 操作,以指示额外的镜像创建。删除和更新操作需要删除和更新 Glance 中的额外镜像。将帮助记录。

升级系统中的向后兼容性通过维护 Nova OVF 驱动程序来保留。

将来,最好引入一个脚本/任务,在升级的环境中调用该脚本/任务,为 Glance 中现有的 OVF 文件提供 OVF Lite 支持。此外,如果我们想启用/禁用此功能,最好致力于 [L],目前该功能已被放弃。

参考资料

  1. https://en.wikipedia.org/wiki/Open_Virtualization_Format

  2. https://en.wikipedia.org/?title=ETSI

  3. https://specs.openstack.org/openstack/nova-specs/specs/juno/approved/vmware-driver-ova-support.html

  4. https://docs.openstack.org/developer/glance/formats.html

  5. 原始蓝图:https://wiki.openstack.org/wiki/Enhanced-Platform-Awareness-OVF-Meta-Data-Import

  6. https://blueprints.launchpad.net/glance/+spec/introspection-of-images

  7. OVF 信封 XML 模式文档 (XSD)。 http://schemas.dmtf.org/ovf/envelope/2/dsp8023_2.0.1.xsd

  8. http://schemas.dmtf.org/wbem/cim-html/2/CIM_ProcessorAllocationSettingData.html

  9. CIM V2.38.0 模式。 http://dmtf.org/standards/cim/cim_schema_v2380

  10. https://bugs.python.org/issue21109#msg215656

  11. https://en.wikipedia.org/wiki/Zip_bomb

  12. 配置导入子流程的选项:https://review.openstack.org/#/c/194898/

  13. 镜像导入重构:https://review.openstack.org/#/c/232371

  14. https://blueprints.launchpad.net/glance/+spec/image-signing-and-verification-support

  15. https://review.openstack.org/#/c/214810/

  16. DMTF 共同信息模型 (CIM)。 http://dmtf.org/standards/cim