どうもです。インフラグループ pi★shiです。
先日1年ぶりに開催しましたエンジニア開発合宿。
今回も1泊2日でホテルに缶詰で開発してきました。参加エンジニアは20名ほど。
今回わたくしが手がけたテーマは
「OpenDaylight(Hydrogen)を導入して検証目的とした仮想NW環境を構築」
です。
<Hydrogenの詳細はコチラ>
OpenDaylightの環境を構築し、OSSコントローラーとして「何が出来るか」「どこまで出来るか」色々検証してきました。
◆環境はコチラ
◆手順はコチラ
ソース入手
毎度おなじみ環境構築。今回はVMware上にインスタンス作りたかったのとちょうどOVAファイルが転がっていたのでそれを利用してインストールしてみました。
<OVAファイルはコチラからGet>
なんでもVMwareから読み込むためには一手間掛ける必要があるらしい。 該当ページにも明記されてますね。
remove this line from ovf fle: <vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
OVAファイル修正
・適当なサーバにOVAファイルをGetして解凍
# wget https://wiki.opendaylight.org/images/HostedFiles/odl_test_server_2.ova # file odl_test_server_2.ova odl_test_server_2.ova: POSIX tar archive (GNU) # tar xvf odl_test_server_2.ova odl-test-server-2.ovf odl-test-server-2-disk1.vmdk ⇒2つのファイルに解凍
・解凍して出てきたOVFファイルから指定の行削除(viで十分)
# vi odl-test-server-2.ovf ⇒<vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType> の行を削除して上書き保存。
・元のOVAファイルに圧縮
# tar cvf odl_test_server_2.ova odl-test-server-2.ovf odl-test-server-2-disk1.vmdk
インストール
vSphere Client上でファイル⇒OVFテンプレートのデプロイで該当OVAファイル指定してインスタンス作成。
あっという間に出来ます。お手軽。さらに全エディション入ってます。無駄といえば無駄。。
今回はbaseを利用します。ちなみにOSはUbuntu 13.04 server。メモリは4GB
CPUは勝手に4コアも割り当てられます。無駄(ry
OSへログイン
初期ID/PW:mininet/mininet
※以降rootユーザーで作業してます(Ubuntuの精神無視)
OpenDaylight起動
# cd /home/mininet/controller-base/opendaylight/ # ./run.sh
ちなみにバックグラウンドで起動させるには"./run.sh &”ではなく”./run.sh -start”で
GUI管理画面アクセス
ブラウザで http://【IPアドレス】:8080/
初期ID/PW:admin/admin
初期画面はこんなカンジ。
現時点では管理出来るデバイス等一切表示されません。
続けて仮想試験環境の構築です。Hydrogenに一緒に入っているmininetを利用しました。
<mininetの詳細はコチラ>
このmininet、仮想ホスト、仮想スイッチ、仮想ネットワークを自動で構成してくれる機能を持った優良ツールです。
ちなみに本体はPythonで書かれてます。
mininet起動
# mn
これだけ。
たったこれだけでデフォルトでホスト×2、スイッチ×1の仮想環境が立ち上がります。
ただ、このままだとmininetのデフォルトコントローラー(NOX)が立ち上がってしまうので、コントローラーをOpneDaylightに指定してあげる必要があります。
mininetをコントローラ指定して起動
# mn --controller remote,ip=127.0.0.1,port=6633
OpenDayllightを予め起動しておく必要があります。
Openflow系のデフォルトポートはこの時点では6633。
最近は6653になりつつあります(最新verのTremaとかは6653)
この時点でOpenDaylightのGUI上にデバイスが表示されます。でもこの時点ではスイッチが1台のみ。
ホストを表示させるにはFlowを発生させてあげる必要があります。
mininet上でFLOW発生
mininet> pingall *** Ping: testing ping reachability h1 -> h2 h2 -> h1 *** Results: 0% dropped (2/2 received)
これでGUI上にホスト×2とスイッチ×1が表示されます。
mininet上でトポロジ確認
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo: s1-eth1:h1-eth0 s1-eth2:h2-eth0
c0
ちなみにmininetの停止は”mn -c”です。
mininetのスイッチを増やしてみる
いろいろ方法はあります。1つ目はテンプレートを読み込んであげる方法。
標準テンプレートは下記。
~/mininet/custom/topo-2sw-2host.py
ホスト×2、スイッチ×2が直列で接続されているトポロジになります。これを読み込みます。
# mn --controller remote,ip=127.0.0.1,port=6633 --custom /home/mininet/mininet/custom/topo-2sw-2host.py --topo mytopo
2つ目はもっと手軽な方法です。ツリー構造を指定してあげる方法
# mn --controller remote,ip=127.0.0.1,port=6633 --topo tree,2
上記だと2階層でホスト4台、スイッチ3台となります。
# mn --controller remote,ip=127.0.0.1,port=6633 --topo tree,3
上記だと3階層でホスト8台、スイッチ7台となります。
今回はこの3階層環境でOpenDaylight検証を実施することにしました。
OpenDaylightコントローラー(GUI上)でFlow生成
試しにh5(10.0.0.5)→ h6(10.0.0.6)のパケットをDROPさせるFlowを生成してSW6にインストールしてみます。
事前確認
mininet> h5 ping h6 PING 10.0.0.6 (10.0.0.6) 56(84) bytes of data. 64 bytes from 10.0.0.6: icmp_req=1 ttl=64 time=2.79 ms 64 bytes from 10.0.0.6: icmp_req=2 ttl=64 time=0.057 ms 64 bytes from 10.0.0.6: icmp_req=3 ttl=64 time=0.040 ms 64 bytes from 10.0.0.6: icmp_req=4 ttl=64 time=0.048 ms 64 bytes from 10.0.0.6: icmp_req=5 ttl=64 time=0.051 ms
FLOW生成
”Flows”タブを選択して”Add Flow Entry”をクリックします。
Name、Node(SW6)、InputPort(eth1)を設定して下へ。
Layer3はSource IP Address(h5:10.0.0.5)、Destination IP Address(h6:10.0.0.6)を入力して下へ。
ActionをDROPにします。
Save Flowで保存できます。反映させる場合はInstall Flowで
DROP確認
mininet> h5 ping h6 PING 10.0.0.6 (10.0.0.6) 56(84) bytes of data. --- 10.0.0.6 ping statistics ---
実際にSW6でDROPしているか確認するには”Troubleshoot”内の対象ノードの”Flows”を選択します。
Flow Detailsに統計情報が出てくるの確認すると、指定したFLOWでパケットがDROPしている事がわかります。
他にもSRC・DSTのIP/ポートを変換させるものもありますが、デフォルトで実施できるものは現時点では限られてます。
コントローラー側よりもむしろスイッチ側の(mininetで動作する仮想スイッチはOpenvSwitch)実装に依存しているかなぁと。
OpenDaylightにいくつかFLOW作成APIが準備されてますが、コントローラーにAPIを追加する作業が必要だったり、まだまだ実用化に向けたハードルは多いなぁという感想でした。 まだまだ試せる事も多そうだし、バージョンアップも期待出来そうですので数年はワクワクしながらこの技術と付き合って行きたいと思います。