この記事は、MicroAd Advent Calendar 2021の14日目の記事です。
この記事の概要
フルL3ネットワーク環境でOpenStackクラスターを新規構築するにあたり、
最終的にneutron-calicoで構築したという話です
構成
ざっくりと以下のような図のNW構成です。__ToR__と__サーバ間__は、__BGPでPeering__しています。
つまり、サーバまでL3で接続しているというNW構成です。
この構成で問題になるのは、__Compute Node__内に生成されるインスタンスのネットワークです。
通常L2接続環境であれば、OpenStackのNeutronドキュメントに手順で問題なく構築できます。
同じテナント(同じ仮想ネットワークに所属する)間のインスタンス同士は、
VxLANでカプセリングすることでアンダーレイNWのセグメントが異なっていても通信できます。
ところが、インスタンスから物理サーバと通信しようとした場合に、
仮想ネットワークから外部ネットワークに接続するネットワークノードの構成方法が
通常の方法では行なえません。
以前から稼働しているOpenStackクラスターは、L2ネットワーク上に構築しており
インスタンス自体に直接接続している物理NWのIPアドレスを割り当てることで
Floating IPが必要ないように設定しています。
そのため、インスタンスから物理サーバへの通信にはCompute Nodeから直接通信するため、
Network Nodeを中継するトラフィックが発生せず、ボトルネックになる心配もありません。
この構成と同じように新しいOpenStackクラスターでも構成したいと思っていました。
解決までの流れ
Calicoを試すまで
Calicoについては以前から知っていましたが、どちらかというとKubernetesで利用されることが多いのではないかと
思っていたので、あまり調べていませんでした。
そのため、OpenStackのNeutronだけでできないか試したり、
neutron-dynamic-routingを試したりしていました。
neutron-dynamic-routingは、仮想ネットワーク上のルーターと外部のToRをPeeringする方法で、
これはPeeringするところまでは確認できましたが
意図した挙動が得られないことや運用する上での課題が多くあったため途中で諦めました。
Calicoを試し始めたが…
だいぶ遠回りして、ようやくCalicoを試すことになりましたが、
直前まで試していたOpenStack環境で初期化もせず手を加えて
対応しようとしていたことが災いし、なかなかうまく行かず…。
インスタンスすら起動できないエラーに悩まされていました。
結局、どうやっても解決できないことから検証中のOpenStack環境を再構築することに。
(MAASを利用しているので物理サーバの初期化は簡単)
そして1からOpenStackをセットアップして、Calicoのドキュメントのある通りにCalicoをセットアップ。
Compute Node上で__FRRを動かしている__ため__BIRDは使わない__方針で、
セットアップを進めましたが、思っていた以上に簡単にセットアップは完了しました。
悩まされていたエラーもでなくなり、インスタンスも無事に起動できるようになりました。
インスタンスのIPが外部に広報されない…
ところがセットアップは問題なく完了し、インスタンスも無事に起動…までは良かったものの、
インスタンスに払い出されているIPアドレスが外部に広報されないという現象に。
ただCompute Nodeでneutron-calicoはインスタンスに払い出されているIPをちゃんと処理していること、
インスタンスをホストしているCompute Node内ではインスタンスに通信が可能なことから
FRRの設定が足りていないのではと思い調査。
すると、Calicoが登録しているインスタンスに対するルーティング情報は、
ComputeNode上のルーティングテーブルに__kernel route__として設定されていることがわかり、
FRR側で以下の設定を追加することで対処。
redistribute kernel
これで、インスタンスの作成、削除時にneutron-calicoがインスタンスの経路情報変更した際も
FRR側で外部に広報できるようになりました。
無事に構築完了
実はこの構築が完了したのは、つい先日の話。
なかなか情報が得られない部分だったり、挙動を確認しながらの調査とか
謎のエラーに悩まされたりと、色んな所で時間を取られ最終的な環境ができるまで相当時間をかけてしまいました。
とはいえ、当初予想していたよりも簡単に構築でき、
更にはネットワークノードを使わない構成にできたことで可用性もだいぶ高めることができました。
以前から稼働している環境ではVxLANを使用していますが、
こちらはVxLANも使わずに構築しているので、不要なオーバーヘッドもなくなりました。
終わりに
アドベントカレンダー用にサラッと書きましたが、この組み合わせの話ってあまり調べても出てこないので、
詳しい内容はいずれ時間をとってMicroAd Developpers Blogでブログ記事にしたいと思います。
(こんな中身の薄いQiita記事をアドベントカレンダーの記事としてポストして怒られないかだけが心配です)