Ubuntu 16.04 LTSでTremaを使ってOpenFlowを体験してみましょう

追記
TL;DR

最初は僕の日記なので読まずに下スクロールしてください。
概略は記事タイトル通りです。



20160706_210728.jpg OpenStack Days Tokyo2016に参加してきました。
有名企業の各社からの粗品を大量に貰っちゃいました。

虎ノ門ヒルズの5つほどのブースで時間割ごとに各社が講演してくれる他、展示ブースでは各社が通りすがる人たちに自社のOpenStack製品をアピールしてました。
(ストレージとかスイッチとかサーバとか、ほぼOpenStack無関係だけど無理やり結び付けてブース出してる企業も散見されましたがw)

私も半年ほどOpenStack + SDN製品の技術検証をやったことがあるのですが、似たような製品が出てくるわ出てくるわw
OpenStackの管理楽にしますよ系製品、OpenStack + SDN製品の2製品だけでブースの7割は占めてたのではないかという勢いです。
個人的にはNECのグループ会社のどこかが出してた、インスタンスを起動させるとVRで寿司が出てくるジョークグッズが好きでした。

個人的には、せっかくのオープンな技術を各社が独自仕様に改造して事業者インフラに構築しちゃったら、結局またクローズドになっちゃうじゃんという残念感があります。
製品のベンダロックは止まったものの、サポート等のベンダロックは止めようがないんでしょうね。
そもそもオープンソース自体、メーカが存在しないからサポートを受けれず、日本企業だとどこかしらの会社の有償サポートを受ける必要がありますけども。




ここから本文

OpenStackはずいぶんと普及してきました。次はSDNが普及する番ですね。

せっかくサーバサイドが自動化してもネットワークサイドがConfig手動入力じゃ構築コストが高くついて競争に負けちゃう時代がたぶんすぐそこまで来てます!

というわけで今日は簡単なOpenFlowControllerの動作確認ができるところまで書きたいと思います。

OpenFlowControllerにはRubyで書かれるNEC製のTremaを使用します。

OpenFlowプロトコルは、OpenFlowコントローラとOpenFlowスイッチがあって初めて動作確認ができます。

OpenFlowスイッチは自身ではMACアドレステーブルやルーティングテーブルを持たず、また、それらの経路制御アルゴリズムの計算も行いません。

OpenFlowスイッチ内部で保持するフローテーブルに従ってただ流れてくるフレーム、パケットを捌くだけです。

OpenFlowコントローラは作成したプログラムに従って、各OpenFlowスイッチにフローテーブルを与えていきます。
※コントローラ━スイッチ間のコネクションの張り方やフローテーブルの書き換え手順、やり取りのタイミングなどの細かい動作は本記事では割愛します。

というわけで、OpenFlow対応スイッチは、既存のベンダロックなネットワーク装置よりはるかに安価とはいえ、それでもかなり高価なため(最安でも数十万円~)、openvswitchを使用してサーバ上で動作確認を行います。

Tremaの場合、最初からエミュレート機能が搭載されています。

自分で書いた設定ファイル通りの構成でエミュレートをしてくれるので、簡単な動作確認が可能です。

NTTコミュニケーションズが作っているPython製のRyuの場合はMininet等を使用するため、検証環境構築は大して難しくはないのですが、複数VMを起動させる必要があるためSurface Pro2には少し辛いので選択しませんでした。

そのほかのOpenFlowControllerは全く知りません。

今回はUbuntu16.04LTSを使用します。


必須じゃないものも使いたければ入れておきましょう。

# apt-get update 
# apt-get upgrade 
# apt-get install aptitude vim openssh-server rbenv //必須じゃない
# aptitude install openvswitch-switch zlib1g-dev bundler

Tremaが使用するRuby2.0をdownload




あんまり詳しく調べてないけどこの後の手順でruby2.0でインストールしないと動かない箇所があったのでruby2.0を古臭いインストール(別バージョンのrubyをインストールしてrbenvしてもダメでした)
Trema自体もRuby2.0を使用します。
 あと見返したらずっとrootで作業してますね。 
 #wget https://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p648.tar.gz 
# tar xfvz ruby-2.0.0-p648.tar.gz
# ./configure
# make
# make install
# ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]
 

お次はTremaのインストール。
ここから面倒なのでFC2ブログの引用文のやつで。
※場合によってはgem2.3 install bundlerでうまくいきます
gosloli@gosloli-trema:~/work$ vim Gemfile
gosloli@gosloli-trema:~/work$ cat Gemfile
source 'https://rubygems.org/'
gem 'trema'  
$ bundle install --binstubs


これでtremaコマンドが使えるようになりました。

次はエミュレート用の設定ファイルを記載します。

$ mkdir trema_test
$ cd !$
$ echo "vswitch { datapath_id 0xaaaa } " >> trema_test.conf
これは単純に仮想OpenFlowスイッチが1台いるだけという意味ですね。

複数台のvswitchやvhostを配置して、linkという設定を書くと論理的に接続できますが、今回はControllerが動作するところの確認までで十分なので、vswitchを一台設定するだけにします。

datapath_idというのは、スイッチの固有の識別子です。MACアドレスとかIPアドレス的な感じで、そのOpenFlowスイッチを一意に特定するための情報だと思っていただければOKです。

次は、Tremaのプログラム部分です。
gosloli@gosloli-VirtualBox:~/work/trema_test$ cat hello_trema.rb 
class HelloTrema < Trema::Controller
def start(_args)
logger.info "Start Trema!"
end
def switch_ready(datapath_id)
logger.info "hello #{datapath_id.to_hex}"
end
end
このような感じで書いてみてください。

Trema::Controllerでコントローラの継承を行います。

def start(_args)はプログラム起動時に実行されるようです。

def switch_ready(datapath_id)は、対象のvswitchが使えるようになったら動くみたいです。

まだ勉強が足りてないので、switch_readyが具体的にどこまでController⇔Switch間でやり取りが進んだときに実行されるのかまではわかりませんすみません。

実行するとこんな感じ。

gosloli@gosloli-VirtualBox:~/work/trema_test$ trema run -c trema_test.conf hello_trema.rb 
Start Trema!
hello 0xabc
trema runでtremaは起動します。 -c オプションで設定ファイルを指定することによって、エミュレートモードで動作します。

引数には、実行するプログラムファイルを指定します。

とりあえず今日はこんなところまでで。



コメントの投稿

非公開コメント

プロフィール

ゆうじ

Author:ゆうじ
社会人1年目〜4年目:インフラエンジニア
社会人5年目〜   :セキュリティエンジニア

ほぼネットワーク屋でした。


[保有資格]
運転免許
漢字検定準2級
パスコンスピード検定1級
ITパスポート
基本情報技術者試験
応用情報技術者試験
Comptia A+
CCENT
CCNA
CCNP
MCPC2級
VCP-DCV 5.5
LPIC Level1
LPIC Level2
LPIC Level3core
LPIC Level3mixed environment

パズドラランク950↑

サドンアタック
中佐:シコ星
W/L 46% K/D54%
少佐:尿イエロー
W/L 50% K/D 56%
少尉:ケツアゴに挿入
W/L 100% K/D77%


メイプルストーリー(笑)
柳)195メカニック
柳)180台DS
柳)178DS
現在持ってるキャラはこの3つ

柳)140台?投
キャラ名:ちnこ
売り済み、現在行方不明





mixi→id=19488862
Skype:yuuzi.kab
Twitter:gosloli
Instagram:yuuzikab










月別アーカイブ
カテゴリー
ブログの更新率
Twitter
リンク
.key { margin: 0 3px; padding: 1px 6px; border-radius: 3px; border: 1px solid #E0E0E0; border-bottom-width: 2px; background: #F0F0F0; background: -ms-linear-gradient(top, #F0F0F0, #FCFCFC); background: -moz-linear-gradient(top, #F0F0F0, #FCFCFC); background: -webkit-gradient(linear, center top, center bottom, from(#F0F0F0), to(#FCFCFC)); background: linear-gradient(top, #F0F0F0, #FCFCFC); font-family: Arial}