Tech Sketch Bucket of Technical Chips by TIS Inc.

MidoNetで試すKuryr - Docker remote driver for OpenStack Neutron (2)

Pocket

前回の記事では、Kuryrがどういったものであり、何を実現するものかをご紹介しました。今回は、現時点で実際にKuryrとの連携動作が確認されているMidoNetとOpenStackを連携し、Kuryrを動かしてみるところまでを見てみます。

今回の記事の内容

今回の記事の全体手順は、必要なソフトウェアを全て1からインストールするため若干長めとなっていますが、大きく以下のようになっています。

  1. OpenStackのインストール
  2. MidoNetのインストール
  3. MidoNet Neutron Pluginのインストール
  4. Dockerのインストール
  5. OpenStack、MidoNetのネットワーク設定
  6. Kuryrの動作確認
    1. Kuryrでネットワークを作成
    2. 同一ネットワークにコンテナとVMを起動し、疎通確認
    3. コンテナから外部ネットワークへの疎通確認
    4. 外部ネットワークからコンテナへの疎通確認

前提

本記事は、OpenStack(特にNeutron)、およびDockerのネットワーキングについて、ある程度動作や原理等を理解していることを前提とした記述になっており、キーワードが説明なく出現する場合があります。

MidoNetのバージョンアップ情報

各種ソフトウェアのインストールに入る前に、前回のMidoNetの記事からの、MidoNetのバージョンアップについて見てみます。

2015年10月末に開催されたOpenStackSummitに合わせる形で、ミドクラ社によりMido Day(MidoNet Mini Summit)が開催され、MidoNet v5.0が発表されました。これによって、現在インストールできるMidoNetは以前のMidoNetに関する記事の執筆時よりも新しくなっており、当時の手順から変更があったものもあるため、まずはこの情報について、いくつかピックアップして御紹介します。

MidoNet Clusterの登場

MidoNet v5.0では、新たにMidoNet Clusterと呼ばれる、複数の管理サービスを提供するノードが登場しました。例えばMidoNetのblogに記載されているように、MidoNet REST APIやVXLan Gatewayといった、Midolman(MidoNet Agent)と同一ノードに存在する必要がなかった制御機能が、MidoNet Clusterに切り出される形で移動しています。

これによって、内部的なアーキテクチャの複雑さを無くすと同時に、今まで別途存在したサーブレットコンテナ(Tomcat)などへの外部依存をなくし、インストールも簡略化されています。将来的にはZookeeperも内部サービスとして搭載する予定のようです。

MidolmanのJava8への対応

以前はMidolmanのインストール時にはJava7を利用していましたが、現在は仮想ネットワーク構成情報を保持するNSDB(Network State Database)を構成するミドルウェアの一部にJava7が必要である以外は、Java8で動作するようになりました。

ProviderRouterからEdgeRouterへ

以前のMidoNetはOpenStackと連携させた場合、外部ネットワークをNeutronで作成すると、MidoNet Provider Routerという名称の仮想ルータがPrivateCloud内外の境界点のルータとして暗黙的に作成されていました。

MidoNet v5.0からは、この暗黙的なProviderRouterは作成されなくなり、必要に応じてEdgeRouterとして作成するようになりました。これによってテナントルータから外部ネットワークと直接接続するといったことも可能になり、ネットワークトポロジの構成をより柔軟に行うことができるようになったようです。

今回の動作確認のためのホスト環境構成

ここまででMidoNetの変更点を簡単に把握しましたので、それらがインストールされる今回のホスト構成の説明に移ります。

今回も構成の簡略化のために出来るだけ数を減らし、NSDBホストを1台、MidoNet Clusterホストを1台、ハイパーバイザホストを1台、Dockerホストを1台準備し、ハイパーバイザホスト上に構築したVMと、Dockerホストで起動したコンテナを同一の仮想レイヤ2ネットワークに所属させる構成にしてみます。実際にMidoNetを利用する場合は、NSDBやGatewayの冗長性などを考慮した設計を行ってください。

それぞれのホストの詳細は以下のとおりとします。

ホスト 用途 OpenStack(kilo)コンポーネント MidoNetコンポーネント OS メモリ IP
controller 管理ホスト ・Keystone
・Cinder
・Horizon
・Neutron
・Nova
・MidoNet Cluster
・MidoNet CLI
CentOS7 4GB 10.148.194.25
nsdb NSDBホスト なし ・Zookeeper
・Cassandra
CentOS7 8GB 10.148.194.32
compute1 ハイパーバイザホスト ・Nova
・Midolman CentOS7 8GB 10.148.194.45
gateway ゲートウェイホスト ・Neutron ・Midolman CentOS7 8GB 10.148.194.42
docker Dockerホスト ・Docker 1.9以上
・Midolman CentOS7 (Kernel 3.16以上) 8GB 10.148.194.50


ネットワークに関しても、簡略化のため、OpenStackのコンポーネント間およびMidoNetのコンポーネント間が通信する管理ネットワークと、ハイパーバイザホスト上のVMとDockerコンテナが通信するためのユーザネットワークは分離せず、1つだけで実施しています。また、外部ネットワークのルータはNetwork Namespaceで代替し、テナントルータから直接外部ネットワークに接続する形とします。

図にすると、以下のような構成となります。


kuryr01

OpenStackのインストール

今回はRDOのOpenStackインストーラであるpackstack (kilo)を利用します。OpenStack kiloをpackstackでインストールする手順は数多く公開されているため、ここでは簡単に流れを記述します。 なお、今回もトラブルを極力減らすためにfirewalldやSELinuxを無効化して試します。セキュリティレベルが低下しますので、外部から接続できないネットワークで試す事を推奨します。

  1. 全ホスト共通
    1. firewalld(iptables)、SELinuxの無効化
    2. yum updateの実行
  2. 管理ホスト
    1. yumリポジトリの設定
    2. packstackのインストール
    3. answerfileの生成と編集
    4. packstackの実行

全ホスト共通の作業は以前掲載したMidoNetの記事の事前準備に従って実施済みであるとし、管理ホストにてanswerfileの生成までを行います。

管理ホスト

yumリポジトリの設定

packstackのインストールのため、EPEL、RDOリポジトリの登録を行い、yum updateを実行します。

packstackのインストール

先程のリポジトリからpackstackがインストールできるようになったため、yumでpackstackをインストールします。

answerfileの編集

packstackのインストール後、answerfileの生成と編集を行います。answerfileは、packstackどのようにOpenStackをインストールを行うかのパラメータを与えるファイルです。

生成されたansewerfileを編集します。編集内容は以下のとおりです。

  • デフォルトパスワードを設定
    • CONFIG_DEFAULT_PASSWORDに任意のパスワードを設定します
  • Swift、Ceilometerは利用しないため、インストールしない
    • CONFIG_SWIFT_INSTALLにnを設定します
    • CONFIG_CEILOMETER_INSTALLにnを設定します
  • ハイパーバイザホストのIPアドレスを設定
    • CONFIG_COMPUTE_HOSTSにcompute1のIPアドレスを設定します
  • ゲートウェイのIPアドレスを設定
    • MidoNetではネットワークノードは必要なく、代わりにゲートウェイノードを構成します
    • CONFIG_NETWORK_HOSTSにgatewayのIPアドレスを設定します
  • Demoテナント、Demoユーザを作成しない
    • CONFIG_PROVISION_DEMOにnを設定します

packstackの実行

answerfileの編集が完了したら、answerfileを指定してpackstackを実行します。

OpenStackのインストールには暫く時間がかかりますので、完了まで待ちます。エラーなく終了すれば、OpenStackのインストールは完了です。

MidoNetのインストール

続いて、こちらのインストールガイドに従い、MidoNetをインストールします。

なお、以前掲載したMidoNetの記事でもインストール手順を記載していますが、 先述したとおり、MidoNetのバージョンがv5.0になって幾つか相違点があるため、以下に改めて流れを記載します。

  1. NSDBホスト
    1. yumリポジトリの設定
    2. OpenJDK 1.7のインストール
    3. Apache Zookeeperのインストールと設定
    4. Apache Cassandraのインストールと設定
  2. 管理ホスト
    1. yumリポジトリの設定
    2. MidoNet Clusterのインストールと設定
    3. python-midonet-clientのインストールと設定
  3. ハイパーバイザホスト
    1. yumリポジトリの設定
    2. OpenJDK 1.8のインストール
    3. Midolmanのインストールと設定
  4. Dockerホスト
    1. yumリポジトリの設定
    2. OpenJDK 1.8のインストール
    3. Midolmanのインストールと設定
  5. ゲートウェイホスト
    1. yumリポジトリの設定
    2. OpenJDK 1.8のインストール
    3. Midolmanのインストールと設定
    4. 外部ネットワークのルータ相当を作成 (この操作は直接MidoNetとは関係ありませんが、ここで実施することにします)

NSDBホスト

NSDBのインストールはv5.0になっても以前掲載したMidoNetの記事からさほど変化がないため、「1. NSDB兼APIサーバホスト」の「1. yumリポジトリの設定」、「2. OpenJDK 1.7のインストール」、「3. Apache Zookeeperのインストールと設定」、「4 .Apache Cassandraのインストールと設定」を実施して下さい。ただし、「1. yumリポジトリの設定」では、バージョンがv5になっていますので、以下の内容を設定します。

管理ホスト

yumリポジトリの設定

MidoNet、およびMidoNet Neutron Pluginをインストールするためのyumリポジトリを設定します。

設定が完了したら、パッケージの更新を行います。

MidoNet Clusterのインストールと設定

MidoNet Clusterをインストールします。先述のとおり、管理機能はMidoNet Clusterに移されたため、midonet-apiやtomcatの導入は不要です。

MidoNet Clusterのインストールが完了したら、/etc/midonet/midonet.confにZookeeperを参照する設定を記述します。

次に、mn-confコマンドでMidoNet Clusterに対し、ZookeeperとCassandraの設定を行います。 v5.0からはmn-confでクラスタ内に設定情報を保持するようになったため、Midolmanの設定ファイルであったmidolman.confなども接続先であるZookeeperホストの指定だけが残っており、他には記述しない形となっています。

mn-confコマンド実行時、「Installing config key that was not found in the schema: …」、といった旨のメッセージが表示されますが、値の初回設定時に表示されるメッセージであるため、問題はありません。 また、今回はcassandra.replication_factorは簡略化のため1としてあります。

設定が完了したら、MidoNet Clusterを再起動します。

midonet-cliのインストールと設定

midonet-cliのインストールを行います。

次に、midonet-cliが利用する~/.midonetrcを設定します。 今回はOpenStackと連携するため、Keystoneで認証を行います。また、以前の手順ではMidoNet APIのポートは8081でしたが、v5.0のMidoNet Clusterでは8181に変更されていますので、URLの指定に注意して下さい。

ここまでの設定が完了したら、midonet-cliが実行できますので、動作を確認します。

問題なくmidonet-cliが動作することが確認できました。

ハイパーバイザホスト

yumリポジトリの設定

管理ホスト同様に/etc/yum.repos.d/midonet.repoの編集を行って下さい。

ハイパーバイザに関連する設定

今回はハイパーバイザにKVMを利用しますが、OpenStackとMidoNetを連携し、かつKVMを利用するためには、いくつかハイパーバイザの細かい設定などが必要です。

まず、/etc/libvirt/qemu.confについてuserとgroup指定、およびcgroup_device_aclのコメントアウトを解除し、 cgroup_device_aclに/dev/net/tunを追記します。

設定が完了したら、libvirtdを再起動します。

また、openstack-nova-networkのインストールを行い、一部必要な機能を利用し、openstack-nova-network自体は停止します。同時に、openstack-nova-computeの再起動も必要です。

Midolmanのインストールと設定

続いて、Midolmanのインストールを行います。

インストール完了後、Midolmanの初期設定を行いますが、先述したとおり、midolman.confに記述するのはZookeeperへの接続設定のみです。

次に、Metadata関連の設定を行います。Novaがインスタンスを起動した後、例えばKeyPairの設定やユーザスクリプト(Userdata)の実行のためにMetadataを使用することができますが、 これを有効にするためには、以下の操作を行います。 なお、Midolmanがインストールされたどこか1ノード上で1度だけ実行すれば良く、設定はMidoNet Clusterを通し全体で共有されます。

後ほどMidoNetとOpenStackを連携させる際にOpenvSwitch Pluginを削除し、Open vSwitchを停止しますが、これだけではbr-tunやbr-intが残り、更にデフォルトのVXLanポートも残ってしまいます。このデフォルトのVXLanポートが存在する場合、MidolmanがVXLanポートが作成できず正しく動作しないため、ここでポートを削除しておきます。なお、br-tunやbr-intは残っていても構いませんが、利用しないため、気になる場合は削除しても問題ありません。

デフォルトのVXLanポートを削除したら、Midolmanを起動します。

少し経つとmidonet datapathが出来上がり、Midolmanの起動が完了します。

ゲートウェイホスト

yumリポジトリの設定

管理ホスト同様に/etc/yum.repos.d/midonet.repoの編集を行って下さい。

Midolmanのインストールと設定

ハイパーバイザホスト同様に、Midolmanをインストールし、設定を行って下さい。

外部ネットワークのルータ相当を作成

今回は、外部ネットワークのルータ相当をNetwork Namespace(netns)で作成します。インタフェースのIPアドレスは、203.0.113.1/24とします。

Dockerホスト

yumリポジトリの設定

管理ホスト同様に/etc/yum.repos.d/midonet.repoの編集を行って下さい。

