Floodlightって
ぶっちゃけどうなの?
2013.11.16 Trema Day #4
関山宜孝 / @moomindani
発表者はこんな人

@moomindani

運用管理OSS
を開発してるソフトウェアエンジニアです。
OpenFlow対応ソフト開発してます。
た。
まし

んな
こ

書き
本を
今日のお話

• Floodlightって何?
• Floodlightを使ってみる
• Floodlightでアプリを作ってみる
Trema

Ryu

来。
、到

雄割
群

時代
拠の
Floodlight
って何?
Floodlightとは
• オープンSDNコントローラ
• Beaconを起源とし、Javaベースで記述
• Big Switch Networksによって開発され、
2012年1月にOSSとして公開
Floodlightの特徴
• Javaベース
• Apacheライセンス
• オープンなコミュニティ
• 使いやすい
• ハイパフォーマンス
• OpenFlow 1.0対応
Floodlightの立ち位置
NOX

プログラミ
ング言語

ライセンス

OpenFlow
バージョン

POX

Beacon

Ryu

Trema

C++

Python

Java

Python

Ruby
C

GPL
v3

GPL
v3

GPL
v2

Apache
2.0

GPL
v2

1.0

1.0

1.2
1.3

1.0
1.3

1.0

1.0

Floodlight

Java

Open
DayLight

Java

Open
Contrail

Python
C++
Java

Apache
Apache
EPL 1.0
2.0
2.0

1.0

1.0

?
Floodlightのアーキテクチャ

コンソール

REST API

Floodlight Javaプロセス
Applicationモジュール

Java API
Controllerモジュール

外部ソフトウェア

物理OpenFlowスイッチ

仮想OpenFlowスイッチ
モジュール 4

モジュール 3

モジュール 2

モジュール 1

モジュール N

Java API

・・・

・・・
モジュール N

モジュール 4

モジュール 3

モジュール 2

モジュール 1

FloodlightProvider

モジュール機構
Applicationモジュール

Controllerモジュール
Controllerモジュール
• Applicationモジュールに対して汎用的な機能
を提供するモジュール
‣ ネットワークの状態やその状態変化を管理する
‣ OpenFlowプロトコルに従ってOpenFlowスイッチ
とメッセージを交換する
‣ Floodlightプロセスが消費するリソースを管理する
‣ 管理している情報をWebインタフェースで可視化
する
Controllerモジュール一覧
モジュール名
FloodlightProvider
LinkDiscovery

機能
OpenFlowスイッチとの接続を管理し、OpenFlowメッセージを他
のモジュールに処理可能な形式に変換する
LLDPとブロードキャストパケットによりOpenFlowスイッチ間の
接続を検知する

TopologyManager

OpenFlowネットワークの物理トポロジ情報を管理する

DeviceManager

OpenFlowスイッチ周辺に存在するデバイス情報を管理する

ThreadPool

定期的に実行する処理のスケジュールを管理する

モジュールの動作のために保持する情報を汎用的に管理する
MemoryStorageSource
NoSQL型のインメモリデータソースを提供する
RestApiServer

REST APIを提供する

web

Webブラウザからコントローラの状態を確認する機能を提供する
Applicationモジュール
• Controllerモジュールの上位に位置するモ
ジュール

• 特定の通信を制御するネットワークアプリケー
ション

• Floodlightはデフォルトで数種類のモジュール
を用意している

• ユーザ独自のモジュールを開発することが可能
Applicationモジュール一覧
モジュール名

機能

Forwarding

パケットを転送する

VirtualNetworkFilter

MACアドレスベースの仮想ネットワーク機能を提供する

Firewall

シンプルなACLに基づくファイアウォール機能を提供する

LoadBalancer

シンプルなロードバランサ機能を提供する

StaticFlowEntryPusher

REST API経由でフローエントリを編集する機能を提供する

Hub

ハブとして動作する(サンプル)

LearningSwitch

ラーニングスイッチとして動作する(サンプル)
Northbound API
モジュール名

REST API

備考

フローエントリの追加/削除
StaticFlowEntryPusher
フローエントリ情報の取得

VirtualNetworkFilter

仮想ネットワークの作成
仮想ネットワークへのホストの追加/削除
仮想ネットワーク情報の取得

Firewall

ファイアウォールの状態変更
ルールの追加/削除
ルール一覧の取得

LoadBalancer

VIPの作成
プールの作成
プールメンバの作成

OpenStack Neutron1

OpenStack Neutron
LBaaS2
1. https://wiki.openstack.org/wiki/Neutron
2. https://wiki.openstack.org/wiki/Neutron/LBaaS
モジュールローディングシステム
プロパティ
ファイル

モジュールの検知
ロード対象モジュールの	

最小セットの探索
モジュールの初期化

モジュールの起動

けを
ールだ
ジュ
モ
可能
指定
いたい
使
イルで
ファ
パティ
プロ
プロパティファイル
floodlight.modules=!
net.floodlightcontroller.jython.JythonDebugInterface,!
net.floodlightcontroller.counter.CounterStore,!
net.floodlightcontroller.storage.memory.MemoryStorageSource,!
net.floodlightcontroller.core.internal.FloodlightProvider,!
net.floodlightcontroller.threadpool.ThreadPool,!
net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,!
net.floodlightcontroller.devicemanager.internal.DefaultEntityClassifier,!
net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,!
net.floodlightcontroller.firewall.Firewall,!
net.floodlightcontroller.forwarding.Forwarding,!
net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager,!
net.floodlightcontroller.topology.TopologyManager,!
net.floodlightcontroller.flowcache.FlowReconcileManager,!
net.floodlightcontroller.debugcounter.DebugCounter,!
net.floodlightcontroller.debugevent.DebugEvent,!
net.floodlightcontroller.perfmon.PktInProcessingTime,!
net.floodlightcontroller.ui.web.StaticWebRoutable,!
net.floodlightcontroller.loadbalancer.LoadBalancer,!
org.sdnplatform.sync.internal.SyncManager,!
net.floodlightcontroller.devicemanager.internal.DefaultEntityClassifier!
org.sdnplatform.sync.internal.SyncManager.authScheme=CHALLENGE_RESPONSE!
org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/auth_credentials.jceks!
org.sdnplatform.sync.internal.SyncManager.dbPath=/var/lib/floodlight/!

floodlightdefault.properties
Floodlightを
使ってみる
セットアップ
$ git clone git://github.com/floodlight/floodlight.git!
$ cd floodlight!
$ ant eclipse;!
して
を起動
ipse
l
クトを
はec
ジェ
あと
eプロ
lips
たec
れ
だけ
tする
生成さ
por
im
起動

tなら
ligh
ood
構成を
のFl
実行
新
最
seの
eclip
れる
できる
成さ
起動
生
自動
だけで
する
実行
WEBインタフェース
デモ環境(インフラ)

Floodlight
コンソール

Ubuntu 13.10

Mininet 2.1.0 VM (Ubuntu 13.04)
デモ環境(OpenFlowネットワーク)
Mininet 2.1.0 VM (Ubuntu 13.04)

kvmvm1

kvmvm2

xenvm1

ofs1

xenvm2

ofs3
xen

kvm
ofs2

Mininet / topo-book.py
o

パケットを転送してみる
- Forwarding

em
D
1

送信元

宛先

kvmvm1

kvmvm2

xenvm1

ofs1

xenvm2

ofs3
xen

kvm
ofs2

Mininet / topo-book.py
o

フローエントリを直接弄ってみる
- StaticFlowEntryPusher

em
D
2

送信元

宛先

kvmvm1

kvmvm2

xenvm1

ofs1

ofs3
xen

kvm
Drop!!
by REST API

xenvm2

ofs2
Mininet / topo-book.py
o

仮想ネットワークを設定してみる
- VirtualNetworkFilter

em
D
3

Network A
kvmvm1

kvmvm2

Network B
ofs1

xenvm1

xenvm2

ofs3
xen

kvm
ofs2

Mininet / topo-book.py
Floodlightで
アプリを作ってみる
モジュールを作るための 3 Steps

1. Applicationモジュール用のインタフェース
(IFloodlightModule, IOFMessageListener)を実装する
2. Applicationモジュールをサービス登録する
3. Applicationモジュールをロードする設定
ファイルを作成する
1. Applicationモジュール用のインタフェース
(IFloodlightModule, IOFMessageListener)を実装する
IFloodlightModuleインタフェース
メソッド名

説明

void init
モジュールが内部的な初期化処理を実行するためのフック。
(FloodlightModuleContext (例)・インスタンスの初期化、取得
context)
   ・ロガーの初期化
モジュールが外部的な初期化処理を実行するためのフック。
void startUp
プロアクティブな処理などに使う。
(FloodlightModuleContext
(例)・OpenFlowメッセージのリスナの登録
context)
   ・REST APIのルーティングの登録
Collection
<Class<? extends

モジュールが依存する対象のモジュールのリストを定義する。
(例)・IFloodlightProviderService

IFloodlightService>>
   ・IRestApiService
getModuleDependencies()    ・IDeviceService
IOFMessageListenerインタフェース
メソッド名
Command receive
(IOFSwitch sw,
OFMessage msg,
FloodlightContext cntx)

説明
OpenFlowメッセージを受信した際にコールされる。
リアクティブな処理などに使う。
(例)・Packet-Inメッセージのハンドリング
   ・Flow-Removedメッセージのハンドリング
   ・Errorメッセージのハンドリング

Command
CONTINUE
STOP

次のモジュールに処理を渡す
このモジュールに処理を終わる
複数モジュール連携
Packet-In

VirtualNetworkFilter
CONTINUE

Firewall
CONTINUE

MyApp
STOP

とも
ュール
モジ
既存
可能
に連携
自由
2. Applicationモジュールをサービス登録する
net.floodlightcontroller.core.module.ApplicationLoader!
net.floodlightcontroller.core.internal.FloodlightProvider!
net.floodlightcontroller.storage.memory.MemoryStorageSource!
net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl!
net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager!
net.floodlightcontroller.topology.TopologyManager!
net.floodlightcontroller.forwarding.Forwarding!
net.floodlightcontroller.flowcache.FlowReconcileManager!
net.floodlightcontroller.core.OFMessageFilterManager!
net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher!
net.floodlightcontroller.perfmon.PktInProcessingTime!
net.floodlightcontroller.perfmon.NullPktInProcessingTime!
net.floodlightcontroller.restserver.RestApiServer!
net.floodlightcontroller.learningswitch.LearningSwitch!
net.floodlightcontroller.hub.Hub!
net.floodlightcontroller.jython.JythonDebugInterface!
net.floodlightcontroller.counter.CounterStore!
net.floodlightcontroller.counter.NullCounterStore!
net.floodlightcontroller.debugcounter.DebugCounter!
net.floodlightcontroller.debugevent.DebugEvent!
net.floodlightcontroller.threadpool.ThreadPool!
net.floodlightcontroller.ui.web.StaticWebRoutable!
net.floodlightcontroller.virtualnetwork.VirtualNetworkFilter!
net.floodlightcontroller.firewall.Firewall!
net.floodlightcontroller.loadbalancer.LoadBalancer!
net.floodlightcontroller.l2sw.L2Switch!
org.sdnplatform.sync.internal.SyncManager!
org.sdnplatform.sync.internal.SyncTorture!
net.floodlightcontroller.devicemanager.internal.DefaultEntityClassifier!

net.floodlightcontroller.core.module.IFloodlightModule
3. Applicationモジュールをロードする設定
ファイルを作成する
floodlight.modules=!
net.floodlightcontroller.jython.JythonDebugInterface,!
net.floodlightcontroller.counter.CounterStore,!
net.floodlightcontroller.storage.memory.MemoryStorageSource,!
net.floodlightcontroller.core.internal.FloodlightProvider,!
net.floodlightcontroller.threadpool.ThreadPool,!
net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,!
net.floodlightcontroller.devicemanager.internal.DefaultEntityClassifier,!
net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,!
net.floodlightcontroller.firewall.Firewall,!
net.floodlightcontroller.forwarding.Forwarding,!
net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager,!
net.floodlightcontroller.topology.TopologyManager,!
net.floodlightcontroller.flowcache.FlowReconcileManager,!
net.floodlightcontroller.debugcounter.DebugCounter,!
net.floodlightcontroller.debugevent.DebugEvent,!
net.floodlightcontroller.perfmon.PktInProcessingTime,!
net.floodlightcontroller.ui.web.StaticWebRoutable,!
net.floodlightcontroller.loadbalancer.LoadBalancer,!
net.floodlightcontroller.l2sw.L2Switch,!
org.sdnplatform.sync.internal.SyncManager,!
net.floodlightcontroller.devicemanager.internal.DefaultEntityClassifier!
org.sdnplatform.sync.internal.SyncManager.authScheme=CHALLENGE_RESPONSE!
org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/auth_credentials.jceks!
org.sdnplatform.sync.internal.SyncManager.dbPath=/var/lib/floodlight/!

とは
あ
込んで
読み
イルを
け!
ファ
設定
するだ
この
起動
ghtを
odli
Flo

floodlight_l2sw.properties
TremaもFloodlightも
どっちも弄って
楽しいOpenFlow
プログラミングライフを!
Icon Design : Phuzion Icon!
http://www.iconspedia.com/pack/phuzion-1825/120.html!
おまけ
本の紹介
1. データセンタネットワークの課題
2. OpenFlowの概要
3. SDN (Software-Defined Networking
4. Open vSwitchを用いたOpenFlowネットワークの構築
5. OpenFlowスイッチ入門
6. OpenFlowコントローラ入門
7. Floodlightを用いたOpenFlowコントローラの実践
8. OpenFlowプロトコルを見る
9. コントローラプログラミング
10. コントローラによるトラフィック制御の活用/運用
11. データセンタオーケストレーションの実現
付録
A. Mininet
B. OpenFlow 1.0プロトコル仕様

K

e版も
indl

よ!
出た

Floodlightってぶっちゃけどうなの?