OpenDaylight Hydrogenでロードバランシング

今回はHydrogenでロードバランシングをやってみます。

参考:OpenDaylight Controller:Load Balancer Service
すべての設定はREST API経由で行います。

準備

mininetでスイッチ1台、ホスト4台を起動します。

mn --topo=tree,1,4 --controller=remote

今回は下記のような構成にします。
クライアント
h1(10.0.0.1)

サーバー
h2(10.0.0.2)
h3(10.0.0.3)
h4(10.0.0.4)

クライアントから待ち受けるVIP
10.0.0.100

f:id:kashigeru:20140623231427p:plain

h2/h3/h4はhttpサーバーを起動しておきます。

mininet> h2 python -m SimpleHTTPServer &
mininet> h3 python -m SimpleHTTPServer &
mininet> h4 python -m SimpleHTTPServer &

mininet> h2 netstat -ltn
稼働中のインターネット接続 (サーバのみ)
Proto 受信-Q 送信-Q 内部アドレス            外部アドレス            状態
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN

プールの作成とバランシグメソッド作成

メソッドラウンドロビンとします。192.168.0.9はコントローラーのIPです。

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://192.168.0.9:8080/one/nb/v2/lb/default/create/pool -d '{"name":"PoolRR","lbmethod":"roundrobin"}'

VIP作成

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://192.168.0.9:8080/one/nb/v2/lb/default/create/vip -d '{"name":"VIP-RR","ip":"10.0.0.100","protocol":"TCP","port":"8000","poolname":"PoolRR"}'

プールにメンバー追加

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://192.168.0.9:8080/one/nb/v2/lb/default/create/poolmember -d '{"name":"node2","ip":"10.0.0.2","poolname":"PoolRR"}'
curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://192.168.0.9:8080/one/nb/v2/lb/default/create/poolmember -d '{"name":"node3","ip":"10.0.0.3","poolname":"PoolRR"}'
curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X POST http://192.168.0.9:8080/one/nb/v2/lb/default/create/poolmember -d '{"name":"node4","ip":"10.0.0.4","poolname":"PoolRR"}'

確認

curl --user "admin":"admin" -H "Accept: application/json" -H "Content-type: application/json" -X GET http://192.168.0.9:8080/one/nb/v2/lb/default/  
{"pool":[{"name":"PoolRR","lbmethod":"roundrobin",
    "vips":[{"name":"VIP-RR","ip":"10.0.0.100","protocol":"TCP","port":8000,"poolname":"PoolRR","status":"active"},
    "members":
      [{"name":"node2","ip":"10.0.0.2","poolname":"PoolRR"},
      {"name":"node3","ip":"10.0.0.3","poolname":"PoolRR"},
      {"name":"node4","ip":"10.0.0.4","poolname":"PoolRR"}]}]}

h1にARPエントリを追加

VIP(10.0.0.100)に対するMACがsw1(00:00:00:00:00:00:00:01)となるエントリを追加します。

mininet> h1 arp -s 10.0.0.100 00:00:00:00:00:00:00:01

h1からVIPへアクセス

mininet> h1 wget http://10.0.0.100:8000
--2014-06-23 23:16:36--  http://10.0.0.100:8000/
10.0.0.100:8000 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK

アクセス確認

GUIからだとTroubleshoot→Portsでパケットを確認するしかないような。
パケット数での確認ですが、きちんとロードバランスされています。

f:id:kashigeru:20140623234651p:plain

以上です。サービスでは使えそうにないですが、REST APIで色々出来ますね。
もちろんプールやVIP、ノードの削除も出来ます。上記の参考URLからどうぞ。
(ノ´▽`)ノ{+++THANK YOU+++}ヽ(´▽`ヽ)