Midolmanのインストールと設定

ハイパーバイザホスト同様に、Midolmanをインストールし、設定を行って下さい。

ここまででMidoNetのインストールは完了です。

OpenStackとMidoNetの連携

ここからは、MidoNetのNeutron Pluginをインストールし、MidoNetをNeutronのバックエンドにしてOpenStackと連携させます。作業の流れは以下のとおりです。

  1. 管理ホスト
    1. MidoNet APIサービス、midonetユーザの作成
    2. MidoNet Neutron Pluginのインストールと設定
  2. ハイパーバイザホスト、Dockerホスト、ゲートウェイホスト
    1. 不要なデフォルトのOpen vSwitch Pluginの削除とOpen vSwitchサービスの停止

管理ホスト

MidoNet APIサービス、midonetユーザの作成

MidoNet APIサービスと、midonetユーザを作成します。

MidoNet Neutron Pluginのインストール

MidoNet Neutron Pluginをインストールします。

Neutronプラグインの変更設定

neutron.confを編集します。v5.0より前のバージョンではcore_pluginにmidonet.neutron.plugin.MidonetPluginV2を設定していましたが、v5.0からはmidonet.neutron.plugin_v2.MidonetPluginV2を設定しますので、注意してください。

設定が終わったら、midonet.iniを配置する/etc/neutron/plugins/midonetディレクトリを作成します。

次に、/etc/neutron/plugins/midonet/midonet.iniを編集します。v5.0より前のバージョンのMidoNet APIではポートは8081でしたが、v5.0からは8181になっていますので、注意してください。

midonet.iniの編集が終わったら、plugin.iniをデフォルトのものからシンボリックリンクでmidonet.iniに置き換えます。

設定ファイルが完了したら、Neutron Databaseのアップデートを行います。

最後に、関連サービスの再起動を実施します。

ハイパーバイザホスト

不要なデフォルトのOpen vSwitch Pluginを削除し、Open vSwitchサービスを停止します。

Gatewayノード

ハイパーバイザホスト同様、Open vSwitch Pluginの削除とOpen vSwitchの停止を行って下さい。

ここまでで、OpenStackとMidoNetの連携設定は完了です。

Dockerのインストール

ここからは、Dockerのインストールを行っていきます。作業の流れは以下のとおりです。

  1. Dockerホスト
    1. Consulのインストールと起動
    2. Dockerのインストールと起動

Dockerホスト

Docker1.9以上を動作させるには、Kernel 3.16以上である必要があります。CentOS7では、公式でインストールできるKernelは現時点で3.10であるため、手動でビルドするなどしてバージョンを上げておきます。

ここでは、Kernel3.16以上が既に稼働している前提で作業を進めます。

Consulのインストールと起動

Dockerでは、デーモン起動時に指定したKeyValue Storeにネットワーク情報を格納する機構をもち、記事執筆時点でこのバックエンドにはetcd、consul、Zookeeperを指定することができます。 Dockerのコンポーネント構成やネットワーキングについては、弊社のエンジニアが執筆したこちらの記事にも詳細が記載されていますので、適宜参照下さい。

まずは、consulをインストールします。

インストールが完了したら、起動してみましょう。今回はクラスタリングを目的にしていないため、bootstrap-expectを1とし、1台構成で起動します。

Dockerのインストールと起動

Dockerには公式に主要ディストリビューション用のパッケージが存在するため、それらを利用して簡単にインストールすることができます。

リポジトリの編集が終わったら、yumコマンドでdocker-engineをインストールします。

先述したとおり、ネットワーク構成を格納するKeyValue Storeを指定するために設定が必要ですが、 上記でインストールしたDockerは設定ファイルを読む処理がないため、処理を追加します。

処理の追加が完了したら、読み込む設定ファイルにconsulの指定などを記述します。

設定が完了したら、Dockerを起動します。

OpenStack、MidoNetのネットワーク設定

ここまででKuryrを除く一通りのソフトウェアのインストールが完了しましたので、NeutronとMidoNetの基本的なネットワーク設定を行います。作業の流れは以下のとおりです。

  1. 管理ホスト
    1. midonet-cliでTunnel-Zoneを作成し、メンバを登録
    2. neutronで外部ネットワークを作成
    3. midonet-cliでneutronの外部ネットワークと物理外部ネットワークをマッピング

Tunnel-Zone作成とメンバを登録

今回はVXLanでTunnel-Zoneを作成し、gateway、compute1、dockerをメンバとして追加します。

外部ネットワークを作成

ext-netという名称の外部ネットワークを作成します。

次に、ext-netにサブネットext-subnetを作成します。今回の外部ネットワークは203.0.113.0/24とします。

外部ネットワークと物理外部ネットワークのマッピング

上記手順で作成した外部ネットワークのGatewayは203.0.113.1ですが、これがゲートウェイホストで作成した外部ネットワークのルータ相当のインタフェースにマッピングされるよう、Bindingを設定します。

具体的な操作としては、neutronで作成したext-netはMidoNetのbridgeとなっているため、このbridgeにportを追加し、そのportとvethのBindingを設定する形になります。

テナントルータの作成

後ほどKuryrで作成したネットワークからこの外部ネットワークに接続しますので、そのためのテナントルータをkuryrtest-rtという名称で作成しておきます。

作成したテナントルータを外部ネットワークに接続しておきます。

ここまで設定したら、状況がわかりやすいようHorizonでネットワークトポロジを確認してみましょう。


kuryr02

Kuryrの動作確認

最後に、Kuryrをインストールし、動作を確認してみます。

Kuryrのインストール

Kuryrのインストールはgithubからcloneして行います。

なお、現行のKuryrをKiloと連携させた場合、kuryr/server.pyのcontrollers.check_for_neutron_ext_support()でExtensionサポートが確認できずエラーが発生しますが、現時点でこのチェックは無くとも動作するため、コメントアウトします。

これでKuryrのインストールは完了です。

Kuryrの動作を確認

Kuryrの起動

それでは、Kuryrを起動してみましょう。Kuryrの動作には認証やテナントに関する環境変数の設定が必要ですので、設定してから起動します。なお、今回はadminテナントで試します。

Kuryrを経由してネットワークを作成

ここまででKuryrを経由してDockerネットワークを作成できるはずですので、testnetという名前のネットワークを作成してみます。

実際にどのようなネットワークができたのか、Horizonで確認してみましょう。上記で出力された、長い名前(7893…)のネットワークが作成されているはずです。このネットワークのサブネットの持つIPアドレスは、今の所10.0.0.0/24となるようです。


kuryr03

コンテナの起動

次に、このネットワークに繋がるコンテナを起動してみます。

IPアドレスに、10.0.0.2/24が割り当たってコンテナが起動しました。

コンテナと同一ネットワークにインスタンスを起動

それでは、このネットワーク内に更にインスタンスを起動してみます。


kuryr04

ネットワークに先ほどの長い名前のものが存在しますので、こちらを指定してインスタンスを起動します。


kuryr05

10.0.0.3/24のIPアドレスを持つインスタンスが起動しました。10.0.0.2/24のコンテナはnovaで管理されておらず、Horizon上では見ることができません。ここまでの操作の結果の全体を図にすると、以下のようになります。


kuryr06

2つのコンテナとインスタンスは同一ネットワークで起動しているため、コンテナとインスタンスの間で疎通が確認できるはずです。実際に試してみましょう。

pingで疎通が確認できました。なお、Kuryrで起動したコンテナにはDefault Security Groupが適用されるようですので、Defaultからルールを全て削除した場合、疎通ができなくなります。

外部ネットワークへ接続

次に、外部ネットワークのルータ相当と疎通ができるかを確認してみましょう。まず、ネットワークが外部ネットワークに出られるようにインタフェースを設定します。

ここまで実施すると、Horizon上では以下のような接続を確認することができます。


kuryr07

外部ネットワークとの接続までの結果の全体を図にすると、以下のようになります。


kuryr08

コンテナから外部ネットワークへの疎通確認

この状態で、コンテナから外部ネットワークのルータ相当にpingを実行してみます。

疎通が確認できました。

外部ネットワークからコンテナへの疎通確認

最後に、コンテナにFloatingIPを割り当て、外部ネットワークから疎通できるかを確認してみます。


kuryr09

コンテナのPortは、Noneという名称でFloatingIPの割当先の中に現れます。FloatingIPを割り当てるまでを行った結果の全体を図にすると、以下のようになります。


kuryr10

それでは、外部ネットワークのルータ相当からコンテナのFloatingIPにpingを実行してみます。

これで、全ての疎通が確認できました。

おわりに

今回の記事では、OpenStackとMidoNetを連携させ、Kuryrを実際に利用してDockerコンテナとNeutronのネットワークをシームレスに接続できる様子を見てみました。 前回の記事で紹介したとおり、Kuryr自体は始まったばかりのプロジェクトですので、コンテナのユースケース増加やOpenStackの発展と共に、今後成長していくものと考えられ、 現実的な活用を目の当たりにする日も遠くないかもしれません。

エンジニア採用中!私たちと一緒に働いてみませんか?