IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

クラウド時代のオープンソース実践活用

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第51回 OpenStack仮想ネットワークの実装方式を再整理 (中井悦司) 2014年9月

はじめに

 先日、Midokura社が提供するMidoNetの技術トレーニングを受講する機会がありました。MidoNetは、OpenStack Neutronのプラグインとして、OpenStackから利用可能な仮想ネットワークを構築するソフトウェアです。残念ながらオープンソースではないために、ソースコードを見ることはできませんが、Open vSwitchのカーネルモジュール(フローテーブル)など、標準的な技術要素をうまく組み合わせたアーキテクチャーで、SDN全般の理解を深める上でも有用なトレーニングでした。

 一方、Neutron標準のOpen vSwitch(OVS)プラグインの方でも、Junoリリースに向けて分散ルーター機能などの機能拡張が進んでいます。今回は、改めて、Neutronの機能とその実装方式について解説したいと思います。

Neutronの仮想ネットワークモデルとOVSプラグインの実装

 Neutronは、OpenStackにおける仮想ネットワーク管理の役割を持つコンポーネントです。OpenStackの利用者は、Neutron APIから仮想ルーターや仮想スイッチなどの作成をリクエストすることができます。典型的には、テナントごとに仮想ルーターを設置して、その背後には、各テナントで自由に仮想L2スイッチを接続していきます。さらに最近のリリースでは、ロードバランサーやVPNの接続ポイントなどもAPIからリクエストするだけで用意することが可能になりました。それぞれ、LBaaS(Load Balancer as a Service)やVPNaaS(VPN as a Service)と呼ばれています。

 ただし、Neutronのコントローラーは、これらのAPIを提供するだけで、APIからのリクエストに応じて、実際にこれらの仮想ネットワークを構築するのは、各種プラグインの役割になります。Neutronが標準提供するプラグインの場合は、あえて奇抜な実装はせずに、なるべくLinux標準の機能だけで実装していく傾向があります。これは、さまざまなベンダーや開発者が独自のプラグインを作成する際の参考となる、「サンプル実装」という位置づけでもあるためです。たとえば、それぞれの仮想ネットワークコンポーネントは、次のような技術で作られています。

  • 仮想L2スイッチ:Open vSwitch + VLAN(もしくは、GREトンネル)
  • 仮想ルーター:Linuxのパケット転送機能 + iptablesのNAT機能
  • DHCP:Dnsmasq
  • ロードバランサー:HAproxy

 この場合、個々の仮想コンポーネントがそのままサーバー上に再現されるため、ユーザーが定義する仮想ネットワークが複雑になると、それに応じて、サーバー上の構成も複雑になっていきます。仮想L2スイッチが100個あれば、それに対応するVLANが100個用意されるというわけです。

 特に、現在の実装では、仮想ルーターは、専用のネットワークノード上に集約されるため、仮想ルーターの数が増えるとネットワークノードの性能が問題になるケースもあります。現在、Neutronの開発チームでは、この問題に対応するため、仮想ルーター機能を負荷分散するDVR(Distributed Virtual Router)の実装を進めており、次のJunoリリースで利用可能になると期待されています(*1)。

OpenFlowによる実装アイデア

 先ほど、「Neutronが標準提供するプラグインは、あえて奇抜な実装はしない」と説明しましたが、それでは、「奇抜な実装」にはどのような方法があるのでしょうか? 1つは、OpenFlowを利用した、仮想ネットワークの「エミュレーション方式」です。まずは、図1でOpenFlowを簡単に復習しておきましょう。

fig01

図1 OpenFlowの基本的な仕組み

 OpenFlowに対応したネットワークスイッチは、外部からパケットを受信すると、自身が持つ「フローテーブル」を参照して、そのパケットの処理方法を判別します。フローテーブルは、パケットのマッチング条件と対応するアクションのエントリーを記載した表です。パケットが既存のエントリーにマッチしない場合、スイッチは、外部のコントローラーに処理方法を問い合わせて、コントローラーから受け取った処理方法を新たにフローテーブルに追加します。この時、コントローラーは、パケット単位で、個別に処理方法を判断することが可能です。コントローラーの実体は、普通のサーバー上で稼働するソフトウェアですので、理論的には、どれほど複雑な判断でも行えます。

 これを極限までつきつめると、コントローラー上のソフトウェアだけで、仮想ネットワーク全体をエミュレーションすることも可能です。図2のように、OpenFlowコントローラーの内部に、仮想ネットワーク全体の構成を記録しておき、コンピュートノード上のOpen vSwitchに対しては、仮想マシンからパケットを受け取るごとに、その処理方法をコントローラーに問い合わせるように設定します。

fig02

