SRIOV

Neutron SRIOV

准备和部署

SRIOV 需要特定的网卡和 BIOS 配置,并非所有平台都支持。请参阅网卡和平台特定的文档以获取启用说明。

修改 /etc/kolla/globals.yml 文件,如以下示例所示,该示例会将 sriovnicswitch 自动附加到 ml2_conf.ini 中的 mechanism_drivers 内部。

enable_neutron_sriov: "yes"

此外,还需要为所有 SRIOV 设备定义 physnet:interface 映射,如以下示例所示,其中 sriovtenant1 是映射到 ens785f0 接口的 physnet

neutron_sriov_physnet_mappings:
  sriovtenant1: ens785f0

但是,使用 SRIOV 的提供商网络应该被配置。在这个例子中,flat 和 VLAN 都配置了相同的物理网络名称

[ml2_type_vlan]
network_vlan_ranges = sriovtenant1:1000:1009

[ml2_type_flat]
flat_networks = sriovtenant1

修改 nova.conf 文件,并将 PciPassthroughFilter 添加到 enabled_filters。此过滤器是控制器节点上的 Nova Scheduler 服务所必需的。

[filter_scheduler]
enabled_filters = <existing filters>, PciPassthroughFilter
available_filters = nova.scheduler.filters.all_filters

nova.conf 内部,列在 neutron_sriov_physnet_mappings 下的 PCI 设备将在 Compute 主机上被列入白名单。

neutron_sriov_physnet_mappings 中的物理网络到接口映射将自动添加到 sriov_agent.ini。可以通过 excluded_devices 排除特定的 VF。但是,将其留空(默认)会使所有 VF 都启用

[sriov_nic]
exclude_devices =

要使用 OpenvSwitch 硬件卸载,请修改 /etc/kolla/globals.yml`

openvswitch_hw_offload: "yes"

运行部署。

验证

检查计算节点上是否创建了 VF。VF 将出现在 lspciip link show 的输出中。例如

# lspci | grep net
05:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)


# ip -d link show ens785f0
4: ens785f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP mode DEFAULT qlen 1000
link/ether 90:e2:ba:ba:fb:20 brd ff:ff:ff:ff:ff:ff promiscuity 1
openvswitch_slave addrgenmode eui64
vf 0 MAC 52:54:00:36:57:e0, spoof checking on, link-state auto, trust off
vf 1 MAC 52:54:00:00:62:db, spoof checking on, link-state auto, trust off
vf 2 MAC fa:16:3e:92:cf:12, spoof checking on, link-state auto, trust off
vf 3 MAC fa:16:3e:00:a3:01, vlan 1000, spoof checking on, link-state auto, trust off

验证 SRIOV Agent 容器是否正在计算节点上运行

# docker ps --filter name=neutron_sriov_agent
CONTAINER ID   IMAGE                                                                COMMAND        CREATED         STATUS         PORTS  NAMES
b03a8f4c0b80   10.10.10.10:4000/registry/centos-source-neutron-sriov-agent:17.04.0  "kolla_start"  18 minutes ago  Up 18 minutes         neutron_sriov_agent

验证 SRIOV Agent 服务是否存在且处于 UP 状态

# openstack network agent list

+--------------------------------------+--------------------+-------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host        | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+-------------+-------------------+-------+-------+---------------------------+
| 7c06bda9-7b87-487e-a645-cc6c289d9082 | NIC Switch agent   | av09-18-wcp | None              | :-)   | UP    | neutron-sriov-nic-agent   |
+--------------------------------------+--------------------+-------------+-------------------+-------+-------+---------------------------+

创建一个新的提供商网络。将 provider-physical-network 设置为在 /etc/kolla/config/nova.conf 中配置的物理网络名称。将 provider-network-type 设置为所需的类型。如果使用 VLAN,请确保将 provider-segment 设置为正确的 VLAN ID。此示例使用 VLAN 网络类型

# openstack network create --project=admin \
  --provider-network-type=vlan \
  --provider-physical-network=sriovtenant1 \
  --provider-segment=1000 \
  sriovnet1

为提供商网络创建一个具有 DHCP 范围的子网

# openstack subnet create --network=sriovnet1 \
  --subnet-range=11.0.0.0/24 \
  --allocation-pool start=11.0.0.5,end=11.0.0.100 \
  sriovnet1_sub1

在提供商网络上创建一个端口,并将 vnic_type 设置为 direct

# openstack port create --network sriovnet1 --vnic-type=direct sriovnet1-port1

使用分配的 SRIOV 端口启动新的实例

# openstack server create --flavor flavor1 \
  --image fc-26 \
  --nic port-id=`openstack port list | grep sriovnet1-port1 | awk '{print $2}'` \
  vm1

验证实例是否使用 SRIOV 端口启动。通过在放置实例的计算节点上运行 dmesg 来验证 VF 分配。

# dmesg
[ 2896.849970] ixgbe 0000:05:00.0: setting MAC fa:16:3e:00:a3:01 on VF 3
[ 2896.850028] ixgbe 0000:05:00.0: Setting VLAN 1000, QOS 0x0 on VF 3
[ 2897.403367] vfio-pci 0000:05:10.4: enabling device (0000 -> 0002)

有关更多信息,请参阅 OpenStack SRIOV 文档

Nova SRIOV

准备和部署

Nova 提供了一种独立的机制,用于将 PCI 设备附加到实例,该机制独立于 Neutron。通过在 nova.conf 中使用 PCI 别名配置选项,任何支持直通的 PCI 设备(PF 或 VF)都可以附加到实例。在使用此方法时需要注意的一个主要缺点是,PCI 别名选项仅使用设备的 product id 和 vendor id,因此在具有多个端口配置为 SRIOV 的 NIC 的环境中,无法指定要从中提取 VF 的特定 NIC 端口。

修改文件 /etc/kolla/config/nova.conf。控制器节点上的 Nova Scheduler 服务需要将 PciPassthroughFilter 添加到过滤器列表中,并且计算节点上的 Nova Compute 服务需要 PCI 设备白名单。控制器节点上的 Nova API 服务和计算节点上的 Nova Compute 服务还需要在 [pci] 部分下配置 alias 选项。别名可以配置为 ‘type-VF’ 以传递 VF,或 ‘type-PF’ 以传递 PF。此示例显示了 type-VF

[filter_scheduler]
enabled_filters = <existing filters>, PciPassthroughFilter
available_filters = nova.scheduler.filters.all_filters

[pci]
device_spec = [{"vendor_id": "8086", "product_id": "10fb"}]
alias = {"vendor_id":"8086", "product_id":"10ed", "device_type":"type-VF", "name":"vf1"}

运行部署。

验证

创建(或使用现有)flavor,然后配置它以从 PCI 别名请求一个 PCI 设备

# openstack flavor set sriov-flavor --property "pci_passthrough:alias"="vf1:1"

使用 flavor 启动新的实例

# openstack server create --flavor sriov-flavor --image fc-26 vm2

验证 VF 设备是否创建并且实例是否成功启动,如 Neutron SRIOV 案例所示。

有关更多信息,请参阅 OpenStack PCI 直通文档