CentOS7のTeam DriverによるNIC冗長化設定手順

CentOS7からbonding以外の選択肢としてのteam Driver使えるようになったので、そちらの調査をしてみました。

基本設定

基本設定内容

以下のような基本設定で行ってみます。

項目 設定値
接続プロファイル名 team0-master
チーミングデバイス名 team0
スレーブデバイス eth2,eth3
IPアドレス 192.168.133.46/24
GW 192.168.133.5
DNS1 8.8.8.8
DNS2 8.8.4.4

手順

まず、マスターデバイスとしてteam0を作成します。チーミングの対象のNICはこのマスターデバイスのスレーブとしてアサインされます。

# nmcli c add type team con-name team0-master ifname team0 \
      ip4 192.168.133.46/24 \
      gw4 192.168.133.5

必要に応じてDNSなどの設定も追加します。

# nmcli c modify team0-master ipv4.dns 8.8.8.8 +ipv4.dns 8.8.4.4

team0が作成されています。

# nmcli c
NAME                UUID                                  TYPE            DEVICE
team0-master        d93e67a8-07bf-4a4d-8bb5-af11cd205364  team            team0 
〜中略〜

ここに対象となるNICをスレーブとしてアサインしていきます。まず、接続プロファイルを生成します。

nmcli c add type team-slave con-name team0-eth2 ifname eth2 master team0
nmcli c add type team-slave con-name team0-eth3 ifname eth3 master team0

生成した接続プロファイルを有効化します。

nmcli c up team0-eth2
nmcli c up team0-eth3

teamdctlコマンドで今の状態が確認できます。アサインしたNICがUPになっているのが確認できればもう繋がるようになっていると思います。

また、設定内容を見ると、以下の項目が確認できると思います。こちらはTeamingの挙動を設定するパラメータになります。後述します。

  • runner
  • link watches
# teamdctl team0 state -v
setup:
  runner: roundrobin
  kernel team mode: roundrobin
  D-BUS enabled: yes
  ZeroMQ enabled: no
  debug level: 0
  daemonized: no
  PID: 642
  PID file: /var/run/teamd/team0.pid
ports:
  eth2
    ifindex: 4
    addr: 08:00:27:dd:bc:14
    ethtool link: 1000mbit/fullduplex/up
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
        link up delay: 0
        link down delay: 0
  eth3
    ifindex: 5
    addr: 08:00:27:dd:bc:14
    ethtool link: 1000mbit/fullduplex/up
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
        link up delay: 0
        link down delay: 0

Teaming動作設定

設定できる項目

runner

runnerは複数NIC間の負荷分散やバックアップ方法の設定値です。

runner 説明
broadcast データは全ポートで送信されます
round-robin データは全ポートで順番に送信されます
active-backup 1 つのポートまたはリンクが使用され、他はバックアップとして維持されます
loadbalance アクティブ Tx 負荷分散と BPF ベースの Tx ポートセレクターを使用
lacp 802.3ad リンクアグリゲーション制御プロトコルを実装
link watches

名前のまま、リンクを確認するための方式です。

link watches 説明
ethtool Libteam lib は ethtool を使用してリンク状態の変更を監視。設定ファイルで他のリンク監視が指定されていなければ、これがデフォルトになります。
arp_ping arp_ping ユーティリティーは、ARP パケットを使用して先方のハードウェアアドレスの存在を監視します。
nsna_ping IPv6 近隣検索プロトコルからの近隣アドバタイズと近隣要請を使って近隣のインターフェイスの存在を監視します。

参考URL: 「ネットワークチーミングデーモンおよび「ランナー」について」

設定手順

基本はサンプルが用意されているので、そちらを修正して使います。サンプルの場所は以下のディレクトリになります。

runnerとlink watchsの組み合わせでサンプルが用意されています。

# cd /usr/share/doc/teamd-<version>/example_configs
# ls -1
activebackup_arp_ping_1.conf
activebackup_arp_ping_2.conf
activebackup_ethtool_1.conf
activebackup_ethtool_2.conf
activebackup_ethtool_3.conf
activebackup_multi_lw_1.conf
activebackup_nsna_ping_1.conf
activebackup_tipc.conf
broadcast.conf
lacp_1.conf
loadbalance_1.conf
loadbalance_2.conf
loadbalance_3.conf
random.conf
roundrobin.conf
roundrobin_2.conf

サンプルをコピー&修正して使います。

cd work/
cp /usr/share/doc/teamd-1.17/example_configs/activebackup_ethtool_1.conf myactivebackup.conf
vi myactivebackup.conf

今回はeth2とeth3を使うので以下のように修正しました。 また、VirtualBoxの場合は以下のようにhwaddr_policyというパラメータの設定をしないとTeamingが上手く動きませんでした。

{
    "device": "team0",
    "runner": {"name": "activebackup", "hwaddr_policy": "by_active"},
    "link_watch": {"name": "ethtool"},
    "ports":  {
        "eth2": {
            "prio": 1
        },
        "eth3": {
            "prio": 10
        }
    }
}

設定を反映します。

nmcli connection modify team0-master team.config myactivebackup.conf
nmcli connection up team0-master

これで後はhttpやPINGでアクセスしながらLANケーブル抜き差ししたりして、機能していることを確認します。

nmcli d dis eth2
nmcli d con eth2
teamdctl team0 state
nmcli d dis eth3
nmcli d con eth3
teamdctl team0 state

参考URL

本家が詳しいです。

github.com

Bondingとの対比もあります。動き近いのでBondingの記事も理解に役立ちました。

rhelblog.redhat.com

VirtualBox環境でハマっていたのを助けてもらいました。

qiita.com