QSG:使用Mellanox ASAP2增强型SR-IOV(VF-LAG)实现高可用性

创建于2020年4月16日,作者Amir Zeidner。本指南介绍如何利用Mellanox ASAP2技术将链路聚合(LAG)功能卸载到智能网卡硬件,从而为虚拟化工作负载提供高可用性。内容包括解决方案概述、逻辑设计、主机配置与部署步骤。

文档目录

Created on Apr 16, 2020 by Amir Zeidner

引言

目前,使用SR-IOV VF(虚拟功能)端口连接虚拟化工作负载时,缺乏对链路聚合的支持。 Mellanox ASAP2技术通过将LAG(链路聚合组)功能卸载到智能网卡(SmartNIC)硬件,扩展了传统SR-IOV的能力。这意味着虚拟机可以挂载单个VF,并由网卡级别的LAG提供支持。 本指南将重点介绍卸载LAG功能的优势,并引导您在独立Linux服务器上进行配置和评估。

参考资料

ASAP2文档

解决方案概述

在虚拟环境中实现LAG有几种选择,具体取决于系统配置和性能需求:

方案 说明
VM通过虚拟接口(virtio)连接到主机LAG。此方案适用于不需要高性能网络的负载和应用。 图1:图1
SR-IOV是网络密集型应用的默认选择。此时,链路聚合在VM内部执行(VM感知LAG),仅可实现HA模式。 图2:图2
SR-IOV switchdev模式和ASAP²(加速交换与包处理®)是增强型SR-IOV技术,将网络处理从主机和VM卸载到网卡硬件。绑定功能现在卸载到网卡硬件。单个虚拟功能由两个物理绑定端口支持。 图3:图3

解决方案逻辑设计

参考图4,Hypervisor中的两个网卡PF网络接口被绑定。绑定模式会反映到同一网卡的所有VF上。例如:如果BOND配置为LACP(链路聚合控制协议)模式,则所有VF LAG接口将共享相同的配置。

要启用VF-LAG,网卡应处于SR-IOV switchdev模式。与传统SR-IOV模式不同,switchdev模式需要控制平面来配置VF的转发行为。本文档使用OVS实现此目的。更多详情请参阅OVS卸载文档

图4:图4

主机配置与前提条件

  • BIOS:启用VT-D和SR-IOV
  • OpenVswitch >= 2.12
  • 操作系统 >= RHEL 7.7
  • 内核 >= 4.10

主机部署与配置

设置Mellanox固件以支持SR-IOV

首先安装mstflint工具:

yum install mstflint -y

提取PF的PCI总线槽位号:

lspci | grep -i mel | grep -v Virtual
61:00.0 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]
61:00.1 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]

使用上一步获取的PCI槽位号设置固件以启用SR-IOV并指定VF数量:

## 启用SR-IOV并设置所需VF数量(本例启用4个VF)##
mstconfig -d <PF_PCI_BUS_slot_number> set SRIOV_EN=1 NUM_OF_VFS=4

配置Linux绑定

配置BOND接口。 本例演示BOND LACP配置:

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
HOTPLUG=no
NM_CONTROLLED=no
PEERDNS=no
BOOTPROTO=none
BONDING_OPTS="mode=4 miimon=100 lacp_rate=1"
BOOTPROTO=static
EOF

注意: 要了解更多关于绑定模式的信息,请参考: https://www.cloudibee.com/network-bonding-modes/ 支持的模式为1、2、4。

配置从接口

<first_interface_name><second_interface_name> 替换为相应的PF绑定从接口名称。

##配置第一个从接口##
sed -i 's/\(ONBOOT=\)no/\1yes/g' /etc/sysconfig/network-scripts/ifcfg-<First_PF_interface_name>
sed -i 's/\(BOOTPROTO=\)dhcp/\1none/g' /etc/sysconfig/network-scripts/ifcfg-<First_PF_interface_name>

cat << EOF >> /etc/sysconfig/network-scripts/ifcfg-<First_PF_interface_name>
MASTER=bond0
SLAVE=yes
EOF
##配置第二个从接口##
sed -i 's/\(ONBOOT=\)no/\1yes/g' /etc/sysconfig/network-scripts/ifcfg-<Second_PF_interface_name>
sed -i 's/\(BOOTPROTO=\)dhcp/\1none/g' /etc/sysconfig/network-scripts/ifcfg-<Second_PF_interface_name>

cat << EOF >> /etc/sysconfig/network-scripts/ifcfg-<Second_PF_interface_name>
MASTER=bond0
SLAVE=yes
EOF
重启网络服务
systemctl restart network.service

启用ASAP2 VF-LAG功能

本例每个PF使用2个VF(可以配置更多)。 提取PF的PCI总线槽位号:

lspci | grep -i mel | grep -v Virtual

QSG: 使用Mellanox ASAP2增强型SR-IOV (VF-LAG)实现高可用性

启用每个PF绑定从接口的switchdev模式

## 刷新iptables规则并为每个PF启用TC卸载 ##
iptables -F
ethtool -K <First_PF_interface_name> hw-tc-offload on
ethtool -K <Second_PF_interface_name> hw-tc-offload on
## 本例中每个PF定义2个VF ##
echo 0 > /sys/class/net/<First_PF_interface_name>/device/sriov_numvfs
echo 0 > /sys/class/net/<Second_PF_interface_name>/device/sriov_numvfs
echo 2 > /sys/class/net/<Second_PF_interface_name>/device/sriov_numvfs
echo 2 > /sys/class/net/<First_PF_interface_name>/device/sriov_numvfs
### 解绑Mellanox VF的内核驱动 ##
VFS_PCI=($(lspci | grep "Mellanox" | grep "Virtual" | cut -d " " -f 1));
for i in ${VFS_PCI[@]};
do
    echo "unbinding VF $i";
    echo "0000:${i}" >> /sys/bus/pci/drivers/mlx5_core/unbind;
done
### 通过指定PCI插槽地址号将PF接口设置为switchdev模式 ###
devlink dev eswitch set pci/0000:61:00.0 mode switchdev
devlink dev eswitch set pci/0000:61:00.1 mode switchdev

启用switchdev模式后,新的代表端口将出现在Linux网桥中

现在可以发现代表端口映射。

首先从本部分下载附带的map_rep.py脚本,并按如下说明运行:

map_rep.py

pip install tabulate
python map_rep.py --port <First_PF_interface_name>

## 示例输出 ##
  VF NUMBER  REPRESENTOR PORT    VF PORT    VF PCI        PF NAME    MACHINE NAME                  MACHINE UUID
-----------  ------------------  ---------  ------------  ---------  --------------------------  --------------
          0  ens2f0_0                       0000:61:00.2  ens2f0     clx-host-038-01-CentOS-7.7               2
          1  ens2f0_1                       0000:61:00.3  ens2f0     clx-host-038-01-CentOS-7.7               2

Openvswitch设置

将所需的代表端口添加到OpenVswitch网桥,这些端口代表指定的VF:

## 启动代表端口 ##
ifconfig <representor_port1_name> up
## 创建包含BOND和代表端口的OVS网桥 ##
systemctl start openvswitch
ovs-vsctl add-br ovs-sriov
ovs-vsctl add-port ovs-sriov <representor_port1_name>
ovs-vsctl add-port ovs-sriov bond0
## 启用OVS硬件卸载并重启 ##
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
systemctl restart openvswitch

部署验证

测试部署(图5)概述:

图5

图5

  1. 首先,使用基于VF PCI插槽号的SRIOV附加方式,启动一个带有VF接口的客户虚拟机。 以下是VF PCI插槽号为0000:61:01.2的SRIOV接口附加的Virsh XML部分:

    <interface type='hostdev' managed='yes'>
      <mac address='6a:66:2d:48:92:c3'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x61' slot='0x01' function='0x2'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x11' function='0x0'/>
    </interface>
    
  2. 在客户虚拟机中为VF接口设置IP地址1.1.1.1。

  3. 为连接到L2交换机的Iperf客户端接口设置IP地址1.1.1.2。

  4. 通过发送ICMP请求,确保Iperf客户端与客户虚拟机之间的连通性。

  5. 在客户虚拟机上启动iperf服务器:

    iperf3 -s
    
  6. 在Iperf客户端服务器上启动iperf客户端:

    iperf3 -c 1.1.1.1 -P 10
    
  7. 验证两个绑定从接口上都有数据包接收和发送。 在客户虚拟机管理程序命令行中运行:

    watch -d -n1 "ethtool -S <First_PF_interface_name> | grep packets | grep phy"
    watch -d -n1 "ethtool -S <Second_PF_interface_name> | grep packets | grep phy"
    ## 输出应如下所示 ##
    tx_packets_phy: 135555012
    rx_packets_phy: 1487683
    
  8. 使其中一个绑定链路失效,重复步骤7。您将观察到数据包仅通过单个绑定从接口接收和发送。

拆除VF-LAG BOND

如果用户想要拆除VF-LAG BOND,务必遵循以下顺序:

  1. 首先从虚拟机中拆除VF。

  2. 按如下方式解绑VF驱动:

    VFS_PCI=($(lspci | grep "Mellanox" | grep "Virtual" | cut -d " " -f 1));
    for i in ${VFS_PCI[@]};
    do
        echo "unbinding VF $i";
        echo "0000:${i}" >> /sys/bus/pci/drivers/mlx5_core/unbind;
    done
    
  3. 撤销本文中描述的构建VF-LAG BOND的步骤。

关于作者

AZ.jpg Amir Zeidner 多年来,Amir主要在电信领域担任解决方案架构师,领导先进解决方案以满足5G、NFV和SDN网络基础设施需求。Amir在数据平面加速技术(如加速交换和网络处理(ASAP²)和DPDK)方面的专业知识,加上对开源云基础设施的深入了解,使他能够在整个电信领域推广和交付独特的端到端NVIDIA网络解决方案。

相关文档

相关页面