ネットワーク インターフェイス チーミングは、CentOS/RHEL 7 から、ネットワーク ボンディングのより拡張性とスケーラビリティに優れた代替手段として導入されました。この投稿では、CentOS/RHEL 7/8 でネットワーク チーミングを構成する方法について説明します。
提供されている例は、NetworkManager を使用する 2 つのネットワーク インターフェイスを備えた Oracle Linux 8.2 システム (Oracle VirtualBox 6.1 ゲスト仮想マシン) に基づいています。
1.オリジナルのプレチーム構成
以下は、元のチーム前のネットワーク構成を示しています:
# dnf list | grep team | grep anaconda NetworkManager-team.x86_64 1:1.22.8-4.el8 @anaconda libteam.x86_64 1.29-1.el8 @anaconda teamd.x86_64 1.29-1.el8 @anaconda
# lspci | grep -i eth 00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) 00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
# nmcli dev DEVICE TYPE STATE CONNECTION enp0s3 ethernet connected enp0s3 enp0s8 ethernet connected enp0s8 lo loopback unmanaged --
# nmcli con NAME UUID TYPE DEVICE enp0s3 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s3 enp0s8 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s8
# ls -l /etc/sysconfig/network-scripts/* -rw-r--r-- 1 root root 334 Aug 21 13:29 /etc/sysconfig/network-scripts/ifcfg-enp0s3 -rw-r--r-- 1 root root 334 Aug 21 13:30 /etc/sysconfig/network-scripts/ifcfg-enp0s8
# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 1 MACADDR=[MAC_ADDR1] 2 MTU=1500 3 TYPE=Ethernet 4 PROXY_METHOD=none 5 BROWSER_ONLY=no 6 BOOTPROTO=dhcp 7 DEFROUTE=yes 8 IPV4_FAILURE_FATAL=no 9 IPV6INIT=yes 10 IPV6_AUTOCONF=yes 11 IPV6_DEFROUTE=yes 12 IPV6_FAILURE_FATAL=no 13 IPV6_ADDR_GEN_MODE=stable-privacy 14 NAME="enp0s3" 15 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 16 DEVICE=enp0s3 17 ONBOOT=yes
# cat /etc/sysconfig/network-scripts/ifcfg-enp0s8 1 MACADDR=[MAC_ADDR2] 2 MTU=1500 3 TYPE=Ethernet 4 PROXY_METHOD=none 5 BROWSER_ONLY=no 6 BOOTPROTO=dhcp 7 DEFROUTE=yes 8 IPV4_FAILURE_FATAL=no 9 IPV6INIT=yes 10 IPV6_AUTOCONF=yes 11 IPV6_DEFROUTE=yes 12 IPV6_FAILURE_FATAL=no 13 IPV6_ADDR_GEN_MODE=stable-privacy 14 NAME="enp0s8" 15 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 16 DEVICE=enp0s8 17 ONBOOT=yes
# ip addr ... 2: enp0s3:mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether brd ff:ff:ff:ff:ff:ff inet /24 brd scope global dynamic noprefixroute enp0s3 valid_lft 86059sec preferred_lft 86059sec inet6 fe80::ca99:46d3:1765:f02b/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether brd ff:ff:ff:ff:ff:ff inet /24 brd scope global dynamic noprefixroute enp0s8 valid_lft 86121sec preferred_lft 86121sec inet6 fe80::36d0:6bd3:5152:83dc/64 scope link noprefixroute valid_lft forever preferred_lft forever
2.既存のネットワーク接続を削除
次のように、既存の enp0s3 および enp0s8 接続を削除します。これらは、次の手順でチーム スレーブとして再作成されます。
# nmcli con show NAME UUID TYPE DEVICE enp0s3 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s3 enp0s8 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s8
# nmcli con del XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Connection 'enp0s3' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully deleted. # nmcli con del XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX Connection 'enp0s8' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully deleted.
# nmcli dev DEVICE TYPE STATE CONNECTION enp0s3 ethernet disconnected -- enp0s8 ethernet disconnected -- lo loopback unmanaged --
# ls -l /etc/sysconfig/network-scripts/ total 0 #
3.マスターチームのつながりを作る
マスター チーム接続を作成します。例:
# nmcli con add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}, "link_watch": {"name": "ethtool"}}' Connection 'team0' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully added.
上記では、チームの実行モード (runner) は activebackup であり、チームのリンク モニター/ウォッチャー (link_watch) は ethtool です。 runner と link_watch の代替値には以下が含まれます:
- ランナー :ロードバランス、ラウンドロビン、lacp、ブロードキャスト、ランダム。
- link_watch :arp_ping、nsna_ping
NetworkManager は次のインターフェイス構成ファイルを作成します:
# cat /etc/sysconfig/network-scripts/ifcfg-team0 1 TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}" 2 PROXY_METHOD=none 3 BROWSER_ONLY=no 4 BOOTPROTO=dhcp 5 DEFROUTE=yes 6 IPV4_FAILURE_FATAL=no 7 IPV6INIT=yes 8 IPV6_AUTOCONF=yes 9 IPV6_DEFROUTE=yes 10 IPV6_FAILURE_FATAL=no 11 IPV6_ADDR_GEN_MODE=stable-privacy 12 NAME=team0 13 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 14 DEVICE=team0 15 ONBOOT=yes 16 DEVICETYPE=Team
# nmcli con NAME UUID TYPE DEVICE team0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX team team0
# nmcli dev DEVICE TYPE STATE CONNECTION team0 team connecting (getting IP configuration) team0 enp0s3 ethernet disconnected -- enp0s8 ethernet disconnected -- lo loopback unmanaged
4.必要に応じて静的 IP アドレスをチームに割り当てます
必要に応じて、静的 IP アドレス、ゲートウェイ、DNS などをチーム接続に割り当てます。例:
# nmcli con mod team0 ipv4.addresses [IP3]/24 # nmcli con mod team0 ipv4.gateway [IP4] # nmcli con mod team0 ipv4.dns [IP5] # nmcli con mod team0 ipv4.method manual # nmcli con mod team0 connection.autoconnect yes
NetworkManager は、次のチーム インターフェイス構成ファイルを変更します:
# cat /etc/sysconfig/network-scripts/ifcfg-team0 1 TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}" 2 PROXY_METHOD=none 3 BROWSER_ONLY=no 4 BOOTPROTO=none 5 DEFROUTE=yes 6 IPV4_FAILURE_FATAL=no 7 IPV6INIT=yes 8 IPV6_AUTOCONF=yes 9 IPV6_DEFROUTE=yes 10 IPV6_FAILURE_FATAL=no 11 IPV6_ADDR_GEN_MODE=stable-privacy 12 NAME=team0 13 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 14 DEVICE=team0 15 ONBOOT=yes 16 DEVICETYPE=Team 17 IPADDR=[IP3] 18 PREFIX=24 19 GATEWAY=[IP4] 20 DNS1=[IP5]
静的 IP アドレスが割り当てられていない場合、チームは DHCP を利用します。
5.スレーブを設定してチームに追加
スレーブを構成してチームに追加します。例:
# nmcli con add type team-slave con-name team0-slave0 ifname enp0s3 master team0 Connection 'team0-slave0' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully added. # nmcli con add type team-slave con-name team0-slave1 ifname enp0s8 master team0 Connection 'team0-slave1' (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) successfully added.
# nmcli conn NAME UUID TYPE DEVICE team0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX team team0 team0-slave0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s3 team0-slave1 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet enp0s8
# nmcli dev DEVICE TYPE STATE CONNECTION team0 team connected team0 enp0s3 ethernet connected team0-slave0 enp0s8 ethernet connected team0-slave1 lo loopback unmanaged --
NetworkManager は、次のチーム スレーブ インターフェース構成ファイルを作成します:
# cat /etc/sysconfig/network-scripts/ifcfg-team0-slave0 1 NAME=team0-slave0 2 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 3 DEVICE=enp0s3 4 ONBOOT=yes 5 TEAM_MASTER=team0 6 DEVICETYPE=TeamPort
# cat /etc/sysconfig/network-scripts/ifcfg-team0-slave1 1 NAME=team0-slave1 2 UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 3 DEVICE=enp0s8 4 ONBOOT=yes 5 TEAM_MASTER=team0 6 DEVICETYPE=TeamPort
少なくとも 1 つのスレーブがチームに追加されると、インターフェース (team0) が起動され、アクセス可能になります。
# ip addr ... 2: enp0s3: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff 3: enp0s8: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff 6: team0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff inet [IP3]/24 brd [IP6] scope global dynamic noprefixroute team0 valid_lft 86045sec preferred_lft 86045sec inet6 fe80::5b1f:554a:1928:8575/64 scope link noprefixroute valid_lft forever preferred_lft forever
すべてのチーム/チーム化されたインターフェースは同じ MAC アドレス、つまりチームの最初のチーム スレーブ メンバーのものを使用することに注意してください。
6.チームを再起動
静的 IP アドレスなどを有効にするには、チームを再起動します。例:
# nmcli con down team0 && nmcli con up team0
7.現在アクティブ/非アクティブなスレーブ インターフェースを特定する
teamdctl(8) を使用して、現在アクティブおよび非アクティブなスレーブ インターフェイスを識別します。例:
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 enp0s8 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 runner: active port: enp0s3
8.ネットワーク インターフェイスの無差別モードを有効にする
Oracle VM VirtualBox などの一部の仮想化テクノロジーでは、スレーブのフェイルオーバー/フェイルバックが正しく動作するために、ゲストに割り当てられたネットワーク インターフェイスとゲスト内で無差別モードを有効にする必要があります。物理システムのネットワーク インターフェイスでプロミスキャス モードを有効にすることも必要になる場合があります。
Oracle VM VirtualBox の場合、次のようにゲスト インターフェイスに対してプロミスキャス モードを有効にすることができます:
– Oracle VM VirtualBox Manager> [GUEST]> Settings> Network> Adapter 1|… ] Advanced ] Promiscuous Mode:Allow All
プロミスキャス モードは、次のようにカスタム サービスを使用して、CentOS/RHEL 7 システム内で動的および静的に有効にすることができます。
動的、非永続的:
# ip link set enp0s3 promisc on # ip link set enp0s8 promisc on
静的、永続的:
次の内容のカスタム systemd ユニット ファイルを作成します。例:
# cat /usr/lib/systemd/system/promiscuous.service 1 [Unit] 2 Description=Bring up network interfaces in promiscuous mode upon boot 3 After=network.target 4 5 [Service] 6 Type=oneshot 7 ExecStart=/usr/sbin/ip link set dev enp0s3 promisc on 8 ExecStart=/usr/sbin/ip link set dev enp0s8 promisc on 9 ExecStop=/usr/sbin/ip link set dev enp0s3 promisc off 10 ExecStop=/usr/sbin/ip link set dev enp0s8 promisc off 11 TimeoutStartSec=0 12 RemainAfterExit=yes 13 14 [Install] 15 WantedBy=default.target
systemd に新しいサービスを通知します。例:
# systemctl daemon-reload
新しいサービス/ユニットを有効にして開始します。例:
# systemctl enable promiscuous Created symlink /etc/systemd/system/default.target.wants/promiscuous.service → /usr/lib/systemd/system/promiscuous.service.
# systemctl start promiscuous
# systemctl status promiscuous ● promiscuous.service - Bring up network interfaces in promiscuous mode upon boot Loaded: loaded (/usr/lib/systemd/system/promiscuous.service; enabled; vendor preset: disabled) Active: active (exited) since Fri 2020-08-21 16:14:53 AEST; 17s ago Process: 8088 ExecStart=/usr/sbin/ip link set dev enp0s8 promisc on (code=exited, status=0/SUCCESS) Process: 8086 ExecStart=/usr/sbin/ip link set dev enp0s3 promisc on (code=exited, status=0/SUCCESS) Main PID: 8088 (code=exited, status=0/SUCCESS) Aug 21 16:14:53 [HOST] systemd[1]: Starting Bring up network interfaces in promiscuous mode upon boot... Aug 21 16:14:53 [HOST] systemd[1]: Started Bring up network interfaces in promiscuous mode upon boot.
すべてのスレーブ インターフェイスでプロミスキャス モードが有効になっていることを確認します。例:
# ip addr | grep enp 2: enp0s3: [BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000 3: enp0s8: [BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP group default qlen 1000
9.チームのネットワーク接続回復力のテスト – スレーブのフェイルオーバー/フェイルバック
A. リモート クライアントから、ネットワーク チーミングが構成されているサーバーの継続的な ping(8) を開始します。例:
[CLIENT]$ ping [SERVER] PING [IP3] ([IP3]) 56(84) bytes of data. 64 bytes from [IP3]: icmp_seq=1 ttl=64 time=0.025 ms 64 bytes from [IP3]: icmp_seq=2 ttl=64 time=0.034 ms 64 bytes from [IP3]: icmp_seq=3 ttl=64 time=0.039 ms ...
B. 現在アクティブなチーム スレーブを切断します。
スレーブ インターフェイスに接続されている物理ネットワーク ケーブルを一時的に取り外します。 enp0s3.プログラムでインターフェイスを無効にしても、実際の物理リンク接続の切断はエミュレートされないことに注意してください。
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 enp0s8 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 0 runner: active port: enp0s8
切断されると、teamdctl はスレーブ インターフェイス enp0s3 をダウンとして示し、以前のバックアップ スレーブ enp0s8 が現在アクティブなスレーブになります。スレーブのフェイルオーバーにもかかわらず、リモート クライアントからの ping(8) は中断されずに続行されます。
さらに ip(8) コマンドを実行すると、チームへのすべてのネットワーク トラフィックが新しいアクティブなスレーブ enp0s8 経由で発生することが確認されます。つまり:
# ip -s link ... 2: enp0s3: [BROADCAST,MULTICAST,PROMISC] mtu 1500 qdisc fq_codel master team0 state DOWN mode DEFAULT group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 3007606561 5014092 0 27008 0 91263 TX: bytes packets errors dropped carrier collsns 787749 7568 0 0 0 0 3: enp0s8: [BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP] mtu 1500 qdisc fq_codel master team0 state UP mode DEFAULT group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 3829373093 6116137 0 26680 0 111948 TX: bytes packets errors dropped carrier collsns 179163 1337 0 0 0 0 7: team0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether [MAC1] brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 2106463511 1969187 0 49615 0 60559 TX: bytes packets errors dropped carrier collsns 176341 1378 0 0 0 0
C. 新しい現在アクティブなチーム スレーブを切断します。
新しく昇格したアクティブなスレーブ インターフェイスに接続されている物理ネットワーク ケーブルを一時的に切断します。 enp0s8.切断されると、teamdctl はスレーブ インターフェイス enp0s3 と enp0s8 の両方をダウンとして示します。例:
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 enp0s8 link watches: link summary: down instance[link_watch_0]: name: ethtool link: up down count: 1 runner: active port:
この時点で、両方のチーム スレーブが切断されているため、リモート クライアントからの ping(8) は停止します。たとえば、
... 64 bytes from [IP3]: icmp_seq=1253 ttl=64 time=0.207 ms 64 bytes from [IP3]: icmp_seq=1254 ttl=64 time=0.131 ms 64 bytes from [IP3]: icmp_seq=1255 ttl=64 time=0.227 ms 64 bytes from [IP3]: icmp_seq=1256 ttl=64 time=0.218 ms 64 bytes from [IP3]: icmp_seq=1257 ttl=64 time=0.198 ms From [IP3] icmp_seq=1258 Destination Host Unreachable From [IP3] icmp_seq=1259 Destination Host Unreachable ...
D. 切断されたスレーブを再接続する
物理ネットワーク ケーブルをスレーブ インターフェイスの 1 つに再接続します。 enp0s3.再接続されると、teamdctl はスレーブ インターフェイス enp0s3 をアップとして示します。例:
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 1 enp0s8 link watches: link summary: down instance[link_watch_0]: name: ethtool link: down down count: 1 runner: active port: enp0s3
この時点で、enp0s3 が現在アクティブなスレーブであり、リモート クライアントからの ping(8) が再開されます。
... From [IP3] icmp_seq=1392 Destination Host Unreachable From [IP3] icmp_seq=1393 Destination Host Unreachable From [IP3] icmp_seq=1394 Destination Host Unreachable From [IP3] icmp_seq=1395 Destination Host Unreachable 64 bytes from [IP3]: icmp_seq=1396 ttl=64 time=1258180 ms 64 bytes from [IP3]: icmp_seq=1397 ttl=64 time=1257180 ms 64 bytes from [IP3]: icmp_seq=1398 ttl=64 time=1256181 ms 64 bytes from [IP3]: icmp_seq=1399 ttl=64 time=1255181 ms ...
E. 残りの切断されたスレーブを再接続します。
物理ネットワーク ケーブルを残りのスレーブ インターフェイスに再接続します。 enp0s8.再接続されると、teamdctl は残りのスレーブ インターフェイス enp0s8 をアップとして示します。つまり:
# teamdctl team0 state setup: runner: activebackup ports: enp0s3 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 1 enp0s8 link watches: link summary: up instance[link_watch_0]: name: ethtool link: up down count: 1 runner: active port: enp0s3