CentOS8におけるTeaming(LACP)設定

## なぜやる？
- 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