zl程序教程

您现在的位置是:首页 >  其他

当前栏目

learning:vpp bond

2023-02-19 12:21:04 时间

前几天有人在微信群里询问bond相关的一些问题,在上家公司使用过bond功能,但当时是基于vpp 16.9版本。最近看了一下21.10版本的发现差异很大,bond node节点跳转方式完全不同了。本文基于21.10搭建环境,通过cli来配置和验证bond功能。

链路聚合

下面内容来自华为配置文档介绍以太网链路聚合的定义及目的。 1、定义 以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。 2、目的 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口,达到增加链路带宽的目的。在实现增大带宽目的的同时,链路聚合采用备份链路的机制,可以有效的提高设备之间链路的可靠性。 链路聚合技术主要有以下三个优势: 1、增加带宽:链路聚合接口的最大带宽可以达到各成员接口带宽之和。 2、提高可靠性:当某条活动链路出现故障时,流量可以切换到其他可用的成员链路上,从而提高链路聚合接口的可靠性。 3、负载分担:在一个链路聚合组内,可以实现在各成员活动链路上的负载分担。 vpp bonding特性支持以下可选项目 1、mode:active-backup。此模式使用主备策略(热备)。在所有bond的物理网卡中,同一时刻只有一张网卡被激活,当且仅当活动网卡失效时才会激活其他的网卡。这种模式下做bond的两张或多张网卡的MAC地址和Bond虚拟网卡的MAC地址相同,而Bond的MAC地址是Bond创建启动后活动网卡(Active Slave)的MAC地址。这种模式要求主备网卡能快速的切换,即当主网卡出现故障后能迅速地切换至备用网卡。 2、mode:lacp:动态链接聚合。动态LACP汇聚是一种系统自动创建/删除的汇聚,不允许用户增加或删除动态LACP汇聚中的成员端口。只有速率和双工属性相同、连接到同一个设备、有相同基本配置的端口才能被动态汇聚在一起。即使只有一个端口也可以创建动态汇聚,此时为单端口汇聚。动态汇聚中,端口的LACP协议处于使能状态。 - load-balance l2 | l23 | l34。#支持分担模式。 - numa-only:只有lacp模式下支持numa-only配置。 3、mode xor 平衡策略 表示XOR Hash负载分担,Hash模式支持如下: load-balance l2 | l23 | l34。#支持分担模式。 4、mode round-robin:此模式使用轮询策略,即顺序的在每一个被bond的网卡上发送数据包,这种模式提供负载均衡和容错能力。Bond0可以保证bond虚拟网卡和被bond的两张或多张物理网卡拥有相同的MAC地址,其中bond虚拟网卡的MAC地址是其中一张物理网卡的MAC地址,而bond虚拟网卡的MAC地址是根据bond自己实现的一个算法来选择的。 5、mode broadcast 使用广播策略,数据包会被广播至所有Slave网卡进行传送。

环境组网及配置

1、组网

利用wmware虚拟机搭建bond测试环境,每个虚拟机上存在5个虚拟网卡,其中2个绑定内核(1个用于ssh登录,1个用于和vpp接口连接测试),其余给vpp绑定。具体如下图:

2、基本配置

1、虚拟机1配置

#创建bond接口并设置为up
create bond mode xor load-balance l34 hw-addr 11:22:33:44:55:66 id 2
set interface state BondEthernet2 up
#设置wan1和wan2up,并加入bond2接口。
set interface state GigabitEthernet13/0/0 up
set interface state GigabitEthernet1b/0/0 up
bond add BondEthernet2 GigabitEthernet13/0/0
bond add BondEthernet2 GigabitEthernet1b/0/0
#配置bond接口ip地址
set interface ip address BondEthernet2 192.168.100.1/24
#设置到learningvpp2的路由
ip route add 200.1.2.0/24 via 192.168.100.2
#设置与内核ens161连接接口并设置ip地址。
set interface state GigabitEthernetb/0/0 up
set interface ip address GigabitEthernetb/0/0 200.1.1.1/24
#设置内核ens161接口ip及配置到learning vpp2路由。
ifconfig ens161 up
ifconfig ens161 200.1.1.2/24
ip route add 200.1.2.0/24 via 200.1.1.1 dev ens161

2、虚拟机2配置

create bond mode xor load-balance l34 hw-addr 11:22:33:44:55:77 id 2
set interface state GigabitEthernet13/0/0 up
set interface state GigabitEthernet1b/0/0 up
set interface state BondEthernet2 up
bond add BondEthernet2 GigabitEthernet13/0/0
bond add BondEthernet2 GigabitEthernet1b/0/0

set interface ip address BondEthernet2 192.168.100.2/24
ip route add 200.1.1.0/24 via 192.168.100.1
set interface state GigabitEthernetb/0/0 up
set interface ip address GigabitEthernetb/0/0 200.1.2.1/24
ifconfig ens33 up
ifconfig ens33 200.1.2.2/24
ip route add 200.1.1.0/24 via 200.1.2.1 dev ens33

bond测试

上面我们创建bond接口是设置模式xor,(balance-xor) XOR policy(平衡策略),lb设置l34(使用ip层+四层hash分担因子)。分别使用ping 202.1.2.1和202.1.2.2来测试分担情况,使用trace来查看流程。 trace节点后发现当前版本BondEthernet2-output后面未显示后面处理逻辑了。查看了一个trace代码BondEthernet2-tx 是作为trace 起点来处理的。当手动设置BondEthernet2-tx时发现报错了。导致意思就是当前node不支持设置trace。node节点flags未置位。

