なぜやる?
- CentOS6くらいまでは主流だったbondingドライバーよりも高機能と聞いたので
- オンプレでDocker、k8sのホストを動かす場合はNICは冗長化しておきたい
- クラウド全盛でしばらくオンプレのサーバを触ってなかったのでリハビリも兼ねて
- 久々に新しいオンプレサーバが納品されたので、本番環境構築する前に遊びたかった
検証環境
HPE DL380 Gen10
Cisco Catalyst 3750X-48 Stack構成
手順(ホスト側)
1. Teamdデーモンをインストールする
Teamdとは、CentOS6系までメジャーだったボンディングに代わり、CentOS7系から追加されたネットワークチーミングデーモンです。
まず、Teamdをインストールするには次のコマンドを実行します。
[root@host1 ~]# dnf -y install teamd
2. nmcliツールを使用してNICチーミングを構成する
CetOS7系以降はNetwork Managerでネットワークの管理をするようになったので、設定もコマンドラインユーティリティのNmcliを使って設定していきます。
最初に、下記のコマンドでネットワークインターフェイスの状態を確認します。
[root@host1 ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
eno5 ethernet 接続済み eno5
eno6 ethernet 接続済み eno6
eno7 ethernet 切断済み --
eno8 ethernet 接続済み eno8
lo loopback 管理無し --
現在、サーバには4つ物理イーサネットポートがあります。
今回はeno5とeno6を使ってチーミングを設定してみます。
[root@host1 ~]# nmcli connection show
NAME UUID TYPE DEVICE
eno5 c5a9f44a-306a-4728-82e8-70d0ce3e528b ethernet eno5
eno6 93be4fa2-61aa-4360-b570-94bef5f56fcb ethernet eno6
eno7 1dfffcc1-7807-4093-bdd7-844d0ce31aec ethernet --
eno8 ca899a0f-ac24-4a65-a2d6-86e90bef5f56 ethernet eno8
3.設定するNICのUUIDを削除
下記のコマンドでUUID指定してeno5、eno6のデフォルト設定を削除します
[root@dns3 ~]# nmcli connection delete c5a9f44a-306a-4728-82e8-70d0ce3e528b
[root@dns3 ~]# nmcli connection delete 93be4fa2-61aa-4360-b570-94bef5f56fcb
接続が消えているかどうか確認
[root@host1 ~]# nmcli connection show
NAME UUID TYPE DEVICE
eno7 1dfffcc1-7807-4093-bdd7-844d0ce31aec ethernet --
eno8 ca899a0f-ac24-4a65-a2d6-86e90bef5f56 ethernet eno8
[root@host1 ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
eno7 ethernet 切断済み --
eno8 ethernet 接続済み eno8
eno5 ethernet 切断済み eno5
eno6 ethernet 切断済み eno6
lo loopback 管理無し --
4. チームインターフェースの作成
新しいチームインターフェイス「bond0」を作成します。
"name"のところはランナー呼ばれるオプション設定で、下記のような種類があります。
ランナー | 動作 |
---|---|
broadcast | データは全ポートで送信されます |
round-robin | データは全ポートで順番に送信されます |
active-backup | 1 つのポートまたはリンクが使用され、他はバックアップとして維持されます) |
loadbalance | アクティブ Tx 負荷分散と BPF ベースの Tx ポートセレクターを使用 |
lacp | 802.3ad リンクアグリゲーション制御プロトコルを実装 |
今回は接続相手がCiscoのスイッチなのでLACPを選択してみます。
コマンドを実行すると/etc/sysconfig/network-scripts/ifcfg-team-bond0が自動的に作成されます。
今まで通り上記パスに直接ファイルをエディタで作成しても大丈夫ですが、今回はnmcliに慣れるためにコマンドで設定してみます。
[root@host1 ~]# nmcli connection add type team con-name bond0 ifname bond0 config '{"runner": {"name": "lacp"}}'
下記のコマンドでチームインターフェースが作成されたかどうか確認します。
[root@dns3 ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
bond0 team 切断済み bond0
eno8 ethernet 接続済み eno8
eno7 ethernet 切断済み --
lo loopback 管理無し --
[root@host1 ~]# nmcli connection show
NAME UUID TYPE DEVICE
bond0 2a7bb890-f677-48dc-b885-1f9ff111989d team bond0
eno8 ca899a0f-ac24-4a65-a2d6-86e90bef5f56 ethernet eno8
eno7 1dfffcc1-7807-4093-bdd7-844d0ce31aec ethernet --
[root@host1 ~]# nmcli con show bond0
connection.id: bond0
connection.uuid: 2a7bb890-f677-48dc-b885-1f9ff111989d
connection.stable-id: --
connection.type: team
connection.interface-name: bond0
connection.autoconnect: はい
~中略~
team.config: {"runner": {"name": "lacp"}}
5. インターフェースのメイン系、サブ系の指定
最近マスターとスレーブという言い方がNGらしいので、メイン系とサブ系を設定します。
[root@host1 ~]# nmcli con add type team-slave con-name bond0-slave0 ifname eno5 master bond0
[root@host1 ~]# nmcli con add type team-slave con-name bond0-slave1 ifname eno6 master bond0
下記のコマンドで、メイン系とサブ系の指定が出来ているかを確認します。
[root@dns3 ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
bond0 team 接続済み bond0
eno8 ethernet 接続済み eno8
eno5 ethernet 接続済み bond0-slave0
eno6 ethernet 接続済み bond0-slave1
eno7 ethernet 切断済み --
lo loopback 管理無し --
[root@host1 ~]# nmcli connection show
NAME UUID TYPE DEVICE
bond0 2a7bb890-f677-48dc-b885-1f9ff111989d team bond0
eno8 ca899a0f-ac24-4a65-a2d6-86e90bef5f56 ethernet eno8
bond0-slave0 c5a9f44a-306a-4728-82e8-70a8c73e528b ethernet eno5
bond0-slave1 93be4fa2-61aa-4360-b570-94fcb8cb8f94 ethernet eno6
eno7 1dfffcc1-7807-4093-bdd7-844d0ce31aec ethernet --
6. インターフェースのIPアドレス、DNS設定
作成したチームインターフェース「bond0」にIPアドレスとDNSを設定します。
[root@host1 ~]# nmcli con mod bond0 ipv4.addresses 192.168.250.1/24
[root@host1 ~]# nmcli con mod bond0 ipv4.gateway 192.168.250.254
[root@host1 ~]# nmcli con mod bond0 ipv4.dns 192.168.250.254
[root@host1 ~]# nmcli con mod bond0 ipv4.method manual
[root@host1 ~]# nmcli con mod bond0 connection.autoconnect yes
7. 設定の反映(インターフェース再起動)
設定を反映するため、下記のコマンドでチームインターフェース「bond0」を再起動します。
(面倒くさい場合はsystemctl restart NetworkManagerでもたぶん大丈夫です)
nmcli connection down bond0 && nmcli connection up bond0
8. 設定確認
下記のコマンドを実行してlink summaryが両方ともUPになっていれば正常
[root@host1 ~]# teamdctl bond0 state
setup:
runner: lacp
ports:
eno5
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
aggregator ID: 2, Selected
selected: yes
state: current
eno6
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
aggregator ID: 2, Selected
selected: yes
state: current
runner:
active: yes
fast rate: no
IPアドレスが設定されているかどうかは下記のコマンドで確認できます。
[root@host1 ~]# ip address show dev bond0
6: bond0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 98:f2:b3:**:**:** brd ff:ff:ff:ff:ff:ff
inet 192.168.250.1/24 brd 192.168.250.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever
inet6 fe80::**/64 scope link noprefixroute
valid_lft forever preferred_lft forever
9. スイッチ(Catalyst3750X)の設定例
本来はPort-Channelに記述すればinterface側の設定はdescription程度でいいかもしれないですが念のため記述
LACPのモードがCentOS6のボンディングではmode onでつながったんですが、teamdを使う場合はmode activeを指定します。
(これに気づかず5分くらいハマった)
interface GigabitEthernet1/0/1
description "Host1 Port#1"
switchport mode access
interface GigabitEthernet2/0/1
description "Host1 Port#2"
switchport mode access
interface Port-channel1
description "c3750_to_Host1"
switchport mode access
interface range GigabitEthernet1/0/1, GigabitEthernet2/0/1
channel-group 1 mode active
所感
個人的にはCentOS6系より楽だと感じました。
Redhatも今後はtamedの利用を推奨しているのでこちらを使うのが良いかと思います。
参考
[CentOS7] Catalyst3750とCentOS7でチーミング(LACP)する|MSeeeeN
https://mseeeen.msen.jp/teaming-lacp-with-catalyst3750-and-centos7/
How to Configure NIC Teaming on CentOS 8 / RHEL 8 Linuxtechi
https://www.linuxtechi.com/configure-nic-teaming-centos-8-rhel-8/
8.3. ネットワークチーミングとボンディングの比較
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-comparison_of_network_teaming_to_bonding