Trema Day #3 参加メモ #tremaday
はじめに
前回に引き続き Trema Day #3 参加してきました。
- TremaDay
- Trema Day #3 | 集客ならイベントアテンド
- Trema Day #3 #tremaday - Togetter
- Giving is Taking - Networking: Trema Day #3 に参加してきた(一部)
いやあ、今回人多かったですねえ。過去最多? 少なくとも終了後の懇親会は過去最多ですよねえ。すごいのう。
[追記 2013-07-28]
一応今回のツイートまとめもつくっておきました。(上記togetter), 公開資料とかは、追って見かけたら追記していきます。
Wakame-VDC の仮想ネットワーク, 山崎さん
Wakame-VDC の仮想ネットワークについて
ネットワーク機能の略歴
- OpenStack みたいなもの、といって紹介しますが、OpenStack より2ヶ月早くリリースしています
- ネットワークって難しいというのがこの頃わかった
- 半年後(2010/11)にセキュリティグループ、分散スイッチのコントロール、いま見ると edge networking architecture にこの時点でなっている。
- 2011/12 ごろ、Trema/OpenFlow1.0へ置き換え
- 2012/3 virtual network
Wakame-VDC Users
- NTT PC Communications, 京セラコミュニケーションシステム, 九州電力など
構造
- AMQP Network にエージェントがたくさん刺さる。Agent は物理リソースを管理。Agent 同士が話をしながら全体の仕事を行っていく。
- RabbitMQ でとか。python か ruby かという程度でOpenStackとそんなに違わない
- hva, bksta, sta, netbox, nwmngw, collector など、役割の違う(管理する物理リソースの違う)のエージェントがある。
- GUI → Web API Server (dcmgr) → AMQP
- UIを独自開発することも。
Network の論理構造
- Edge network: リソース側だけでなく DCNW の WAN 側の Edge もある
Agents on logical network
- agent を edge node に配置
- natbox - hva - vm
- bksta で複数拠点間マシンイメージやりとりなどの機能も。(京セラでやってる)
User defined multitenant networks
- 任意に自分のためのネットワークを作る
- hva が AMQP NW にジョインして管理ネットワークから指令を受け取り、OVSの設定を変えたりしていく。
phys network(phys L2/L3) phys server --+-- virtual network (virtual L2/L3) | +-- vitual machine
Embedded Trema
- HVA の中に Trema が組み込まれている。分散 Trema 状態。
- スイッチ1個について1個のコントローラが張り付いている。Trema ないし OVS について正しく指示を出せればよい: HVA
Distributed DHCP server
- 一般に DHCP/DNS server やるのにインスタンスを起動しないといけない、とか。管理が大変だろう。NWが死んだり、DNSMASQ のノードがぶっとだとか。クリティカルで簡単にメンテナンスができない。
- DHCP Server そのものを分散で処理。discovery → OVS Flow Table → Controller Management Line で回答を DB から検索 Controller → Management Line で回答を DB から検索
- 返すべき情報がわかったら DHCP パケットを作って返答。1つのボックス内で完結。
- Static に処理できるものは OVS 内で処理、動的に解決するものはフックして返事を HVA/Trema 内でつくる。
Virtual Networking
- 仕組みが二つ
二つVMがある場合
- ARP request (VM1→VM2), OVS で DST Addr を broadcast → unicast に変換して宛先のいるOVSにだけ届ける。
そのほかのネットワーク機能
- GRE Tunnel
- 物理L3超えるときに使う
- security groups
- dynamical firewall
- external ip
MAC2MAC or GRE
Wakame SDN Architecture
デモ1
- 複数テナント・複数VM起動のデモ
wakame-vnet
課題
- wakame-vdc とくっついてる
- 仮想NW機能だけ切り離してやろう
- IaaS に依存しないで独立して。OF1.3
物理構成はほぼ同じ。
- vna (virtual network agent)
module 相関図
- vna 〜 ZeroMQ (+redis)
- trema edge, OF1.3 で OVS1.10 と会話
フローテーブルの設計
- (略)
- (略)
Flowの読み方
- (略)
悲しいお知らせ
- 資料書いたけどFlowTableの設計は見直し(先週根本的に見直しました)
- Metadata のマスク設計も Table 単位に細かく行うべきだという結論に。単純に 64bit の中を適当に分割して使うとかじゃ今ひとつ。狭いメモリ領域をいかに効率よく使うかで悩んでいる。
デモ2
使ってデバッグしてコミットしてくれるとうれしいです。
今後について
整備中
- notification
- packet filtering
- per vif security groups + firewall rule
- wan edge netwroking
- global ip addr (NAT)
半年以内にはできあがると思う
- 仮想L3ルーティング機能
- 仮想L2/L3の実現
- ほかの外部ネットワークとの連携
大変なこと
- trema edge へのコミット
- OF1.0 -> OF1.3 へのフロー書き直し
- Metadata, cookie の設計が複雑
- テスト環境が貧弱で…
- 50A以上増やせない…
ZeroMQの性能いいよ
QA
- RabbitMQ から ZeroMQ に変えた理由、Redis 何に使っているか?
- ARP を unicast にする。phys broadcast になるものってほかにもある。Multicast とかどうしているか?
- あえて無視している。broadcast 使っているもののうち、どこに行くかわかっている物だけが制御できる。どうしてもブロードキャストしなきゃいけないものもあるだろうし。やるなら unicast に変換してばらまくとか作らないといけないだろうと思っている。
- 今は無視する設定で、どこまで客の要望を提供できているか?
- IaaS であればいまは無視していても大丈夫だろう。Webシステムとかで使うのが通常だろうから。やりたいというリクエストがあればやるが、今はそれほどない。
- さっき(でもムービーの中で) Ping うつとき、GRE接続のほうにも ARP 届いていたのはが気になりました…
- 作ってる最中のデモなので、意図しない動きをしているところがまだいくつか残っています。
- 物理L3ルータ越え、GREトンネル、カプセル化する場合 MTU 調整がいると思う。今回 wakame-vnet ではどうしている?
- MTUは未調整。いまネットワークエンジニアがいないのでわからないことがあって、実際に運用上どういう作法があるのかとか、チューニングとかは教えてほしい。いま GRE わりと無視しているのは、実態、客先のところでは L3 が必要になるほど大きな仮想基盤の方が珍しい。L2 でがんばるというのがまずどこもあると思っている。まずL2で動くことに注目。MTU など細かいチューニングの話は組み込みたいのでご意見、コミットいただけるとありがたいです。
- vSwitch 間の phys network backboneは各仮想ネットワークの isolation をするようになにかしているのか。MAC Addr ベース、VM上でMACアドレス偽装とかされると問題になったりしないか?
Hybrid SDN によるルーティングの実用性向上を目指して, 仲程さん
SDNとはなにか?
- software によってNW構成・機能・設定をプログラミング
OSPFについて
S-OSPF
- 発ノードが隣接に対して分散してデータをばらして送る
S-OSPF実装
- 非SDNで実装
- 機能追加が大変
- 実用が難しい
- ネットワーク全体の状態把握が難しい
- SDNの考え方で解決
S-OSPF実装(w/SDN)
- エッジノードのみSDNを適用、それ以外は通常のOSPFノード
ロードマップ
- 今回 POX でかいたらすごく長くなりました…
- mininet つかって実験。
今後
- 実機実験
QA
- デバッグ大変だと思いますがどういう戦略?
- エッジの機器は宛先だけ降ってやるだけでOSPFはいらない? S-OSPFのメリットは?
- 根底、OSPFの環境をうまく使う。全員がOSPFをしゃべれるという前提でやっていた。エッジが分散の計算だけで、というのについてどうするか。本来S-OSPF自体はコントローラのない状態なので、エッジがルートを把握することによって、というのがあるはず。
- 分散環境、ループフリーというあたりがキーでは。エッジノードだけルールを外れて分散の計算をやるんだけど、ほかのノードには影響を与えずに、エッジノードがうまく回してくれるという話じゃないか。
- OSPF、S-OSPFは分散。それを集中管理で。論文と価格と気は集中制御でマルチパス制御っていろいろ方法がある。その辺、比較とかサーベイの話がないと reject しちゃうかも。根本的に集中管理できれば全部コントロールできちゃうしね。
- [メモ取得漏れ]
- S-OSPFについてはよくわかってないけど、Edgeってどういう意味?
- OSPF Area Edge という意味, OSPFのネットワークに対してのSDN対応を考えていた。前提としてノード全員がOSPFしゃべるというので考えていた。
- OSPFパケットを解析してにDB組んでアクションを考えるみたいのをやる?
- 考えています。
Rubyでパケットパーサ, 高宮さん
Trema Day の話
- 今回、新しい試みとしてLineのスクリーンショットを張ってみた。そうしたら、すごい人が来た。3回目で過去最多参加者。
- Field of dreams という映画があった。主人公、夢の中でお告げ、あれを作ると人が集まってくるぞ、というのを夢の中で聞く。トウモロコシ畑をつぶして野球場を作ると…。
- Field of dreams 作戦。何か作ると人が集まってくる。Lineで画面を作ると人が集まってくる。
- KDDIウェブコミュニケーションズさんありがとうございます。
自己紹介
Rubyでパケットのパーサとジェネレータを作ろう
- トポロジ探索サンプルコード
- 短く、読みやすく、改造しやすい、コードがあるといいな
- コントローラの中でLLDPのパケットを作って、パケットアウトしている。
- コントローラの中にLLDPパケットジェネレータとパーサがある。
- パケット作ったり読んだり。Rubyでライブラリないかな。Rubyだとあんまりネットワーク系のパーsがない。
理想
l = lldp.read(bynary) l.dpid #=> 12345
とか
Bindataでどう作るか?
- LLDP Frame Format
- Bindataでかくとこうなる
- クラス定義に型とフィールドを定義していく
- 型: フィールド名
- すごくきれいに書ける。フォーマット見たままクラスに落とせる。
- クラス定義に型とフィールドを定義していく
- 定義したクラスを使う
型
- primitive 型
- string, stringz, int8/16/32be, bit1/2/4_l3, float_le, double_be,.....
- primitive 型だけでも全部やれるけど、すごく長くなる + TLVとかまとめたい。
- ユーザ定義型
- mac_address, chassis_id_tlv など。プリミティブ型を組み合わせて作っていく。
- TLVとかもかなり直感的に書きくだせる
これで、Optional TLVとか来るかどうかわからないところ以外は LLDP parse できる。
Optional TLV, 結構使う。ちょっと凝ったことをしようとすると、Ciscoの何とかとか。TLVに入ってくる。問題は、TLVあるかないかわからない。一つのヤマはあるかないかわからないデータをどう扱うか。
解決策。Optional TLV, endof LLDPDU TLV をまとめて、1〜N個のTLVだと考える。可変長Arrayみたいなモノとして実装。
Optional TLV
- End of LLDPDU でおわる Optional TLV 配列
array :optional_tlv, :type => :optional_tlv, :read_until => lambda { element.end_of_lldpdu? }
終端チェック
- OptionalTlv class
tlv_type = 0
タイプの判別
choice :tlv_value, :selection => :chooser do end_of_lldpdu_value 0 .... def chooser if tlv_type == 0 or (...) tlv_type else "unknown" end end
これですべてパースできた!
Tremaレシピ集を
- みんな使う同じようなことはまとめて配布したい。
parserとかは手分けしやすい。
- pcapを集める人
- コーディングをする人
- 実環境でテストする人
こういうのをパースしたいとか、こう言うよとが、とか使う部分から作っていけばいいかな。と考えている。
いま、Trema, Trema-edge は結構共通している。共通ところを抜き出して汎用gemとして重複部分をなくそうとしている。
- paper-house (done)
- Trema::Packet (今後)
興味のある人は是非参加を。
QA
- TLVのパース、Mandatory & Option, 全部まとめた方がシンプルでは?
- それは考えたんだが、なんかうまくいかなそう。LLDP の 使用が 2005年版と2009年版であって、mandatory field の解釈が違ってうまく一般化できなかった。共通化しようと思ったんだけどそういうのがあったのでやめました。
- TLVって、ether の仕様が増えるたびに増えたり、サブフィールドがあるのもあったりするのだけど、拡張しやすいようにするには?
- ネストするときとか。調べると、昔の Ruby の ML で、BinData の作者が直回答でできるよとだけ。ネストの例はサンプルに載っているのでやれるのはやれる。
- ネストする場合は。タイプが増える場合
- はじめは愚直にクラスを作って、共通化していくくらいしかない気がする。
- chooser を増やしていく、クラスをマルチ継承するのもうまくいかなさそう。EtherとLLDPを分けたい。
- 分けたい理由は、LLDPの次のほかのパーサを作る。Ether(L2)の部分が重複する。そこはほかのでも使うから。
- 増えてきたら共通する部分を分ける。
- L2でVLANとか増えてくると、LLDPだけで対処するのは難しいから分けておいた方がよさそう。
- TremaとTrema-edgeで、Trema-edgeが情報が byte array で渡される。仕様的なところの統一とかある?
- packet_in.data で、trema-edge は byte code array がくる。iterator とかもつかえるので。とりあえずの対処としては、array がきたかどうかで分ける。ゆくゆくはTrema/Trema-edgeで統一。
いまTremaに必要なもの, 大山さん
- ユーザ視点で、機能的にあったらいいよね、というものを考えてみました。
- OpenFlowの本を書きました。増刷しました!
Trema とは何か?
- All in one な openflow framework
- All in one -> eclipse? 的なモノをイメージ(個人的には)
- emulator, debugger, profiler, ...
可視化・モニタリングのツールがない(プロファイラ相当のモノがない)なあ
- tremashark: コントローラとセキュアチャネルにフォーカス
- 全体を見るモノがいるだろう
カスタマイズ可能な、可視化・モニタリングするプラグイン
- tremaday #2 の続きです。
- Trema-satelite Architecture
- カスタマイズ性
- "Mechanism, Not Policy"
- 利用シーンによってやりたいことや見たい情報は異なる。
- 用途に特化させるのではなく、用途に合わせてカスタマイズできるようにしよう
じゃどうやってやるの?
- まだ実装が固まっていないので考え方の話をします。
- 軸: 全体-個別, 物理ポート-フローエントリ
一緒に開発しませんか?
フィードバック大募集
QA
- いまtrema-satelliteで手伝ってほしいとことかフィードバックのほしいところってどのへん?
- ネットワークの監視ツールとか職場で使ってる。見るだけじゃなくて、閾値監視とか、そういう要望は出そうだけど、今後どういう方向を狙っているか?
- あまり大きく設計して作ろうとすると失敗しそうな気がしている。ゴールは近いところにして考えていこうとしているので、監視ツール連携とかよりは、見せるところ、Export/Import あたり。まだどういうところで使うか、というのがはっきり見えていないので、ゴール設定は曖昧。どこでどう使うかをみながら検討。
- ネットワーク管理監視をやってる。CSV とかいう話あるけど、リアルタイム流量計測、情報を見てどういう対処をするか、リアルタイム性が求められている。なので、Fluentd とかに加えるようなこと、流量や障害の起きそうなデータとか、静的データじゃなくて動的に流すルートを作れるとうれしい。NW規模が大きくなると一人では追えない。怪しいところとか分析したりして出してくれるようなものがほしい。
- 監視システム連携みたいな話と、Viewer/GUIって分かれると思う。Tremaの中にある情報を外に出すっていう連携の話と、可視化・Viewerの分離できるといろいろやれるのでは?
- [メモ取得漏れ]
- グループの指定, URLどうやってやろうかとか。Tremaで仮想NWとか作り始めると、そこでやってることこっちでもやるのか。Sliceable Switchとか、Tremaアプリ上で論理ネットみたいな話。IaaS監視などやると、そういう仮想NWのはOFコントローラから出さないといけない。
- [メモ取得漏れ]
Nuro biz の話[タイトル記録漏れ], 近藤さん
nuro biz?
- 下り最大2Gbps,登り最大1Gbps
- 効率よく利用できて安いルータ?
- 上司いわく「じゃOpenFlowで作れよ」
- LINCやろうとしてたけど…まだつかってません。TremaEdgeもまだ使っていません。
nuroの構成
検証構成
- 自分で作ったのと、普通のルータでどう違うか。
- CDN〜NURO〜ローカルで負荷生成
- 既存のルータもバランシングの機能があってマルチホーミングみたいなので来て、2系統の回線を使える。
- 某ルータだと、うまくLAN1/LAN2のバランシングができてない(偏りがある)。900MbpsこえるとCPU90%とか(ソフトウェアベースのルータ)、
- OFSの場合、だいたい2本同等に使える、合計1,3Gとか。だいたい1.3倍くらいにやれた。(端末数の都合でここまで。ソフトウェア的にはまだ余裕があった)
OFSの場合
- WANトラフィックに応じた動的な経路割り当てができる
- NAPTセッションを管理している部分の負荷が高い
やりのこし
- ルーティングテーブルの処理、NAPTテーブルの処理が重い。設計の見直しや別言語での実装も視野に入れる必要がありそう。
- nuro bizサービスのうち、公開IP一つという品目。公開IPが複数とかの場合にどうするか、通信制限などをどうするかも考える必要がある。
- 設定が今SQLなので設定が大変。管理UIを作ろう。
今後進展があればまた発表します。
QA
- OFCテンパる、packet-in, どれくらいとかデータある?
- 500-600 packet-in-req/sec, NAPTセッション管理がまだあまりよくない。配列に通信割り当て push/pop みたいなので管理。それはかなり負荷が高いのでどうにかしないといけない。
OpenStack 仮想ネットワークでのトラフィックフロー制御, 坪井さん
OpenStack 環境を手元で作っていろいろテストしてた。
環境作ってみると OpenFlow の振る舞いと似ているかなあ、というあたりの荷ほどき。
IaaS基盤の理想像
- 仮想インスタンスがほしいときに、簡単な操作で、すぐにデプロイしたい
- OpenStackで簡単に、トポロジかしかしながらできたりする。
OpenStack の技術課題
- 仮想NWを作る
- 見た目はそれっぽいけど、うまく動かない事例が何度かある。
- 原因解析のノウハウためないと実運用で使うのは難しいかな…
- OpenStackの仮想NWを理解した上でスキルをためていきたい
- OpenStackの仮想NWを理解する上で、わかりやすい技術書籍とかはあまりないよね
OpenStackの理解
知りたいこと
- Neutron仮想ネットワーク技術要素において
- OVSを活用したテナント分離方法
- OVSを活用したトラフィックフロー制御方法
Grizzly盤仮想NWを作ってみた
- 特徴, GRE tunnel, key id, vlan tag などがあってこれでテナントとかを区別してるんじゃないか
わかったこと
- OVS, br-int, br-tun トンネルIDを利用してテナント分離を図っている
- neutron 仮想ネットワークの特徴
- Compute Nodeの仮想エッジに事前にフローエントリを設定
チャレンジ
- 課題認識
GREトンネル冗長
おわりに
- OSPT仮想ネットワークの理解、という流れで試してみた。
- 本当は neutron plugin 化が必要なのだろう。
QA
- [メモ取得漏れ]
Virtual network platform の紹介, すぎょうさん
資料: Virtual Network Platformの紹介
- 7/23 公開, Trema base, GPL2,
- readme, api docment なども公開されています。
なにができるか
- 仮想ネットワークの作成と管理
- 物理ネットワーク上に仮想ネットワークを作っていく
- ポート; datapath id, port name, port number, vlan id で識別
- vxlan base
- vxlan で switch(ovs), レガシーなどとつながる
- コントローラ
- スイッチ
- virtual network agent: manager から vxlan endpoint 設定要求などを受けて処理を行う。
- vxlan tunnel endpoint: linux kernel の vxlan module か、自前処理で vxlan
- OVS, ubuntu12.04 のパッケージをそのまま利用
VXLANはOVSじゃなくて独自。ユーザ空間で動くプロセスになっている。
- vxland が linux tap device で OVS datapath にくっつく
VXLAN 部分は hogelan ベースで改造
特徴
- sliceable_switch みたいなかたちにしてある
今後の予定
- 決まってません。
- 公開するのに時間がかかってしまった
QA
- trema? trema-edge?
- VXLAN ほかのベンダともつながる?
- broadcast mapping (underlay) は? ip multicast?
- 全部入り。マルチキャストもユニキャストもソースにはあるけど、ユニキャストについてはドキュメントには書いてない。READMEとかで書いてあるのはMulticastの例。ソースを見ていただければ。リフレクタとか例は。使い方とかはドキュメントがないので難しいかもしれないですが。
- CiscoとやるとかだとCiscoでもエンドポイントの設定いるの?
- 設定しないといけないのはMulticast Group Addrとポート番号。それだけであとはアクセスコントロールとかの制限がなければ普通につながるはず。ポート番号は、一応Draftで 4789 が IANA から割り当てられている, 一時的に 8472 とか使ってるものがあるかも。グループアドレスは使う人がアサインする。Linux Kernel とはつながった実績はあるので、そんなにトラブルにはならないのではないかと思っている。ただ、Linux Kernel 3.7 とかはデフォルトポートが違ったので注意。新しいカーネルでは変更されたかなあ。OVS はユニキャストなので、マルチキャストVXLANではつながらないだろう。
- sliceable switch like API, やりたいことは、たくさんネットワーク作りたい。ハードウェアスイッチのしがらみとかがないときに、sliceable じゃなくてこっちを使うメリット?
- sliceable は hop-by-hop, こっちは overlay, 全部がOFSでなくても何とかなる。
- ユニキャストでもできる?
- 一応…。ユニキャストでも使える、というので試しに入れている。