SR-IOV-Passthrough-For-Networking
目录
OpenStack 中的 SR-IOV 网络
OpenStack Juno 添加了内置支持,用于请求通过 SR-IOV NIC 访问虚拟网络。 随着基于 SR-IOV 的 NIC 的引入,不再需要传统的虚拟桥接器。 每个 SR-IOV 端口都与一个虚拟功能 (VF) 相关联。 SR-IOV 端口可以由基于硬件的虚拟以太网桥接 (HW VEB) 提供;或者它们可以扩展到上游物理交换机 (IEEE 802.1br)。 SR-IOV 端口可以通过两种方式连接
- 直接连接到其VF
- 通过驻留在主机上的macvtap设备连接,然后连接到相应的VF
Nova
Nova 对 SR-IOV 的支持能够根据其网络连接性调度具有 SR-IOV 端口的实例。 在做出调度决策时,必须考虑 neutron 端口关联的物理网络。 针对具有 PCI 直通设备的每个计算节点指定的 PCI 白名单已被增强,以允许将标签与 PCI 设备关联。 用于 SR-IOV 网络的可用的 PCI 设备应标记为 physical_network 标签。
对于 SR-IOV 网络,使用预定义的标签 "physical_network" 来定义设备连接到的物理网络。 白名单条目定义如下
["vendor_id": "<id>",] ["product_id": "<id>",] ["address": "[[[[<domain>]:]<bus>]:][<slot>][.[<function>]]" | "devname": "Ethernet Interface Name (PF)",] "physical_network":"name string of the physical network"
<id> 可以是星号 (*) 或 Linux 实用程序 lspci 显示的有效 vendor/product ID。 地址使用与 lspci 中相同的语法。 devname 可以是有效的 PCI 设备名称。 支持的唯一设备名称是 Linux 实用程序 ifconfig -a 显示的名称,并且与 PF 对应。
如果由地址或 devname 定义的设备对应于 SR-IOV PF,则 PF 下的所有 VF 都将匹配该条目。
请注意,NIC 的 VF 的 'product_id' 与 NIC 的 PF 的 'product_id' 不同 - 如果您使用这种过滤设备的方法,请确保使用 VF ID。
支持每个主机上的多个白名单条目。
Neutron
Neutron 对 SR-IOV 的支持需要具有 SR-IOV 支持机制驱动程序的 ML2 插件。 当前有 ML2 机制驱动程序用于基于 SR-IOV 的 NIC 的交换 (HW VEB)。 不同供应商的网络适配器在支持各种功能方面有所不同。 如果供应商网络适配器支持 VF 链路状态更新,则应部署 SR-IOV NIC L2 agent 以利用此功能。
请注意,在 nova boot API 中,用户可以指定 port-ID 或 net-ID。 如果指定 net-ID,则假定用户正在请求常规虚拟端口(不是 SR-IOV 端口)。
SR-IOV 配置
控制器节点
Nova Scheduler
启用 PciPassthroughFilter,修改 /etc/nova/nova.conf
scheduler_available_filters = nova.scheduler.filters.all_filters scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, PciPassthroughFilter
Neutron 服务器
使用 ML2 Neutron 插件修改 /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2] tenant_network_types = vlan type_drivers = vlan mechanism_drivers = openvswitch,sriovnicswitch [ml2_type_vlan] network_vlan_ranges = physnet1:2:100
根据 /etc/neutron/plugins/ml2/ml2_conf_sriov.ini 中的 PCI ID 存储库,添加受支持的 PCI vendor VF 设备,由 vendor_id:product_id 定义
[ml2_sriov] supported_pci_vendor_devs = vendor_id:product_id
支持 SR-IOV 的 Intel NIC 的示例
supported_pci_vendor_devs = 8086:10ca
如果 SR-IOV 网络适配器支持 VF 链路状态设置,并且希望管理 admin 状态,请确保在 /etc/neutron/plugins/ml2/ml2_conf_sriov.ini 中添加 [ml2_sriov] 部分的以下设置
agent_required = True
注意:通常 agent_required 应该为 True,除非您使用的是不支持 admin 状态更改的 Intel NIC。
Neutron 服务器应使用两个配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 和 /etc/neutron/plugins/ml2/ml2_conf_sriov.ini 运行
neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
计算节点
启用网络适配器上的 SR-IOV
默认情况下 SRIOV 已禁用,您必须在应支持 SRIOV 功能的每个计算主机上启用 SRIOV 并创建 VF。 当前已知特定的 Intel 和 Mellanox 卡支持 SRIOV。 以下资源包含有关如何启用和创建 VF 的信息
nova-compute
Nova-compute 需要知道允许传递到 VM 的哪些 PCI 设备。 此外,对于 SRIOV PCI 设备,它需要知道 VF 属于哪个物理网络。 这通过 /etc/nova/nova.conf 的默认部分下的 pci_passthrough_whitelist 参数来完成。 例如,如果我们想通过 PCI 地址白名单和标记 VF,我们将使用以下设置
pci_passthrough_whitelist = {"address":"*:0a:00.*","physical_network":"physnet1"}
这将使地址中包含 ':0a:00.' 的任何 VF 与物理网络 physnet1 关联。
或者,我们也可以使用接口名称并说:“从 eth2 创建的所有 VF 都允许传递,并属于物理网络 physnet1”,在这种情况下 eth2 是 PF。 例如
pci_passthrough_whitelist = {"devname": "eth2", "physical_network": "physnet1"}
配置白名单后,您必须重新启动 nova-compute 服务。
在使用 devstack 时,可以在 local.conf 文件中配置 pci_passthrough_whitelist,例如
[[post-config|$NOVA_CONF]]
[DEFAULT]
pci_passthrough_whitelist = {"'"address"'":"'"*:02:00.*"'","'"physical_network"'":"'"physnet1"'"}
SR-IOV neutron agent
仅当硬件支持并且您希望启用更改端口 admin_state 时,才必须运行 Neutron SR-IOV agent。 否则建议使用 agent_required = False。
注意:如果您在 Neutron 服务器上配置了 agent_required=True,则必须在每个计算节点上运行 Agent。
修改 /etc/neutron/plugins/ml2/ml2_conf_sriov.ini 如下
[securitygroup] firewall_driver = neutron.agent.firewall.NoopFirewallDriver [sriov_nic] physical_device_mappings = physnet1:eth1 exclude_devices =
Where
- physnet1 是物理网络
- eth1 是物理功能 (PF)
- exclude_devices 为空,因此与 eth1 关联的所有 VF 都可以由 agent 配置
注意:SR-IOV agent 仅在使用 NoopFirewallDriver 启用安全组时才有效,但您仍然可以通过更新其配置来为其他 Agent 使用其他 firewall_driver。
修改配置文件后,启动 Neutron SR-IOV agent。 运行
neutron-sriov-nic-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf_sriov.ini
排除 VF
如果您想排除某些 VF,以便 agent 不配置它们,则需要在 sriov_nic 部分中列出它们
示例: exclude_devices = eth1:0000:07:00.2; 0000:07:00.3, eth2:0000:05:00.1; 0000:05:00.2
FDB L2 Agent 扩展
FDB 填充是 OVS agent 或 Linux bridge 的 L2 agent 扩展。 其目标是更新使用普通端口的现有实例的 FDB 表,从而实现 SR-IOV 实例和普通实例之间的通信。 FDB 填充扩展的使用场景是
1. 直接端口和普通端口实例位于同一计算节点上。
2. 使用浮动 IP 的直接端口实例和网络节点位于同一主机上。
可以在这里找到描述该问题的更多信息:http://events.linuxfoundation.org/sites/events/files/slides/LinuxConJapan2014_makita_0.pdf
注意:此功能从 newton 版本开始支持。
要启用此扩展,请编辑相关的 l2 agent 配置文件 (ovs_agent.ini/linuxbridge_agent.ini)
• 在 section [agent] 中添加 fdb 到 extensions
[agent] extensions = fdb
• 添加 FDB 部分和 shared_physical_device_mappings 参数。 该参数将每个物理端口映射到其物理网络名称,每个物理网络可以映射到多个端口
[FDB] shared_physical_device_mappings = physnet1:p1p1, physnet1:p1p2
在同一计算节点上配置 SR-IOV 和 PV
如果 SR-IOV 和 PV 在同一主机上创建,则应将 FDB L2 agent 扩展加载到 OVS agent 或 Linux bridge agent,以启用这两个实例之间的通信。
有关加载 FDB 扩展的更多信息,请参阅之前的“FDB L2 Agent 扩展”部分。
使用 SR-IOV vNIC 的 VM 创建流程
- 创建一个或多个 neutron 端口。 运行
neutron port-create <net-id> --binding:vnic-type <direct | macvtap | normal>
- 使用一个或多个 neutron 端口启动 VM。 运行
nova boot --flavor m1.large --image <image>
--nic port-id=<port1> --nic port-id=<port2> <vm name>