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アドレステーブルを空にしておきます。
続いて、PCから仮想マシンvm1および仮想マシンvm2へ各々PINGを送信させたままにします。
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アドレステーブルを確認してみます。
ここで、KVMホストのeth0とエッジスイッチ#1を接続しているケーブルを抜くとPCから仮想マシンvm1および仮想マシンvm2へのPINGが停止状態(PING応答が受信できない)になることがわかります。
この時点におけるコアスイッチのMACアドレステーブルを再び確認してみます。
コアスイッチのMACアドレステーブルは更新されていないことがわかります。
PCから仮想マシンvm1および仮想マシンvm2へ送信されているPING(ICMP ECHO)パケットは、コアスイッチのMACアドレステーブルにしたがって、KVMホストが接続されていないエッジスイッチ#1へ転送されてしまっており、仮想マシンvm1および仮想マシンvm2へは届きません。
この状態は、コアスイッチのMACアドレステーブルがエージングタイム経過によってクリアされるか、各仮想マシンから送信されるパケットによってMACアドレステーブルが適切に更新されるまで続いてしまいます。