KVM仮想環境におけるBonding

仮想環境の可用性を向上させるため、

  • 仮想環境ホストとネットワーク機器との接続
  • ネットワーク機器間の接続

においては、物理的に冗長化させた構成をとるのが一般的です。

図 冗長構成

しかしながら、KVMホストとネットワーク機器との接続にBonding(active-standbyモード)を用いた場合、Bondingドライバによる物理NIC切り替えが発生すると、外部ネットワークスイッチのMACアドレス情報が適切に更新されるまで仮想マシンと外部ネットワークの通信が再開されない状態に陥るという問題があります。

確認の構成

問題の状態について、図 確認構成の環境を使って確認します。

図 確認構成

KVMホストとエッジスイッチについては冗長化させていますが、コアスイッチについては冗長化を省略しています。

KVMホスト(CentOS 6)のBondingに関する設定内容は、次のとおりです。

kvm ~# cat /etc/modprobe.d/bonding.conf
alias bond0 bonding
kvm ~# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="68:05:CA:1B:6F:20"
BOOTPROTO="none"
MASTER="bond0"
SLAVE="yes"
kvm ~# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
HWADDR="68:05:CA:1B:6F:21"
BOOTPROTO="none"
MASTER="bond0"
SLAVE="yes"
kvm ~# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE="bond0"
BOOTPROTO="none"
BRIDGE="br0"
BONDING_OPTS="mode=1 primary=eth0 miimon=100"
kvm ~# cat /etc/sysconfing/network-scripts/ifcfg-br0
DEVICE="br0"
TYPE="BRIDGE"
ONBOOT="yes"
BOOTPROTO="none"
STP="off"
kvm #

確認の実施

確認に先立ち、コアスイッチのMACアドレステーブルを空にしておきます。

コアスイッチ MACアドレステーブル状況1

続いて、PCから仮想マシンvm1および仮想マシンvm2へ各々PINGを送信させたままにします。

explain6

pc ~$ ping 192.168.123.11
PING 192.168.123.11 (192.168.123.11) 56(84) bytes of data.
64 bytes from 192.168.123.11: icmp_seq=1 ttl=64 time=4.17 ms
64 bytes from 192.168.123.11: icmp_seq=2 ttl=64 time=0.324 ms
64 bytes from 192.168.123.11: icmp_seq=3 ttl=64 time=0.282 ms
・・・

PING (PC→仮想マシンvm1)

pc ~$ ping 192.168.123.22
PING 192.168.123.22 (192.168.123.22) 56(84) bytes of data.
64 bytes from 192.168.123.22: icmp_seq=1 ttl=64 time=3.87 ms
64 bytes from 192.168.123.22: icmp_seq=2 ttl=64 time=0.274 ms
64 bytes from 192.168.123.22: icmp_seq=3 ttl=64 time=0.271 ms
・・・

PING (PC→仮想マシンvm2)

この時点におけるコアスイッチのMACアドレステーブルを確認してみます。

コアスイッチ MACアドレステーブル状況2

ここで、KVMホストのeth0とエッジスイッチ#1を接続しているケーブルを抜くとPCから仮想マシンvm1および仮想マシンvm2へのPINGが停止状態(PING応答が受信できない)になることがわかります。

explain7

この時点におけるコアスイッチのMACアドレステーブルを再び確認してみます。

コアスイッチ MACアドレステーブル状況3

コアスイッチのMACアドレステーブルは更新されていないことがわかります。
PCから仮想マシンvm1および仮想マシンvm2へ送信されているPING(ICMP ECHO)パケットは、コアスイッチのMACアドレステーブルにしたがって、KVMホストが接続されていないエッジスイッチ#1へ転送されてしまっており、仮想マシンvm1および仮想マシンvm2へは届きません。

explain8

この状態は、コアスイッチのMACアドレステーブルがエージングタイム経過によってクリアされるか、各仮想マシンから送信されるパケットによってMACアドレステーブルが適切に更新されるまで続いてしまいます。