手動のVXLAN設定から解放される
ノードごとに静的VXLANを設定するのに苦労したり、ARPフラッドによるトラフィックのネットワーク停滞に悩まされたりしたことがあるなら、BGP EVPN (Ethernet VPN) がその答えです。20ノード規模のKVMクラスターを6ヶ月間運用した経験から、最も洗練されたEVPN-VXLANラボモデルの構築手順をまとめました。
具体的なシナリオから始めましょう。2台のUbuntu 22.04サーバーをVTEP (VXLAN Tunnel End Point) として使用します。目的は、物理ケーブルを引く代わりにBGP EVPNの「トンネル」を通じて、異なるノードにある仮想マシン (VM) 同士をレイヤー2で通信させることです。
ステップ1:FRRoutingのインストールと有効化
FRRは、Linuxサーバーをプロフェッショナルなルーターに変える非常に強力なルーティングスイートです。インストールは非常に簡単です:
sudo apt update && sudo apt install frr -y
# ルーティング情報の交換のためにBGPデーモンを有効化する
sudo sed -i 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
sudo systemctl restart frr
ステップ2:VXLANインターフェースの設定
ノード1 (IP: 10.0.0.1) とノード2 (IP: 10.0.0.2) で、VMとVXLANインターフェースをまとめるためのブリッジを作成します。
# ノード1で実行
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link add vxlan10 type vxlan id 10 dstport 4789 local 10.0.0.1 nolearning
sudo ip link set vxlan10 master br0
sudo ip link set vxlan10 up
重要な注意点: nolearning オプションは必須です。ループを回避しパフォーマンスを最適化するために、MACアドレスの学習はLinuxカーネルによる従来の方法ではなく、BGPプロトコルに委ねます。
ステップ3:FRRによるBGP EVPNの設定
vtysh 制御シェルにアクセスし、以下の設定を貼り付けます。数十個のトンネルメッシュを設定する代わりに、わずか数行のコマンドで済みます:
conf t
router bgp 65001
neighbor 10.0.0.2 remote-as 65001
address-family l2vpn evpn
neighbor 10.0.0.2 activate
advertise-all-vni
exit-address-family
exit
コマンドが実行されるとすぐに、ノード1とノード2は自動的に「挨拶」を交わし、MAC/IPテーブルを交換します。これでオーバーレイネットワークの準備が整いました。
なぜEVPNは純粋なVXLANよりも優れているのか?
従来のVXLANアーキテクチャでは、「Flood and Learn(フラッド&ラーン)」メカニズムにより、すべてのARPブロードキャスト要求をトンネル全体に送信する必要があります。約500台のVMを持つ大規模なシステムでは、この無駄なトラフィックが物理帯域幅の20〜30%を占有してしまうことがあります。
BGP EVPNは、アドレス学習をコントロールプレーンに移行することで、この問題を根本的に解決します。パケットをフラッディングさせる代わりに、VTEPはBGPを使用して各MACアドレスの正確な位置を互いに通知します。その結果、ブロードキャストトラフィックが最大95%削減され、帯域幅の消費を抑え、遅延(レイテンシ)を低減できます。
覚えておくべき構成要素:
- VTEP: トンネルの終端点(Linuxサーバーそのもの)。
- VNI (VXLAN Network Identifier): ネットワーク識別子。最大1600万個のIDをサポートし、従来のVLANの4096制限を大幅に超えます。
- Anycast Gateway: すべてのノードに同じIPゲートウェイを配置できるため、VMがノード間を移動(ライブマイグレーション)しても接続が切れません。
苦い経験から学んだ教訓:MTUの「落とし穴」
EVPN-VXLANの導入で最も一般的なエラーは、「小さなパケットのPingは通るが、大きなファイルのダウンロードやWebアクセスで接続が切れる」という現象です。主な原因はMTU (Maximum Transmission Unit) です。
VXLANパケットは50バイトのヘッダーを「背負い」ます。物理インターフェースがデフォルトの1500バイトのままだと、合計パケットサイズが1550バイトに達し、物理スイッチによって即座にドロップされます。
実務からのアドバイス:
- 物理インターフェース (eth0/bond0) のMTUを少なくとも1550、理想的には9000 (ジャンボフレーム) に設定してください。
vtysh -c "show evpn mac vni 10"コマンドを使用して、MAC同期の状態を確認してください。- ルーティングテーブルを正確に管理するために、
/etc/frr/daemonsファイルでzebraを有効にすることを忘れないでください。

