【OpenStackチャレンジ】 第3回 OpenDaylight(Lithium)との連携に挑戦!
2015.12. 4
久々の【OpenStackチャレンジ】となりました。過去2回、当時最新版であったKiloのインストールや各コンポーネントの紹介をしてきましたが、そろそろOpenStackを実際に使ってみたいところです。そんな中、OpenStackとOpenDaylight(Lithium)の連携というトピックを発見。さっそく挑戦することにしました!
OpenDaylightの3rdリリースであるLithiumについては以前ご紹介しましたが、特色の1つとしてOpenStackとの連携に秀でていることが挙げられます。ネットワークを司るNeutronにより両者を繋ぎ、OpenDaylight(Lithium)をOpenStackの一部として使用するイメージですね。
また、今回のインストール環境としては、これまでパターン化してきたVirtualBoxではなく、ConoHaを使用しています。ConoHaはGMOインターネット社により提供されているパブリッククラウドの事ですが、実際に以下の様な仕様の仮想サーバを作成してみました。
-OS:CentOS(バージョン7.1)
-メモリ:8GB
このConoHaについては、実際にプライベートクラウドを構築する手法も含め、近々別記事として詳しくご紹介します。とても簡単かつ安価に運用する事ができ、今後も重宝できそうです。皆さんも、楽しみにしていて下さいね。
では、ConoHa上でコンソールを開き、まずは事前準備としてNetwork Managerを無効化しておきます。
# systemctl stop NetworkManager
# systemctl disable NetworkManager
OSをアップデートし、OpenStackをインストールしていきます。各コマンドの出力結果の最後に「Complete!」と表示されれば成功しています。(因みに今回はOpenStackのバージョンをJunoに指定の上、インストールを進めます)
# yum update -y
# yum -y install https://repos.fedorapeople.org/repos/openstack/openstack-juno/rdo-release-juno-1.noarch.rpm
OpenStackのインストール方法は複数あるのですが、今回はPackstackというツールを使用します。以下コマンドでPackstackのインストーラーを入手できます。
# yum -y install openstack-packstack
その上で、カスタマイズをせずオールインワンでインストールを行いました。時間はそこまでかからず、平均して20分程だったと思います。
# packstack --allinone --provision-demo=n --provision-all-in-one-ovs-bridge=n
しかし、途中で以下の様なエラーが検出されてしまう事がありました。
ERROR : Error appeared during Puppet run: 133.130.110.72_prescript.pp
Error : Could not find data item DEFAULT_EXEC_TIMEOUT in any Hiera data file and no default supplied at /var/tmp/packstack/4707e704158e40579e6e690ed58c7a70/manifests/133.130.110.72_prescript.pp:1 on node 133-130-110-72
2015年11月27日にRedHat Enterprise Linux 7.2がリリースされましたが、これに伴いEPELレポジトリ内のhieraのバージョンも上がりました。どうやらその影響により、Packstackが正常に動作しなかった(※)様です。以下手順に従いhieraのバージョンをダウングレードさせましょう。結果、無事にPackstackでOpenStackをインストールできます。(※このhieraバグは12/4時点で既に修正済みですが、ご参考までに共有します)
(1)まずhieraのバージョンを確認し、3.0.X以上であった場合は削除をして下さい。この際にpuppetも同時に削除されます。
# rpm -qa | grep hiera
# yum erase hiera
(2)続いてhieraの1.3.4、その後puppetをインストールし直します。
# yum install -y https://yum.puppetlabs.com/el/7/products/x86_64/.noarch.rpm
(3)hieraの更新がされない様、/etc/yum.repos.d/epel.repoに以下を追記します。
[epel]
exclude=hiera*h ←追記
(4)古いyamlファイルを削除し、Packstackを再度実行すればOKです。
# rm /etc/puppet/hiera.yaml
# packstack --allinone --provision-demo=n --provision-all-in-one-ovs-bridge=n
続いて、OpenDaylight(Lithium)を用意していきます。予め、wgetとunzipのパッケージをインストールしておいて下さい。(以下図の通り、既に存在しているかもしれません)
# yum install wget unzip
最新版のLithiumをソースコードからダウンロードし、その後解凍します。(12/4現在、Lithiumの最新版はSR3ですが、以前の記事に合わせSR1を使用することにしました)
# wget https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.3.1-Lithium-SR1/distribution-karaf-0.3.1-Lithium-SR1.zip
# unzip distribution-karaf-0.3.1-Lithium-SR1.zip
OpenStackとの競合を防ぐために、ファイルetc/jetty.xmlを開き、REST APIのTCPポート番号を既存の8080から8910に変更します。
# cd distribution-karaf-0.3.1-Lithium-SR1/
# vi etc/jetty.xml
ここまで来たら、いざODLを起動!といきたいのですが、Javaがないためコマンドが打てません(OpenDaylightはJavaで記述されていましたね)。インストールしておきましょう。
# yum install java-1.7.0-openjdk.x86_64
パスを設定するために、javaがインストールされたディレクトリを確認します。
# ls /usr/lib/jvm
確認したディレクトリに従って/root/.bashrcを編集し、JAVA_HOMEとCentOSへのPATHを設定しておきます。
# vim /root/.bashrc
export JAVA_HOME="/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.1.2.el7_1.x86_64/jre"
export PATH=$PATH:$JAVA_HOME/bin
設定した経路をアクティブにした上でOpenDaylight(Lithium)を起動すると、お馴染みのロゴが無事出力されました!
# source /root/.bashrc
# ./bin/karaf
さあ、ここからは両者の連携に進んでいきます。OpenDaylight(Lithium)にはそのためのfeatureが入っていませんので、追加をしておきます。
opendaylight-user@root>feature:install odl-vtn-manager-neutron
別で端末を起動し、念の為に6633、6653、6640、8910の各ポートがLISTEN状態(接続を受け付けられる状態)であることを確認します。
# netstat -tnupl
因みに、各ポートの役割は以下の通りです。
6633/6653=OpenFlow
6640=Open vSwitch(Openflow Manager)
Port 8910=Neutron requests
ここから先は、先程開いた別端末での作業が続きます。OpenStackをCentOS(ConoHa内)で再構築するため、まずはOpen vSwitchの設定を初期化させます。
# systemctl stop neutron-openvswitch-agent
# systemctl disable neutron-openvswitch-agent
# systemctl stop openvswitch
# rm -rf /var/log/openvswitch/*
# rm -rf /etc/openvswitch/conf.db
# systemctl start openvswitch
# ovs-vsctl show
OpenStack Neutronの停止をします。
# systemctl stop neutron-server
以下コマンドをひとつずつ実行してNeutronの設定を変更し、OpenStackをCentOS内で再構築します。
# crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers opendaylight
# crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types local
# crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers local
# crudini --set /etc/neutron/dhcp_agent.ini DEFAULT ovs_use_veth True
Neutronからリクエストを送信するために、以下設定をOpenStack内に加えます。
#cat <<EOT | sudo tee -a /etc/neutron/plugins/ml2/ml2_conf.ini > /dev/null
[ml2_odl]
password = admin
username = admin
url = http://127.0.0.1:8910/controller/nb/v2/neutron
EOT
# ls /etc/neutron/plugins/ml2/ml2_conf.ini
# sudo mysql -e "drop database if exists neutron_ml2;"
# sudo mysql -e "create database neutron_ml2 character set utf8;"
# sudo mysql -e "grant all on neutron_ml2.* to 'neutron'@'%';"
# sudo neutron-db-manage --config-file /usr/share/neutron/neutron-dist.conf --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini upgrade head
NeutronとDHCP Agentをそれぞれ再起動します。
# sudo systemctl start neutron-server
# systemctl restart neutron-dhcp-agent.service
Open vSwitchを設定し、Open vSwitch(Lithium)からOpenStackに接続します。その後、OpenDaylightとOpenStackの間にブリッジ(bridge br-int)が作成されているか、確認してみましょう。以下の様に出力されるはずです。
# ovs-vsctl set-manager tcp:127.0.0.1:6640
# sudo ovs-vsctl show
Open vSwitchに対してフローエントリの設定を行い、Table-miss(優先度が最低で、全パケットにマッチするエントリ)が生じた際に、パケットをコントローラへ転送する様にしておきます。
# ovs-ofctl --protocols=OpenFlow13 add-flow br-int priority=0,actions=output:CONTROLLER
それでは、WEB GUI上でOpenStackにアクセスしてみましょう!ブラウザを開き、http://〈コントローラのIPアドレス〉/dashboard/にアクセスします。デフォルトのユーザ名はadmin、パスワードは/root/keystonerc_admin内に記述されているので、各自でご確認をお願いします。
●インスタンスイメージの作成
では、GUI上で新規のインスタンスイメージを作成していきます。左部のパネルから「イメージ」を選択し、さらに右上の「+ イメージの作成」へと進みます。
インスタンスイメージの作成画面が表示されます。以下の様に入力して下さい。
-[名前]:好きな名称を入れて下さい。
-[イメージの場所]:http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
-[形式]:QCOW2 - QEMU エミュレーター
因みに参照するイメージについては、予めダウンロードの上、[イメージソース]に参照させることでも可能です。そのまま下部「イメージの作成」へと進むと、作成したものが表示されました。
●ネットワークの作成
では、次に新規のネットワークを作成していきましょう。インスタンスイメージを作成したのと同じ要領で、左部のパネルから「プロジェクト」>「ネットワーク」>「ネットワーク」へと進み、さらに右上の「+ ネットワークの作成」を選択します。
ネットワークの作成画面が表示されるので、[名前]に好きな名称を入力し、次に進んで下さい。
入力項目が続きます。以下入力に加え、「ゲートウェイなし」にチェックを入れるのを忘れない様に気を付けて下さい。
-[サブネット名]:好きな名称を入れて下さい。
-[ネットワークアドレス]:適当な値を入れて下さい。
[IPアドレス割り当てプール]に先程のネットワークアドレスと紐付けて適当な値を入れて下さい。「作成」を選択すると、新規のネットワークが表示されました。
●インスタンスの作成
最後に、VMインスタンスを作成します。左部パネルから「プロジェクト」>「コンピュート」>「インスタンス」へと進み、「インスタンスの起動」を選択します。
「詳細」タブでは以下の様に入力を進めて下さい。
-[インスタンス名]:好きな名称を入れて下さい。
-[インスタンス数]:相互に通信をするので、2つ以上を作成します。
-[インスタンスのブートソース]:イメージから起動
-[イメージ名]:先程作成したインスタンスイメージ名
次に「ネットワーク」タブへ移動し、念のため先程作成されたネットワークが選択されていることを確認して下さい。
インスタンス内に作成したVMを選択し、コンソールを開きます。ログインIDに「cirros」、パスワードに「cubswin:)」と入力しますが、OpenStackは英語キーボードなので、入力キーが異なることにご注意下さい。IMEのキーボード設定をEN(英語)に変更し、":"はshift+れ、")"はshift+0と入力します。
念のため、それぞれのVMでコンソールを開き、情報を確認しておきます。
# ifconfig
両者間でping疎通をし、Open vSwitchのフローエントリを確認すると、フローが確認できました!送り主と宛先のMACアドレスも、インスタンス内に作成したVMと一致しています。
# ovs-ofctl dump-flows br-int --protocols=OpenFlow13
少し長い手順となりましたが、無事に成功することができました。OpenStack、OpenDaylight(Lithium)はこれまで別個に扱ってきましたが、1つひとつ苦労して習得した技術が繋がれていくと、感慨深いものがありますね。
少しずつ蓄積してきた知識や技術を目的に合わせて組み合わせる様な取組みを、このブログでももっと発信できればと思います。
今回も最後までお付き合いを頂き、ありがとうございました。
文:河合 紀彦
OpenDaylightと同じカテゴリーの記事
- 【OpenStackチャレンジ】 第3回 OpenDaylight(Lithium)との連携に挑戦!
- 【SDNチャレンジ】 第23回 OpenDaylightユーザ会に参加しました/Lithiumインストール編
- 【SDNチャレンジ】 第13回 Vyattaコントローラ REST API編
- 【SDNチャレンジ】 第12回 Vyattaコントローラ動作編
- 【SDNチャレンジ】 第11回 OpenDaylight動作編②
OpenStackと同じカテゴリーの記事
- 【OSC2017 Tokyo/Spring】OpenStackを宇宙で!?
- 【OpenStackチャレンジ】 第29回 Ocata紹介編
- 【OSSチャレンジ】 第1回 Bacula紹介:前編
- 【OSC2016 Tokyo/Fall】VRとOpenStackを連携
- 【OpenStackチャレンジ】 第28回 Stackalytics登録編
技術関連と同じカテゴリーの記事
- 【次世代通信技術】 第1回 5G入門編
- QNAP紹介(Dockerコンテナ&OpenStack Swift連携)
- 【OpenStackチャレンジ】 第14回 Keystone環境構築編
- 【OSC2016】第2回Let'sChat Hubot編
- 【OpenStackチャレンジ】 第5回 Ceilometerについて知ろう!