镜像元数据预过滤

https://blueprints.launchpad.net/nova/+spec/image-metadata-prefiltering

Nova 支持通过镜像属性指定特定于超visor的设备模型。目前,当在镜像上设置这些属性时,除非操作员手动配置 ImagePropertiesFilter,否则在调度时不会考虑它们。如果操作员没有配置 ImagePropertiesFilter,并且实例被调度到无法支持请求的设备模型的宿主机,virt驱动程序中的后期检查将导致启动失败并触发重新调度。如果只有一部分宿主机可以支持请求的设备模型,这通常会导致 NoValidHost 错误。

本提案建议使用标准化特性和放置来解决设备模型兼容性问题,方法是扩展现有的virt驱动程序,以声明它们支持的设备模型作为特性。

问题描述

用例

作为操作员,我希望能够部署具有不同设备模型功能的异构云,无论是在升级期间暂时还是在多架构多超visor云中永久存在,而无需显式调度器配置。

作为操作员,我希望能够以不透明的方式通过标准特性向我的客户传达我的云提供的功能,而不是透露已部署软件的具体版本,以便他们可以提供依赖于这些功能的自己的镜像。

作为最终用户,我希望能够简洁地指定实例的设备模型或其他超visor依赖的功能需求,而无需过于冗长。

提议的变更

步骤 1:标准特性

定义良好的 镜像元数据属性,这些属性具有有限的数值集合,代表虚拟化能力,将被转换为标准特性。

当前建议的集合是

{
    "hw_vif_model": {
         "title": "Virtual Network Interface",
         "description": "Specifies the model of virtual network interface
         device to use. The valid options depend on the hypervisor
         configuration. libvirt driver options: KVM and QEMU:
         e1000, ne2k_pci, pcnet, rtl8139, spapr-vlan, and virtio.
         Xen: e1000, netfront, ne2k_pci, pcnet, and rtl8139.",
         "type": "string",
         "enum": [
             "e1000",
             "e1000e",
             "ne2k_pci",
             "netfront",
             "pcnet",
             "rtl8139",
             "spapr-vlan",
             "virtio"
         ]
     },

     "hw_video_model": {
         "title": "Video Model",
         "description": "The video image driver used.",
         "type": "string",
         "enum": [
             "vga",
             "cirrus",
             "vmvga",
             "xen",
             "qxl"
         ]
      },

     "hw_disk_bus": {
         "title": "Disk Bus",
         "description": "Specifies the type of disk controller to
         attach disk devices to.",
         "type": "string",
         "enum": [
             "scsi",
             "virtio",
             "uml",
             "xen",
             "ide",
             "usb",
             "fdc",
             "sata"
         ]
      },
}

请注意 hw_cdrom_bus 支持与 hw_disk_bus 相同的值,但未记录。 hw_cdrom_bus 也将由本规范支持。其他可能值得考虑的镜像属性是

{
     "hypervisor_type": {
         "title": "Hypervisor Type",
         "description": "Hypervisor type required by the image."
         "type": "string",
         "enum": [
             "baremetal",
             "hyperv",
             "kvm",
             "lxc",
             "qemu",
             "uml",
             "vmware",
             "vz",
             "xen"
         ]
     },
     "vm_mode": {
         "title": "VM Mode",
         "description": "The virtual machine mode.
         This represents the host/guest ABI (application binary interface)
         used for the virtual machine."
         "type": "string",
         "enum": [
             "hvm",
             "xen",
             "uml",
             "exe"
         ]
     }
}

虽然本规范主要针对设备模型特定的镜像元数据属性,但相同的模式可以应用于 hypervisor_typevm_mode

标准特性的创建将在 placement/os-traits StoryBoard 故事中跟踪。关于这些特性将如何命名/命名空间化的讨论将发生在那里,而不是在本规范中。

步骤 2:Virt 驱动程序报告功能

本规范主要针对扩展 libvirt 驱动程序;但是,由于这些属性也由 vmware 和 fake 驱动程序使用,它们也将被扩展。

为了启用此功能,virt 驱动程序将被扩展,以报告计算节点资源提供程序上它们能够模拟的每个设备模型的功能。这将通过内省 libvirt 版本、qemu 版本和 Nova 配置(例如 CONF.virt_type)来完成。

为了支持升级而无需修改现有的镜像或风味,virt 驱动程序中的设备模型支持后期检查将不会被删除。

步骤 3:请求设备模型和调度

将添加一个新的调度器预过滤器,以自动将新的特性添加到请求中。由于添加设备模型的新选项需要对 Nova 进行更改,并且这些选项更新不频繁,因此我们可以只在预过滤器中有一个映射表,通过查找适当的镜像元数据键并将特性附加到未编号的请求组来添加额外的特性。这不需要更改镜像即可使用此功能。

备选方案

操作员可以继续使用镜像属性过滤器。

如果 virt 驱动程序被修改为报告特性,但未添加预过滤器,则现有指定镜像中所需特性的能力将足以消耗新的特性。但是,这将需要创建的镜像首先指定设备模型请求,然后也指定所需的特性。例如,hw_vif_model=e1000, traits:COMPUTE_NET_MODEL_E1000=required。这可行,但过于冗长。

与最近的其他功能一样,我们可以使用特性请求来代替镜像元数据属性。如果我们选择此选项,我们可以在 train 中弃用镜像元数据数据值(例如,hw_vif_model),并在后续版本中删除它们。要使用该功能并请求设备模型,将使用一个特性,例如 traits:COMPUTE_NET_MODEL_E1000=required。虽然这在某些方面可能更好,但比选择的选项更繁琐,并且具有需要更新所有镜像以包含特性请求的缺点。因此,由于升级影响,这被放弃了。

操作员还可以通过手动创建 nova 主机聚合或放置聚合来达到本规范的目标,然后使用 IsolatedHostsFilter 或聚合 member_of 放置请求将镜像映射到聚合。

数据模型影响

一组新的标准特性添加到 os-traits。不应需要其他数据模型更改。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

预计这将通过减少重新调度来提高异构云中的启动性能。通过将更受约束的请求传递给放置,此功能还应减少返回的 allocation_candidates 集合。

其他部署者影响

将添加一个新的配置选项以启用镜像元数据预过滤器。最初这将默认禁用,但可以根据对性能影响的反馈在未来的版本中更改。

开发人员影响

升级影响

升级不需要任何操作。但是,就像新部署一样,如果操作员希望启用此功能,他们需要在升级后更新 nova 配置以启用它。

实现

负责人

sean-k-mooney

功能联络人

功能联络人

sean-k-mooney

工作项

  • 添加新的 traits

  • 修改 libvirt virt 驱动程序以报告特性

  • 编写预过滤器

  • 添加配置选项

  • 测试

依赖项

os-traits 中的添加

测试

这可以在 gate 中完全进行测试。将添加功能和单元测试。

虽然可以添加 tempest 测试,但由于我们没有具有不同超visor的多节点 gate 作业,因此不会扩展 tempest。

文档影响

将添加一个发布说明,并提供预过滤器的新的配置选项的文档。由于没有最终用户影响,因此不需要面向用户的文档。

参考资料

历史

修订版

发布名称

描述

Train

引入

Ussuri

重新提出