image metadata prefiltering¶
https://blueprints.launchpad.net/nova/+spec/image-metadata-prefiltering
Nova 支持通过镜像属性指定特定于超visor的设备模型。目前,当在镜像上设置这些属性时,除非操作员手动配置 ImagePropertiesFilter,否则在调度时不会考虑它们。如果操作员没有配置 ImagePropertiesFilter,并且实例被调度到不支持请求设备模型的宿主机,virt 驱动程序中的后期检查将导致启动失败并触发重新调度。如果只有一部分宿主机支持请求的设备模型,这通常会导致 NoValidHost 错误。
本提案建议使用标准化 traits 和 placement 来解决设备模型兼容性问题,方法是扩展现有的 virt 驱动程序,以声明它们支持的设备模型作为 traits。
问题描述¶
用例¶
作为操作员,我希望能够部署具有不同设备模型功能的异构云,无论是在升级期间还是在多架构多 hypervisor 云中,而无需显式配置调度器。
作为操作员,我希望能够以不透明的方式通过标准 traits 向我的客户传达我的云提供的功能,而不是透露已部署软件的具体版本,以便他们可以提供依赖于这些功能的自己的镜像。
作为最终用户,我希望能够简洁地指定实例的设备模型或其他依赖于 hypervisor 的功能需求,而无需过于冗长。
提议的变更¶
Step 1: Standard Traits¶
定义良好的 镜像元数据属性,这些属性具有有限的数值集合,代表虚拟化能力,将被转换为标准 traits。
当前建议的集合是
{
"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_type 和 vm_mode。
标准 traits 的创建将在 placement/os-traits StoryBoard story 中跟踪。关于如何命名/命名空间这些 traits 的讨论将发生在那里,而不是在本规范中。
Step 2: Reporting Of Capabilities By Virt Drivers¶
本规范主要针对扩展 libvirt 驱动程序;但是,由于 vmware 和 fake 驱动程序也使用这些属性,它们也将被扩展。
为了启用此功能,virt 驱动程序将被扩展,以报告计算节点资源提供程序上它们能够模拟的每个设备模型的 traits。这将通过内省 libvirt 版本、qemu 版本和 Nova 配置(例如 CONF.virt_type)来完成。
为了支持升级而无需修改现有的镜像或 flavor,virt 驱动程序中的设备模型支持后期检查将不会被删除。
Step 3: Requesting A Device Model And Scheduling¶
将添加一个新的调度器预过滤器,以自动将新的 traits 添加到请求中。由于添加设备模型的新选项需要更改 Nova,并且这些选项更新不频繁,因此我们可以只在预过滤器中有一个映射表,通过查找适当的镜像元数据键并将 traits 附加到未编号的请求组来添加额外的 traits 到请求规范中。这将不需要更改镜像即可使用此功能。
备选方案¶
操作员可以继续使用镜像属性过滤器。
如果 virt 驱动程序被修改为报告 traits,但未添加预过滤器,则现有指定镜像中所需 traits 的能力将足以消耗新的 traits。但是,这将需要创建的镜像首先指定设备模型请求,然后也指定所需的 traits。例如,hw_vif_model=e1000, traits:COMPUTE_NET_MODEL_E1000=required。这可行,但过于冗长。
与最近的其他功能一样,我们可以使用 traits 请求来替代镜像元数据属性。如果我们选择此选项,我们可以在 train 中弃用镜像元数据数据值(例如 hw_vif_model),并在后续版本中删除它们。要使用该功能并请求设备模型,将使用一个 trait,例如 traits:COMPUTE_NET_MODEL_E1000=required。虽然这在某些方面可能更好,但比选择的选项更繁琐,并且具有需要更新所有镜像以包含 traits 请求的缺点。因此,由于升级影响,这被放弃了。
操作员还可以通过手动创建 nova 主机聚合或 placement 聚合来实现本规范的目标,然后使用 IsolatedHostsFilter 或聚合 member_of placement 请求将镜像映射到聚合。
数据模型影响¶
将 一组新的标准 traits 添加到 os-traits。不需要其他数据模型更改。
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
预计这将通过减少重新调度来提高异构云中的启动性能。通过将更受约束的请求传递给 placement,此功能还应减少返回的 allocation_candidates 集合。
其他部署者影响¶
将添加一个新的配置选项以启用镜像元数据预过滤器。最初这将默认禁用,但可以根据对性能影响的反馈在未来的版本中更改。
开发人员影响¶
无
升级影响¶
升级不需要任何操作。但是,就像新部署一样,如果操作员希望启用此功能,他们需要在升级后更新 nova 配置以启用它。
实现¶
负责人¶
sean-k-mooney
工作项¶
添加新的 traits
修改 libvirt virt 驱动程序以报告 traits
编写预过滤器
添加配置选项
测试
依赖项¶
测试¶
这可以在 gate 中完全进行测试。将添加功能和单元测试。
虽然可以添加 tempest 测试,但由于我们没有具有不同 hypervisor 的多节点 gate 作业,因此不会扩展 tempest。
文档影响¶
将添加一个发布说明,并提供预过滤器的新的配置选项的文档。由于没有最终用户影响,因此不需要面向用户的文档。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Train |
引入 |