OpenStack with OpenDaylight (手動構築編)

2016年4月14日(木)
安座間 勇二(あざま ゆうじ)

前回は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のサンプルをダウンロードしてください。

https://github.com/YujiAzama/opendaylight-openstack-integration/blob/master/externalodl/multi-node/control/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のサンプルをダウンロードします。

https://github.com/YujiAzama/opendaylight-openstack-integration/blob/master/externalodl/multi-node/compute/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サーバはレスポンスを返しているかを確認して下さい。

tcpdump

例として、コンピュートノードでインスタンスの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をベースにすると良いでしょう。

https://github.com/YujiAzama/opendaylight-openstack-integration/tree/master/externalodl/single-node/local.conf

今回は、OpenDaylightの手動構築に挑戦しました。次回はODLのRESTCONFと呼ばれるNorthbound APIについて触れてみたいと思います。

著者
安座間 勇二(あざま ゆうじ)
NECソリューションイノベータ株式会社
1991年、沖縄県生まれ。2014年の入社以来、ソフトウェアエンジニアとしてOpenStackでのSFC(Service Function Chaining)やOpenDaylightを使ったSDN/NFVを中心とした開発や検証などに携わる。OpenStack Neutronを中心にコントリビューションしており、OpenStack Summit Tokyo 2015においてSFCのR&Dについて発表。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています