在 Linux 中,可以将多个网络链接聚合到一个逻辑链接中,这可以增加网络吞吐量或者冗余。
例如,我们可以为一组两个网络接口分配一个 IP 地址以增加吞吐量,或者保留一个接口用于备份目的,这样如果第一个出现故障,我们可以进行故障转移。
在这里,我们将介绍如何创建和配置具有两个不同网络接口的网络 Teaming。
链接聚合过去是通过网络绑定(bonding)完成的,但是从RHEL 7开始,Teaming现在是首选方法,尽管您可以使用任何一种方法。Teaming效率更高,而且可以完成bonding所能做的大部分工作,但还有另外的功能。
安装 Teaming 守护进程
为了使用网络组合,我们必须首先安装 teamd 包,默认情况下通常不会安装。
yum install teamd -y
使用 nmcli 配置网络teaming
nmcli 工具是用于与网络管理器一起工作的命令行工具。
首先,我们可以显示当前就位的设备。
[jack@onitroad ~]# nmcli con show NAME UUID TYPE DEVICE Wired connection 2 03973d6f-ae98-4d0b-8780-90572571713d 802-3-ethernet eno50332208 Wired connection 1 497fe8ae-5217-4e2e-bf55-151b2ce61b50 802-3-ethernet eno33554984 eno16777736 0dbee9e5-1e7e-4c88-822b-869cfc9e2d13 802-3-ethernet eno16777736
在我正在测试的虚拟机中,我有 3 个网络接口,其中 eno16777736 是我通过 SSH 管理 VM 的主要接口,该接口不会在团队中使用。
团队中将使用分别对应设备eno33554984和eno50332208的有线连接1/2.
接下来我们创建一个名为“team0”的teaming。
[jack@onitroad ~]# nmcli con add type team con-name team0 Connection 'team0' (e6118c6d-3d63-449d-b6b6-5e61a44e5e44) successfully added.
现在,如果我们再次显示连接,我们应该看到 team0 列为设备“nm-team”。
[jack@onitroad ~]# nmcli con show NAME UUID TYPE DEVICE Wired connection 2 03973d6f-ae98-4d0b-8780-90572571713d 802-3-ethernet eno50332208 Wired connection 1 497fe8ae-5217-4e2e-bf55-151b2ce61b50 802-3-ethernet eno33554984 eno16777736 0dbee9e5-1e7e-4c88-822b-869cfc9e2d13 802-3-ethernet eno16777736 team0 e6118c6d-3d63-449d-b6b6-5e61a44e5e44 team nm-team
这个team还没有做任何事情,所以我们接下来添加我们的两个接口。
[jack@onitroad ~]# nmcli con add type team-slave ifname eno33554984 master team0 Connection 'team-slave-eno33554984' (d72bbe43-eaa9-4220-ba58-cd322f74653e) successfully added. [jack@onitroad ~]# nmcli con add type team-slave ifname eno50332208 master team0 Connection 'team-slave-eno50332208' (898ef4eb-65cd-45b1-be93-3afe600547e2) successfully added.
现在,如果我们再次显示连接,我们应该会看到列出的两个team-slaves。
[jack@onitroad ~]# nmcli con show NAME UUID TYPE DEVICE Wired connection 2 03973d6f-ae98-4d0b-8780-90572571713d 802-3-ethernet eno50332208 Wired connection 1 497fe8ae-5217-4e2e-bf55-151b2ce61b50 802-3-ethernet eno33554984 eno16777736 0dbee9e5-1e7e-4c88-822b-869cfc9e2d13 802-3-ethernet eno16777736 team-slave-eno50332208 898ef4eb-65cd-45b1-be93-3afe600547e2 802-3-ethernet - team-slave-eno33554984 d72bbe43-eaa9-4220-ba58-cd322f74653e 802-3-ethernet - team0 e6118c6d-3d63-449d-b6b6-5e61a44e5e44 team nm-team
这会自动为team创建以下配置文件:
[jack@onitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-team0 DEVICE=nm-team DEVICETYPE=Team BOOTPROTO=dhcp DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=team0 UUID=c794ce57-2879-4426-9632-50cf05f8d5b5 ONBOOT=yes [jack@onitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-team-slave-eno33554984 NAME=team-slave-eno33554984 UUID=9b5d1511-43ee-4184-b20d-540c2820bb6a DEVICE=eno33554984 ONBOOT=yes TEAM_MASTER=c794ce57-2879-4426-9632-50cf05f8d5b5 DEVICETYPE=TeamPort [jack@onitroad ~]# cat /etc/sysconfig/network-scripts/ifcfg-team-slave-eno50332208 NAME=team-slave-eno50332208 UUID=9f441c0f-07fc-430b-8bb1-9e913c05d7b3 DEVICE=eno50332208 ONBOOT=yes TEAM_MASTER=c794ce57-2879-4426-9632-50cf05f8d5b5 DEVICETYPE=TeamPort
注意:如果我们手动编辑这些文件中的任何一个,我们将需要运行“nmcli con reload”命令,以便网络管理器读取配置更改。
该团队现在已设置为默认配置,默认情况下将使用 DHCP,但如果需要,我们可以使用以下命令手动指定 IP 地址配置。
nmcli con mod team0 ipv4.method bananaal nmcli con mod team0 ipv4.addresses 192.168.1.50/24 nmcli con mod team0 ipv4.gateway 192.168.1.254
启用team
在这一点上,文档通常说我们可以运行“nmcli con up team0”来启动team,但是这将不起作用,因为我们首先需要启动作为team内部接口的端口。
[jack@onitroad ~]# nmcli connection up team-slave-eno50332208 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4) [jack@onitroad ~]# nmcli connection up team-slave-eno33554984 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
启动端口后,team状态变为激活,在我的测试中,团队正在使用 DHCP,因此在发出上述第一个命令后,它能够成功获取 IP 地址,如下所示。
需要注意的是,组接口仅在其端口接口之一启动时才启动,但这不会自动启动组中的所有其他端口接口。
单独启动组接口不会自动启动所有端口接口。
如果我们弄乱了顺序,我们可以运行“systemctl restart network”,它应该正确启动端口和组并给出与下面相同的结果。
[jack@onitroad ~]# ip a ... 3: eno33554984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master nm-team state UP qlen 1000 link/ether 00:0c:29:ac:13:21 brd ff:ff:ff:ff:ff:ff 4: eno50332208: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master nm-team state UP qlen 1000 link/ether 00:0c:29:ac:13:21 brd ff:ff:ff:ff:ff:ff 8: nm-team: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 00:0c:29:ac:13:21 brd ff:ff:ff:ff:ff:ff inet 192.168.1.50/24 brd 192.168.1.255 scope global dynamic nm-team valid_lft 86310sec preferred_lft 86310sec inet6 fe80::20c:29ff:feac:1321/64 scope link valid_lft forever preferred_lft forever
该team现已启动并运行!我通过在 192.168.1.50 对team运行恒定 ping 执行了一些基本测试,该team响应时间小于 1 毫秒,在禁用属于team成员的虚拟机上的网络接口之一后,响应立即增加到 13 毫秒,然后返回回到<1ms。
这表明连接仍然按预期工作,只有team中的两个接口之一可用。
修改team
默认情况下,team使用round robin策略,如下所示:
[jack@onitroad ~]# teamdctl nm-team state setup: runner: roundrobin ports: eno33554984 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up eno50332208 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up
这显示了我们添加到team中的两个端口,默认情况下,运行程序是循环的。runner本质上是team可以用来处理流量的不同方法,下面列出了不同的runner。
- roundrobin:这是我们使用的默认值,它只是以循环方式将数据包发送到组中的所有接口,即一次一个,然后是下一个接口。
- broadcast:所有流量都通过所有端口发送。
- activebackup:一个接口正在使用,而另一个被留出作为备份,链路被监控变化,如果需要,将使用故障转移链路。
- loadbalance:负载均衡模式,基于 Tx 流量在所有接口上平衡流量,应在可用接口上共享相等的负载。
我们可以使用以下命令在创建team时指定要用于team的runner,它类似于我们用于创建初始team的命令,只是在末尾添加了配置部分。
nmcli con add type team con-name team0 config '{ "runner": {"name": "broadcast"}}'
或者,我们可以通过简单地编辑在 /etc/sysconfig/network-scripts/ifcfg-team0 中创建的配置文件并添加如下一行来修改当前team。
TEAM_CONFIG='{"runner": {"name": "activebackup"}, "link_watch": {"name": "ethtool"}}'
我们不必记住运行程序使用的语法,只需查看 /usr/share/doc/teamd-X.XX/example_configs/ 目录中的示例配置即可。
我们可以将使用的运行程序复制并粘贴到 nmcli 命令中。
在此之后,我运行了一个“systemctl restart network”使更改生效,然后我们可以确认这是team正在使用的runner:
[jack@onitroad ~]# teamdctl nm-team state setup: runner: broadcast