learning_vpp1# trace add BondEthernet2-tx 10 
trace add: node 'BondEthernet2-tx' doesn't support per-node tracing. There may be another way to initiate trace on this node.
#但是发现bond process node 置位了trace,此地一堆问号??
VLIB_REGISTER_NODE (bond_process_node) = {
  .function = bond_process,
  .flags = VLIB_NODE_FLAG_TRACE_SUPPORTED,
  .type = VLIB_NODE_TYPE_PROCESS,
  .name = "bond-process",
};

bond process node节点置位支持设置trace,但是bond porcess只是用来发送免费arp,此flags貌似也没有什么用途吧。 疑问:为什么不直接BondEthernet2-tx增加trace相关处理代码,代码中偏偏作为trace起点??

通过gdb来设置BondEthernet2-tx flags标识位来支持trace,可以支持trace设置。

#709是BondEthernet2-tx node索引。
set var vlib_global_main.vlib_mains[0]->node_main.nodes[709]->flags = 2 + 1 << 8

1、在learning vpp1上基于内核ping 200.1.2.1 在learning vpp2上设置trace流程如下,报文从bond接口GigabitEthernet13/0/0回应。

00:13:21:048851: dpdk-input
  GigabitEthernet1b/0/0 rx queue 0
  IP4: 11:22:33:44:55:66 -> 11:22:33:44:55:77
  ICMP: 200.1.1.2 -> 200.1.2.1
    tos 0x00, ttl 63, length 84, checksum 0xf909 dscp CS0 ecn NON_ECN
    fragment id 0xaf99, flags DONT_FRAGMENT
  ICMP echo_request checksum 0x2aea id 21077
00:13:21:048934: bond-input
  src 11:22:33:44:55:66, dst 11:22:33:44:55:77, GigabitEthernet1b/0/0 -> BondEthernet2
00:13:21:048976: ethernet-input
  IP4: 11:22:33:44:55:66 -> 11:22:33:44:55:77
00:13:21:049009: ip4-input
00:13:21:049037: ip4-lookup
00:13:21:049066: ip4-local
00:13:21:049091: ip4-icmp-input
00:13:21:049118: ip4-icmp-echo-request
00:13:21:049150: ip4-load-balance
  fib 0 dpo-idx 13 flow hash: 0x00000000
  ICMP: 200.1.2.1 -> 200.1.1.2
    tos 0x00, ttl 64, length 84, checksum 0x1026 dscp CS0 ecn NON_ECN
    fragment id 0x977d, flags DONT_FRAGMENT
  ICMP echo_reply checksum 0x32ea id 21077
  fib 0 dpo-idx 2 flow hash: 0x00000000
  ICMP: 200.1.2.1 -> 200.1.1.2
    tos 0x00, ttl 64, length 84, checksum 0x1026 dscp CS0 ecn NON_ECN
    fragment id 0x977d, flags DONT_FRAGMENT
  ICMP echo_reply checksum 0x32ea id 21077
00:13:21:049197: ip4-rewrite
  tx_sw_if_index 4 dpo-idx 2 : ipv4 via 192.168.100.1 BondEthernet2: mtu:9000 next:3 flags:[] 
00:13:21:049221: BondEthernet2-output
Packet 5
00:13:21:049248: BondEthernet2-tx
  src 11:22:33:44:55:77, dst 11:22:33:44:55:66, BondEthernet2 -> GigabitEthernet13/0/0

2、在learning vpp1上基于内核ping 200.1.2.2,在learning vpp2 设置trace流程,只显示从内核回应的reply报文,上从bond接口GigabitEthernet1b/0/0回应。

00:13:17:374058: dpdk-input
  GigabitEthernetb/0/0 rx queue 0
00:13:17:374103: ethernet-input
00:13:17:374142: ip4-input
  ICMP: 200.1.2.2 -> 200.1.1.2
    tos 0x00, ttl 64, length 84, checksum 0x19cf dscp CS0 ecn NON_ECN
    fragment id 0xcdd3
  ICMP echo_reply checksum 0xbfb id 21076
00:13:17:374169: ip4-lookup
00:13:17:374195: ip4-load-balance
00:13:17:374246: BondEthernet2-output
  ICMP echo_reply checksum 0xbfb id 21076
Packet 3
00:13:17:374271: BondEthernet2-tx
  src 11:22:33:44:55:77, dst 11:22:33:44:55:66, BondEthernet2 -> GigabitEthernet1b/0/0

上面1,2可以看到报文在bond下两个接口进行了分担处理。这种验证也比较勉强,只有2个流。理论上应该设置多条流来验证。环境因素就不进行验证了。

bond处理流程。

通过上面场景1的trace流程来梳理bond的处理逻辑如下所示:

参考文档:

1、华为eth-trunk配置手册https://support.huawei.com/enterprise/zh/doc/EDOC1000178154/c1b2412c 2、H3c链路聚合配置手册http://www.h3c.com/cn/d_201108/723437_30005_0.htm 3、LInux系统bond模式介绍:https://www.cnblogs.com/yanling-coder/p/11867123.html