図2 コントローラーによる仮想ネットワークのエミュレーション

 問い合わせを受けたコントローラーは、パケットが仮想ネットワーク内をどのように進んでいくかを計算して、最終的にこのパケットを受け取る仮想マシンを特定します。そして、Open vSwitchに対しては、最終到達地点の仮想マシンに対して、直接にパケットを転送するように指示を返します。

 つまり、仮想ネットワークの実体は、コントローラー内部にのみ存在しており、物理的には、仮想マシンから仮想マシンへとワンホップでパケットが転送されるというわけです。仮想ネットワーク内部で、NAT変換などの処理が入る場合は、それに応じてパケットの内容を修正した上で転送するように、Open vSwitchに指示を出します。

 なかなか大胆で面白いアイデアですが、どこかに落とし穴はないのでしょうか? ―― この方式の場合、コントローラーの計算量が問題になります。OpenStackのクラウド環境は、膨大な数のコンピュートノードと仮想マシンの利用に耐える必要があります。1台のコントローラーですべてのパケットの動きを計算していては、とても計算速度が追いつきません。つまり、コントローラーがボトルネックになる恐れがあるわけです。

エミュレーションを分散処理で実現

 冒頭で紹介したMidoNetは、実は、コントローラーの計算処理(仮想ネットワークのエミュレーション)を各コンピュートノードのエージェントで処理するという方法で、ボトルネックの問題を解決しています。先ほどのアイデアと比較すると、図3のようになります。

fig03

図3 エージェントによる分散処理

 コンピュートノード上のエージェントは、仮想マシンからのパケットを受け取ると、データベース上の仮想ネットワークの構成を参照して、自分自身でパケットの動きを計算します。パケットの最終到達地点の仮想マシンが決まると、その仮想マシンに向かって、直接にパケットを転送します。

 MidoNetでは、Open vSwitchそのものは使用しませんが、Open vSwitchのカーネルモジュールが提供する「フローテーブル」の機能を借用しています。計算して得られたパケット転送ルールをLinuxカーネル内部のフローテーブルに書き込むことで、実際のパケット転送処理は、Linuxカーネル内部で行われるようにします。SSH通信など、1つの通信セッションに伴うパケットについては、最初のパケットについて計算した結果がフローテーブルに保存されますので、その後のパケットについては、エージェントが再計算することはありません。フローテーブルのエントリーにしたがって、Linuxカーネルが自動的に目的の仮想マシンまでパケットを転送してくれます。

 このように、各コンピュートノードのエージェントだけで計算処理が完結するため、コンピュートノードがどれだけ増えても、それぞれのエージェントの計算量が爆発的に増えることはありません。それぞれ、自身が稼働するコンピュートノードで発生するパケットの計算だけを担当すればよいことになります。フローテーブルの具体的な内容や外部ネットワークと通信する場合の処理など、より詳細な部分については、筆者の公開資料を参考にしてください(*2)。

 ちなみに、MidoNetの興味深い点として、仮想ネットワークの構成情報を保存する構成データベースとして、オープンソースのZooKeeperを利用しているという点があります。ZooKeeperは、分散処理をコーディネーションするマネージャー機能を持っており、仮想ネットワークの構成変更をエージェントに通知するなどの役割を担っています。

 それぞれのエージェントが独立に動作するとはいえ、場合によっては、エージェント間での連携が必要なタイミングもあるはずです。多数のエージェントを並列動作させながら、システム全体としての整合的を保つのが分散アーキテクチャーを実装する上での最大の難関です。MidoNetがどのような仕組みでこれを実現しているのか ―― さすがにこれは、ソースコードを見ないと分からなさそうです(残念!)。

次回予告

 ここ数回、OpenStackに関係する話題が続いていますが、世の中のOpenStackブームはまだまだ終わる気配がありません。今週もOpenStackに関連する複数のセミナーでの講演が予定されています。次回もまた、これらのセミナーからの話題をお届けしたいと思います。

参考資料

(*1) 「Neutron/DVR/HowTo

(*2) 「完全分散エッジ処理で実現するNeutron仮想ネットワーク

 

++ CTC教育サービスから一言 ++
このコラムでLinuxや周辺技術の技術概要や面白さが理解できたのではないかと思います。興味と面白さを仕事に変えるには、チューニングやトラブルシューティングの方法を実機を使用して多角的に学ぶことが有効であると考えます。CTC教育サービスでは、Linuxに関する実践力を鍛えられるコースを多数提供しています。興味がある方は以下のページもご覧ください。
 CTC教育サービス Linuxのページ
 http://www.school.ctc-g.co.jp/linux/
 

Linux研修トレーニングならCTC教育サービス


 

筆者書籍紹介

Software Design plusシリーズ
「独習Linux専科」サーバ構築/運用/管理
  ――あなたに伝えたい技と知恵と鉄則

本物の基礎を学ぶ!新定番のLinux独習書

中井悦司 著
B5変形判/384ページ
定価3,129円(本体2,980円)
ISBN 978-4-7741-5937-9
詳しくはこちら(出版社WEBサイト)
「独習Linux専科」サーバ構築/運用/管理

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes