基于 NVIDIA Enhanced SR-IOV 与绑定支持 (VF-LAG) 的高可用性快速入门指南

本指南介绍如何利用 NVIDIA ASAP2 技术将链路聚合组 (LAG) 功能卸载到智能网卡硬件,实现虚拟机通过单个虚拟功能 (VF) 获得 LAG 支持,并详细说明在独立 Linux 服务器上的配置与评估步骤。

文档目录

创建于 2020 年 4 月 16 日,作者:Amir Zeidner

简介

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

参考

ASAP2 文档

解决方案概述

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

描述 图示
虚拟机通过虚拟接口 (virtio) 连接到主机 LAG。此解决方案适用于不需要高性能网络的应用程序。 图1
SRIOV 是网络密集型应用的默认选择。在这种情况下,链路聚合在虚拟机内部执行(虚拟机感知 LAG),只能实现 HA 模式。 图2
SRIOV switchdev 模式和 ASAP²(加速交换和数据包处理®)是增强型 SR-IOV 技术,可将主机和虚拟机的网络处理卸载到网卡硬件。绑定功能现在卸载到网卡硬件。单个虚拟功能由两个物理绑定端口支持。 图3

解决方案逻辑设计

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

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

图4

主机配置与前提条件

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

主机部署与配置

设置固件以支持 SRIOV

首先安装 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 插槽号设置固件以启用 SRIOV 并指定所需 VF 数量:

## 启用 SRIOV 并设置所需 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
61:00.0 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]
61:00.1 Ethernet controller: Mellanox Technologies MT28800 Family [ConnectX-5 Ex]

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

## 刷新 iptable 规则并为每个 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

image2020-9-29_9-1-13-20221115-113658.png

  1. 首先启动一个客户 VM,使用基于 VF PCI 插槽号的 SRIOV 连接的 VF 接口。 以下是 VF 的 Virsh XML 部分,PCI 插槽号为 0000:61:01.2:

    <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. 在客户 VM 中为 VF 接口设置 IP 1.1.1.1。

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

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

  5. 在客户 VM 上启动 iperf 服务器:

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

    iperf3 -c 1.1.1.1 -P 10
    
  7. 验证两个绑定从接口上是否都接收和发送了数据包。

从客户 VM 的 Hypervisor 命令行运行:

# 命令未提供完整,请参考原始文档
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
  1. 使其中一个绑定链路失效,并重复步骤 7。您将观察到仅单个绑定从属接口接收和发送数据包。

拆除 VF-LAG 绑定

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

  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
  1. 撤销本文中描述的构建 VF-LAG 绑定的步骤。

关于作者

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