如何在 Linux 中配置网络Teaming

在 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
日期:2020-07-07 20:54:37 来源:oir作者:oir