OpenStack with OpenDaylight (手動構築編)
前回はDevStackを使ってOpenDaylight(以降、ODLと省略)やOpenStackの構築を行った上で、連携の仕組みや簡単な使い方について触れました。DevStackという自動構築ツールを使ったので簡単だったと思います。 そこで今回は、DevStackによる構築はOpenStackにとどめ、ODLの手動構築にチャレンジしてみます。
環境・バージョンについて
ノード構成やネットワーク構成などは前回と同じ環境ですが、ODLの構築はDevStackの管理外となります。ODLのバージョンは前回はDevStackのデフォルトである「0.3.5-SNAPSHOT」を使用しましたが、今回はLithiumのリリースである版「0.3.4-Lithium-SR4」を使うことにします。ODLとOpenStack連携の動作に違いはありません。
構築してみよう
全ノード共通の設定
それでは早速構築を始めていきます。先に、全ノードで共通の設定を実施しておきます。
構築を簡単にするために、ファイアーウォールは無効化しておきます。
~$ sudo ufw disable
次にDevStackをダウンロードします。その際、gitコマンドが必要なので入っていなければ必要に応じてインストールしてください。ブランチ名はstable/libertyを指定します。
~$ sudo apt-get install git ~$ git clone --branch stable/liberty https://github.com/openstack-dev/devstack.git ~$ cd devstack/
続いて、コントローラノードの構築に入ります。
コントローラノードの構築
JDKのインストール
ODLはJava言語によって実装されています。そのためJavaの実行環境が必要になりますのでJDK(Java Development Kit)をインストールします。今回インストールするLithiumではJDK 7が必要です。ちなみに、2016年2月にリリースされたバージョンであるBerylliumではJDK 8が必要になります。
~$ sudo apt-get install openjdk-7-jre
OpenDaylightのダウンロード
ODLのパッケージはSonatype NEXUSパッケージリポジトリマネジメントソフトウェアで管理されています。そのリポジトリからLithiumリリースのパッケージをダウンロードし解凍します。
~$ wget https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distribution-karaf/0.3.4-Lithium-SR4/distribution-karaf-0.3.4-Lithium-SR4.zip ~$ unzip -u -o distribution-karaf-0.3.4-Lithium-SR4.zip ~$ cd distribution-karaf-0.3.4-Lithium-SR4/
OpenDaylightを起動する
ODLを起動するには、以下のようにstartスクリプトを実行するだけです。
~/distribution-karaf-0.3.4-Lithium-SR4$ ./bin/start # OpenDaylightを起動する
必要な機能をインストールする
ODLとOpenStackを連携させるには必要なプラグインをインストールしなければなりません。プラグインのインストールはclientスクリプトを使ってOpenDaylight Karaf Shellにログインして行います。以下の様に、odl-ovsdb-openstackとその他の依存関係にあるパッケージをインストールします。
~/distribution-karaf-0.3.4-Lithium-SR4$ ./bin/client -u karaf # OpenDaylight Karaf Shellにログイン client: JAVA_HOME not set; results may vary Logging in as karaf 308 [sshd-SshClient[1c3a0533]-nio2-thread-2] WARN org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier - Server at [/0.0.0.0:8101, DSA, f9:9d:15:00:e5:c9:4f:3f:a4:6f:d3:65:02:3c:b5:e3] presented unverified {} key: {} ________ ________ .__ .__ .__ __ \_____ \ ______ ____ ____ \______ \ _____ ___.__.| | |__| ____ | |___/ |_ / | \\____ \_/ __ \ / \ | | \\__ \< | || | | |/ ___\| | \ __\ / | \ |_> > ___/| | \| ` \/ __ \\___ || |_| / /_/ > Y \ | \_______ / __/ \___ >___| /_______ (____ / ____||____/__\___ /|___| /__| \/|__| \/ \/ \/ \/\/ /_____/ \/ Hit '<tab>' for a list of available commands and '[cmd] --help' for help on a specific command. Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown OpenDaylight. opendaylight-user@root>feature:install odl-restconf-all odl-aaa-authn odl-dlux-core odl-mdsal-apidocs odl-ovsdb-openstack # 機能をインストールする opendaylight-user@root>logout
以上で、ODLの構築は完了です。
ちなみに、実行中のODLを停止させる場合にはstopスクリプトを実行します。
~/distribution-karaf-0.3.4-Lithium-SR4$ ./bin/stop # OpenDaylightを停止する
OpenStackコントローラノードの構築
続いて、OpenStackの構築を行います。以下のURLからlocal.confのサンプルをダウンロードしてください。
ダウンロードしたlocal.confをテキストエディタで開くと以下の様になっています。まず、お使いの環境に合わせてHOST_IPをコントローラノードのIPアドレスに変更してください。
~/devstack$ vim local.conf : # IP Details HOST_IP=192.168.0.10 SERVICE_HOST=$HOST_IP : # Neutron : enable_plugin networking-odl http://git.openstack.org/openstack/networking-odl ${BRANCH_NAME} # OpenDaylight Details ODL_MODE=externalodl ODL_PORT=8181 [[post-config|/etc/neutron/plugins/ml2/ml2_conf.ini]] [ml2_odl] password=admin username=admin url="http://${ODL_MGR_IP}:${ODL_PORT}/controller/nb/v2/neutron"
今回のDevStackでの構築には、ODLに関する設定のポイントが2つあります。1つ目は動作モードをexternalodlとすることです。今回、ODLは手動で構築しましたのでDevStackの管理外とする必要があります。この場合はexternalodlを指定します。2つ目はml2_conf.iniにユーザ名やパスワード、エンドポイントのURLなどのODLの認証情報を追記することです。これらはDevStackが各ノードのブリッジの設定などをするためのAPIリクエストに必要な情報となります。ユーザ名とパスワードに指定している「admin」はODLのデフォルト値なのでODLの構築時に変更していなければ、こちらも変更しないで下さい。
後は、stack.shスクリプトを実行するだけです。以下の様なメッセージが出力されれば終了です。
~/devstack$ ./stack.sh : This is your host IP address: 192.168.0.10 This is your host IPv6 address: ::1 Horizon is now available at http://192.168.0.10/dashboard Keystone is serving at http://192.168.0.10:5000/ The default users are: admin and demo The password: password
以上でコントローラノードの構築は完了です。
コンピュートノードの構築
コンピュートノードの構築は前回の記事とまったく同じになります。下記URLよりlocal.confのサンプルをダウンロードします。
ダウンロードしたlocal.confを開き、HOST_IPをコンピュートノードのIPアドレスへ、SERVICE_HOSTをコントローラノードのIPアドレスへ変更した後、stack.shスクリプトを実行します。以下の様なメッセージが出力されれば終了です。
~/devstack$ ./stack.sh : This is your host IP address: 192.168.0.11 This is your host IPv6 address: ::1 2016-01-13 07:21:51.305 | stack.sh completed in 56 seconds.
以上で、ODLを手動で構築する際の手順は全て終了です。
ODLのダウンロードと起動・停止、プラグインのインストールさえできれば、手動構築の難易度もそれほど高くないことを理解していただけましたでしょうか。ぜひこれを参考にOpenDaylightを使い倒してみてください。
tcpdumpを使ってデバッグするポイント
パケットが正しく流れているかなどを調査する際、tcpdumpコマンドを使う事が多いと思います。ODLとOpenStack連携において、VMの通信がうまくいっていない場合には以下のポイントでtcpdumpを取得すると良いでしょう。
- (1) インスタンスのtapが接続されているbr-intのポート
- インスタンスのポートまでパケットが届いているか確認します。
- (2) , (3) コンピュートノードとコンピュートノードのeth0
- コントローラノードとコンピュートノードのNICがパケットを正しく送受信しているか確認します。ここで問題が発生しているとVxLANも正しくトンネリングされません。
- (4) qdhcpのtapが接続されているbr-intのポート
- DHCPが正しく機能しているか確認します。インスタンスからのリクエストを受けているか、DHCPサーバはレスポンスを返しているかを確認して下さい。
例として、コンピュートノードでインスタンスのtapが接続されているbr-intのポート見る場合、以下の様に実行します。
[コンピュートノード]
~$ sudo ovs-vsctl show 00790da7-431d-430c-b638-9114e2f17552 Manager "tcp:192.168.11.43:6640" is_connected: true Bridge br-int Controller "tcp:192.168.11.43:6653" is_connected: true fail_mode: secure Port br-int Interface br-int type: internal Port "vxlan-192.168.11.43" Interface "vxlan-192.168.11.43" type: vxlan options: {key=flow, local_ip="192.168.11.44", remote_ip="192.168.11.43"} Port "tapeb836a62-e6" Interface "tapeb836a62-e6" # tapが接続しているInterface ovs_version: "2.0.2" ~$ ~$ sudo tcpdump -n -i tapeb836a62-e6 # tapが接続しているInterfaceを指定 tcpdump: WARNING: tapeb836a62-e6: no IPv4 address assigned tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tapeb836a62-e6, link-type EN10MB (Ethernet), capture size 65535 bytes 15:22:01.870876 LLDP, length 97: openflow:11918597943880 15:22:06.871614 LLDP, length 97: openflow:11918597943880 :
(おまけ) シングルノードでの構築
今回はコントローラノードとコンピュートノードの2台の仮想マシンを使ってマルチノードで構築しましたが、シングルノードで構築してみたいという方は以下のURLのlocal.confをベースにすると良いでしょう。
今回は、OpenDaylightの手動構築に挑戦しました。次回はODLのRESTCONFと呼ばれるNorthbound APIについて触れてみたいと思います。