opendaylightをインストールしてFlowを操作してみる

こんにちわ。
書き溜めていたネタがあったので、先ほどZabbixとMySQLのエントリーを書いたばかりですが続けて書きます。

29 sep 2014 付けでopendaylight heliumがリリースされました。先日はopendaylightベースのBrocade vyatta controllerも発表され少しは盛り上がるのかもしれません。

個人的にはコントローラーもいいのですが・・・という感じなので、ビジネスに使わないで欲しいのが本音ではありますが、仕方ないといえば仕方ないですね。opendaylightは以前にhydrogenで使ってみたことがありますので、記憶を呼び起こすためにブログにまとめておきます。

環境

初期セットアップ

  • mininetインストール・起動
  • opendaylightインストール
  • 動作確認
  • flow操作

virtual box上のubuntsuで簡単に試せますし、セットアップして疎通確認をするまでならすぐできます。今回は導入編としてそこまで実施してみます。

mininetインストール

opendaylight(以下、odl)の管理対象として仮想のNWでバイスをmininetで作成します。mininetはコントローラとしてNOX、スイッチとしてopenvswitchを同梱しています。今回はコントローラとしてodlを使用するため、複数のopenvswitchをエミュレートする役目としてmininetを使用します。

インストールはこちらから。 http://mininet.org/download/

gitでcloneをするか、virtual boxのイメージをそのまま使用してください。

今回、イメージを使用しました。コンソールからmininetユーザで以下の通り起動できます。出力を見るとわかりますが、openflow1.3ベースのスイッチが3台、そこに接続されたホストが4台稼働しています。

トポロジーはs1がトップにあるスター型のトポロジーです。

mininet@mininet-vm:~¥> integration/vm/scripts/start_mininet_of13.sh
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 h3 h4
*** Adding switches:
have protcol params!
s1 have protcol params!
s2 have protcol params!
s3
*** Adding links:
(h1, s2) (h2, s2) (h3, s3) (h4, s3) (s1, s2) (s1, s3)
*** Configuring hosts
h1 h2 h3 h4
*** Starting controller
*** Starting 3 switches
s1 OVSswitch opts:  protocols=OpenFlow13
s2 OVSswitch opts:  protocols=OpenFlow13
s3 OVSswitch opts:  protocols=OpenFlow13

*** Starting CLI:

この状態ですとコントローラーは同梱されているNOXです。次はodlをインストールして起動したいと思います。

opendaylightインストール

インストールは簡単です。エディションはvirtualizationを使用してみました。Base Editionと比較して以下の機能が追加されています。

  • Affinity Metadata Service
  • Defense4All
  • Open DOVE
  • Virtual Tenant Network

Affinity Metadata ServiceはSDNでいうnorthboundのアプリケーションからodlを操作する機能を担います。APIです。

DOVEはオーバーレイ機能で、VXLANのフォーマットに則っています。Virtual Tenant Networkは読んでその通りです。どんな形で実装されているのでしょうか。

Service ProviderエディションではBGPやLISPの機能が実装されているようです。

最新のダウンロード情報は以下を参照してください。 http://www.opendaylight.org/software/downloads

# cd opendaylight/
# curl -o odl.zip https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distributions-virtualization/0.1.1/distributions-virtualization-0.1.1-osgipackage.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 79 60.9M   79 48.1M    0     0  3864k      0  0:00:16  0:00:12  0:00:04 5416k
 
 
# unzip odl.zip
Archive:  odl.zip
   creating: opendaylight/
   creating: opendaylight/configuration/
   creating: opendaylight/configuration/initial/
   creating: opendaylight/configuration/startup/

javaが入っていないと起動時にエラーがでますのでインストールしてください。

# yum install java-1.7.0-openjdk

# java -version
java version "1.7.0_55"
OpenJDK Runtime Environment (rhel-2.4.7.1.el6_5-x86_64 u55-b13)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

それでは起動してみましょう。デフォルトでGUIは8080番ポートを使用します。

f:id:komeiy:20141012192138j:plain

f:id:komeiy:20141012192319j:plain

# ./run.sh -virt ovsdb -Xmx1024m

java.lang.OutOfMemoryError:が出る場合は仮想マシンのメモリの確保と-Xmx1024mの部分を操作してメモリを調整してください。

起動すると以下の画面が表示されます。admin/adminでログインしてください。

動作確認

