场景 - 使用带有 ASAP 2(直连模式)的 Open vSwitch¶
概述¶
在拥有适当硬件的情况下,运营商可以选择使用 ASAP 2 加速的 Open vSwitch,而不是未加速的 Open vSwitch,用于 Neutron 虚拟网络基础设施。ASAP 2 技术将数据包处理卸载到内置在网卡中的硬件上,而不是使用主机的 CPU。在实施之前需要仔细考虑和规划。本文档概述了如何在您的环境中进行设置。
注意
ASAP 2 是某些 Mellanox 网卡提供的专有功能,包括 ConnectX-5 和 ConnectX-6。未来支持不作保证。此功能被认为是实验性的,不应用于生产工作负载。无法保证可升级性或向后兼容性。
注意
硬件卸载目前与 openvswitch 防火墙驱动程序不兼容。为了确保流量被卸载,必须禁用端口安全。本文档稍后将讨论如何禁用端口安全。
推荐阅读¶
本指南是标准 Open vSwitch 和 SR-IOV 部署指南的变体,可在以下网址找到:
以下资源也可能有所帮助:
先决条件¶
要在 Linux 平台上启用 SR-IOV 和 PCI 直通功能,请确保为 Intel 处理器启用 VT-d/VT-x,为 AMD 处理器启用 AMD-V/AMD-Vi。这些功能通常在 BIOS 中启用。
在 Intel 平台上,需要以下内核参数,可以将其添加到 GRUB 配置中:
GRUB_CMDLINE_LINUX="... iommu=pt intel_iommu=on"
在 AMD 平台上,请使用以下参数:
GRUB_CMDLINE_LINUX="... iommu=pt amd_iommu=on"
更新 GRUB 并重新启动主机。
SR-IOV 提供虚拟功能 (VFs),可以作为网络接口呈现给实例,并取代 tuntap 接口。VF 的配置不在本指南的范围内。以下链接可能有所帮助:
部署¶
根据 Open vSwitch 实现文档配置您的网络:
注意
目前仅支持单个(非绑定)接口。
下面提供了一个示例提供商网络配置:
- network:
container_bridge: "br-provider"
container_type: "veth"
type: "vlan"
range: "700:709"
net_name: "physnet1"
network_interface: "ens4f0"
group_binds:
- neutron_openvswitch_agent
将 nova_pci_passthrough_whitelist 条目添加到 user_variables.yml,其中 devname 是连接到提供商桥接的接口的名称,physical_network 是提供商网络的名称。
nova_pci_passthrough_whitelist: '{"devname":"ens4f0","physical_network":"physnet1"}'
注意
在 openstack_user_config.yml 中配置的相应网络块中,devname 对应于 network_interface,physical_network 对应于 net_name。
要启用 openvswitch 防火墙驱动程序,而不是默认的 iptables_hybrid 防火墙驱动程序,请将以下覆盖添加到 user_variables.yml:
neutron_ml2_conf_ini_overrides:
securitygroup:
firewall_driver: openvswitch
neutron_openvswitch_agent_ini_overrides:
securitygroup:
firewall_driver: openvswitch
注意
使用安全组或端口安全性的端口不会激活硬件卸载的流量。确保在需要硬件卸载时禁用单个端口或网络上的端口安全和安全组。
配置 OpenStack 集群后,按照 OpenStack-Ansible 安装指南中列出的步骤,在部署主机上按顺序运行所有 playbook,启动 OpenStack 部署。
部署后¶
部署完成后,创建将用于 SR-IOV 的 VF。在本例中,物理功能 (PF) 是 ens4f0。它将同时连接到 Neutron 提供商桥接 br-provider。
在每个计算节点上,确定 PF 可以支持的最大 VF 数量:
# cat /sys/class/net/ens4f0/device/sriov_totalvfs
注意
要调整 sriov_totalvfs,请参阅 Mellanox 文档。
在每个计算节点上,创建 VF:
# echo '8' > /sys/class/net/ens4f0/device/sriov_numvfs
配置 Open vSwitch 硬件卸载¶
从 Mellanox 驱动程序中取消绑定 VF:
# for vf in `grep PCI_SLOT_NAME /sys/class/net/ens4f0/device/virtfn*/uevent | cut -d'=' -f2`
do
echo $vf > /sys/bus/pci/drivers/mlx5_core/unbind
done
启用网卡中的交换机:
# PCI_ADDR=`grep PCI_SLOT_NAME /sys/class/net/ens4f0/device/uevent | sed 's:.*PCI_SLOT_NAME=::'`
# devlink dev eswitch set pci/$PCI_ADDR mode switchdev
使用 TC 启用硬件卸载过滤器:
# ethtool -K ens4f0 hw-tc-offload on
将 VF 重新绑定到 Mellanox 驱动程序:
# for vf in `grep PCI_SLOT_NAME /sys/class/net/ens4f0/device/virtfn*/uevent | cut -d'=' -f2`
do
echo $vf > /sys/bus/pci/drivers/mlx5_core/bind
done
在 OVS 中启用硬件卸载:
# ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
# ovs-vsctl set Open_vSwitch . other_config:max-idle=30000
重新启动 Open vSwitch:
# systemctl restart openvswitch-switch
重新启动 Open vSwitch 代理:
# systemctl restart neutron-openvswitch-agent
重新启动 Nova 计算服务:
# systemctl restart nova-compute
警告
对 sriov_numvfs 以及内置网卡交换机的更改不会在重新启动后保留,并且每次启动服务器时都必须执行。
验证操作¶
要验证硬件卸载的 Open vSwitch 的操作,您必须使用具有适当网络驱动程序的镜像创建虚拟机实例。
已知以下镜像包含有效的驱动程序:
在创建实例之前,必须创建一个具有以下特征的 Neutron 端口:
--vnic-type direct --binding-profile '{"capabilities": ["switchdev"]}'
为了确保流量被卸载,使用 --disable-port-security 参数禁用端口安全。
以下是一个完整的命令示例:
# openstack port create \
--network <network> \
--vnic-type direct --binding-profile '{"capabilities": ["switchdev"]}' \
--disable-port-security \
<name>
然后可以将端口在启动时附加到实例。启动后,端口将更新以反映相应虚拟功能的 PCI 地址。
root@aio1-utility-container-8c0b0916:~# openstack port show -c binding_profile testport2
+-----------------+------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-----------------+------------------------------------------------------------------------------------------------------------------+
| binding_profile | capabilities='[u'switchdev']', pci_slot='0000:21:00.6', pci_vendor_info='15b3:1016', physical_network='physnet1' |
+-----------------+------------------------------------------------------------------------------------------------------------------+
观察流量¶
从计算节点,对与连接到实例的虚拟功能的代表端口执行数据包捕获。在本例中,接口是 eth1。
root@compute1:~# tcpdump -nnn -i eth1 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
从另一个主机执行 ping,并观察代表端口上的流量:
root@infra2:~# ping 192.168.88.151 -c5
PING 192.168.88.151 (192.168.88.151) 56(84) bytes of data.
64 bytes from 192.168.88.151: icmp_seq=1 ttl=64 time=48.3 ms
64 bytes from 192.168.88.151: icmp_seq=2 ttl=64 time=1.52 ms
64 bytes from 192.168.88.151: icmp_seq=3 ttl=64 time=0.586 ms
64 bytes from 192.168.88.151: icmp_seq=4 ttl=64 time=0.688 ms
64 bytes from 192.168.88.151: icmp_seq=5 ttl=64 time=0.775 ms
--- 192.168.88.151 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4045ms
rtt min/avg/max/mdev = 0.586/10.381/48.335/18.979 ms
root@compute1:~# tcpdump -nnn -i eth1 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
19:51:09.684957 IP 192.168.88.254 > 192.168.88.151: ICMP echo request, id 11168, seq 1, length 64
19:51:09.685448 IP 192.168.88.151 > 192.168.88.254: ICMP echo reply, id 11168, seq 1, length 64
当卸载在网卡中处理时,数据包捕获中仅可见流的第一个数据包。
可以使用以下命令转储内核数据路径中的流:
# ovs-appctl dpctl/dump-flows type=ovs
可以使用以下命令转储已卸载的流:
# ovs-appctl dpctl/dump-flows type=offloaded