仮想化ovs+ovnのoverlayネットワークを構築し、KVMの仮想マシンとDockerコンテナのトラフィックをBridgeで外部ネットワークに流して使用する場合の設定方法を記載したいと思います。これにより、仮想マシンとコンテナと外部ネットワーク機器が同一VLANで通信可能になります。実用性の観点で冗長化できないため、あまり使えないかもしれませんが、ovnの仕組みを理解する上では活用できるかと思います。2.11.1ベアメタル環境でも同様に設定可能です。「'」が付いている箇所は、主に「'」が付いていない箇所を設定すると自動設定されます。~コマンドのみ~以下のコマンドを投入していきます。やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。ovs+ovnやdocker+consulの設定もそこそこボリュームがあるため、(1)~(7)の辿り着くまでが少々しんどいかもしれません。\/sbin/init2.ovs+ovnのビルドとインストールControllerNode(c76ovn01)にてビルドとインストールを実施します。Dockerもインストールしてしまいます。docker2-2.ComputeNodeComputeNode(c76ovn02&c76ovn03)にてビルドとインストールを実施します。違いは、ovn-central-2.11.1-1.el7.x86_64.rpmが無いだけです。ovn-controller3-4.設定確認102と103が101とESTABとなっていればOKです。192.168.30.103:34252上記がOKな場合、br-intが自動生成され、GeneveによるOverlayのトンネル設定も自動で実施されます。ovs上では以下のようなステータスとなっていればOKです。"2.11.0"3-5.virshによるovsの設定c76ovn02&03にてovsのPortGroup設定を実施しておきます。net-list4.docker+consulのクラスタ設定4-1.Dockerの設定その1Option設定を読込みできるようにします。青文字はコメントアウトしてください。docker4-3.consulのインストールconsulでクラスタを構成します。一度設定をミスると色々やっかいだった*3ので、VMWareなどで各Nodeを動作させている方は、この手順を進める前にスナップショットなりクローンを作成しておいた方が良いと思います。最初に暗号キーを生成しておきます。生成した暗号キーは全Nodeで共通にしますので、任意の1台で生成すればOKです。ここでは例としてc76ovn01にて生成します。keygenaz3EW5ykRod6hBS1FiSFAA==各Nodeごとに設定ファイルを作成します。赤文字の箇所のみ異なっています。false}4-5.consulのサービス化設定consulをサービス化し、自動起動するように設定します。全Nodeで同様の出力となります。コマンドでDockerとconsulが正常に起動していることを確認してください。consul5.(1)~(7)の設定5-1.事前準備ovnのdocker-overlayドライバを各ComputeNodeで起動しておきます。--detach5-2.(1)の設定:DockerOverlaySwitchの作成(1’)は自動生成されていますが、Overlay上では認識されていません。以下のコマンドにより、ovnのNorthboundDBにDockerOverlaySwitchが生成されます。それと同時にDocker上のNWとしても認識されます。c76ovn02もしくはc76ovn03のどちらか一方で設定すればOKです。(b5fb702e948902881b1b933191b9ee83f8dad4eb434a9d27d408d7a2d5fe2aa2)5-3.(2)の設定:br-extの作成br-intに無理やりインターフェースをアタッチしても外部とのBridge接続による疎通はできません。この辺りはNeutronのアーキテクチャに近い感じです。br-intとbr-extをPatch接続させて、外部ネットワークとブリッジ接続します。c76ovn023-5に合わせて300-301をTrunkしていますが、今回の構成であれば301のみでOKです。先にovn-sbctlコマンドでシャーシIDを取得した後に設定を入れます。showの出力例を以下に記載します。赤文字の箇所をl2gateway-chassis=の後に加えます。~]#補足その2設定後、以下のようになっていればOKです。~]#ここまででアップリンクに相当する部分が構築できました。あとは、仮想マシンやコンテナをアタッチしていきます。コンテナは以下のコマンドで作成したDockerネットワークのovsにアタッチさせるだけで自動設定してくれます。ovs一方、KVMの仮想マシンについては、もう一工夫必要になります。5-5.(4)と(5)の設定:KVM仮想マシンのアタッチ先にvirt-installコマンドなどで仮想マシンを起動しておいてください。その際、仮想マシンに使用するインターフェースは3-5で設定したPortGroupのうちvlan301を使用するようにしてください。virt-installはこんな感じです。ポイントは赤文字の箇所です。--arch=x86_64これにより、以下のような設定になります。vlan301がBridgeしている点です。仮想マシンが起動したら以下のコマンドにて、ovn上に登録していきます。SW_NAME、IFACE_ID、MAC_ADDRを取得し、それをNorthboundDBに登録する形となります。ovs」だけ忘れずに設定すれば問題ありません。\/sbin/init構成を確認してみます。show出力例ここでは例としてc76ovn03にて実施します。showだけは02&03の両方で出力させます。show図に起こすとこんな感じになります。最初に載せた2つの図と合わせて観ると、より明確になってくるかと思います。6.補足ComputeNodeを再起動やShutdownしたいときは、以下のようなコマンドで必ずコンテナを終了させた後に、再起動やShutdownしてください。c2というのも、Dockerコンテナのアタッチ時はほぼほぼ自動で設定してくれていましたが、デタッチ時は上記コマンドのように正常にコンテナを終了させないと、NorthboundDB上にゴミが残ります。場合によっては消せなくなるので、何度も繰り返し試したい方は必ずコンテナを終了させるようにしましょう。7.最後に以下のサイトを参考にさせて頂きました。Routerovnは正直取っつきにくいかもしれません。stein以降では、ovnが実装されるようなので、今のうちから、しっかり理解しておくことは大切かなと思います。今回はKVMとDockerでしたが、LXC/LXDでも試してみました。FakeBridgeを使用する点が障壁となり疎通できませんでした。アップリンク側にDPDKも動作させてみたのですが、設定方法は解ったものの、これまた疎通できずで断念しました。Bridgeではなく、PAT+Routingだったら上手くいくような気がしていますが、取り急ぎ、一旦まとめてみようと思い今回の記事を書いた次第です。今回はl2gatewayという方法でBridgeさせましたが、localnetという方法もあります。こちらは、全ComputeNodeにてbr-extを作成した後、以下のコマンドでNorthboundDBに登録すれば設定可能です。network_name=physnet301localnetの場合、冗長化できそうな雰囲気はありますが、L2ループの懸念があるため、あまり推奨されていないようです。いずれにせよ、ovn単体で使うのはあまり現実的ではないと感じたので、やはりopenstackやovirtなどと一緒に使用するのが良いと思います。*1:例外はあります。(1')は自動で設定されますが、その後(1)を手動設定した際に初めて利用可能となる、といったケースがあります。(2)を手動設定した後、(3)を設定しないと、(2’)や(3’)がNorthboundDB上で認識されない、など。*2:ここではUntagやvlan300も作成されていますが、vlan301のみでOKです。他は削除して構いません。*3:私の環境では、正しい設定に直してもエラーが解消されなかったりしました。本編とあまり関係の無いところで時間を取られるのは、しんどいのでスナップショットやクローン化をおススメします。*4:上記(4)と(5)のコマンドは同じですが、それぞれのComputeNodeにて実行するため取得するIDが異なります。月別アーカイブはてなブログをはじめよう!metonymicalさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。