先ほどインストールしたmininetをコントローラ指定で起動します。ポート番号は6633です。mnコマンドで起動して、その後にPingを使用して確認しています。

mininet@mininet-vm:~¥> sudo  mn --controller remote,ip=127.0.0.1,port=6633
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1)
*** Configuring hosts
h1 h2
*** Starting controller
*** Starting 1 switches
s1 OVSswitch opts:

*** Starting CLI:
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (2/2 received)

ログインして見てみましょう。

f:id:komeiy:20141012192353j:plain

スイッチが1台のみの環境なので上記の通りです。これを3階層のトポロジーに変更してみます。

mininet@mininet-vm:~¥> sudo mn --topo=tree,3 --mac --switch=ovsk --controller remote,ip=127.0.0.1,port=6633
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 h3 h4 h5 h6 h7 h8
*** Adding switches:
s1 s2 s3 s4 s5 s6 s7
*** Adding links:
(h1, s3) (h2, s3) (h3, s4) (h4, s4) (h5, s6) (h6, s6) (h7, s7) (h8, s7) (s1, s2) (s1, s5) (s2, s3) (s2, s4) (s5, s6) (s5, s7)
*** Configuring hosts
h1 h2 h3 h4 h5 h6 h7 h8
*** Starting controller
*** Starting 7 switches
s1 OVSswitch opts:
s2 OVSswitch opts:
s3 OVSswitch opts:
s4 OVSswitch opts:
s5 OVSswitch opts:
s6 OVSswitch opts:
s7 OVSswitch opts:

*** Starting CLI:


h1 h1-eth0:s3-eth1
h2 h2-eth0:s3-eth2
h3 h3-eth0:s4-eth1
h4 h4-eth0:s4-eth2
h5 h5-eth0:s6-eth1
h6 h6-eth0:s6-eth2
h7 h7-eth0:s7-eth1
h8 h8-eth0:s7-eth2
s1 lo:  s1-eth1:s2-eth3 s1-eth2:s5-eth3
s2 lo:  s2-eth1:s3-eth3 s2-eth2:s4-eth3 s2-eth3:s1-eth1
s3 lo:  s3-eth1:h1-eth0 s3-eth2:h2-eth0 s3-eth3:s2-eth1
s4 lo:  s4-eth1:h3-eth0 s4-eth2:h4-eth0 s4-eth3:s2-eth2
s5 lo:  s5-eth1:s6-eth3 s5-eth2:s7-eth3 s5-eth3:s1-eth2
s6 lo:  s6-eth1:h5-eth0 s6-eth2:h6-eth0 s6-eth3:s5-eth1
s7 lo:  s7-eth1:h7-eth0 s7-eth2:h8-eth0 s7-eth3:s5-eth2
c0

以下の通りodl上でも認識しています。LLDPやARP headerから情報を取得しています。

f:id:komeiy:20141012192425j:plain

試しにPingを打ってみましたが疎通も問題なさそうです。

mininet> h1 ping h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_req=1 ttl=64 time=8.85 ms
64 bytes from 10.0.0.3: icmp_req=2 ttl=64 time=0.126 ms
^C
--- 10.0.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.126/4.488/8.851/4.363 ms

flow操作

odlでflowを操作してみます。GUIのFlowタブを選択し、Add Flow Entryをクリックしてください。

f:id:komeiy:20141012192029p:plain

f:id:komeiy:20141012192047p:plain

上の画像ようにNodeやInput portを元にFlowの操作が可能です。画面をスクロールするとSrcPortやDstPort、Protcol、TOS bitなどL3以上の情報が設定できます。Actionも最下層にあり、DropやFlood、Set VLAN IDなど多くのをActionを選択できます。

今回はinput portとNodeをh3の情報に指定してActionをDropにします。先ほどのpingがどう変化するか確認します。

mininet> h1 ping h3
^CPING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.

--- 10.0.0.3 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 4999ms

今回、openflowスイッチをodlを通じて操作してみました。根本的に従来のネットワークとは違う造りになるので、このままではすぐ実用とは行きませんが、netconfでも操作可能ということで現行のネットワークをどう扱うことになるのかは気になります。それより先にオーバーレイですかね。

また、何か検証したら続編を書きたいと思います。


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

OpenFlow徹底入門 SDNを実現する技術と知識

OpenFlow徹底入門 SDNを実現する技術と知識

マスタリングTCP/IP OpenFlow編

マスタリングTCP/IP OpenFlow編