lagopus as open flow hybrid switch 実践編

18
Lagopus as OpenFlow Hybrid Switch 実践編 Sep 20, 2016 Masaru OKI @masaru0714

Upload: masaru-oki

Post on 08-Feb-2017

336 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Lagopus as open flow hybrid switch 実践編

Lagopus as OpenFlow Hybrid Switch 実践編

Sep 20, 2016Masaru OKI @masaru0714

Page 2: Lagopus as open flow hybrid switch 実践編

前回までのあらすじ

● Hybrid SwitchはOpenFlowと既存のスイッチ/ルーティングとの組み合わせ

● tapインタフェースを作成しLinuxカーネルの機能と組み合わせる実装をしてみた

● 自前のスイッチング/ルーティングが実装されつつあり、近日公開(Dec 2015)

のあと、音沙汰がないまま半年以上がたちました……(すみません)

ので、近況をお知らせします!

Page 3: Lagopus as open flow hybrid switch 実践編

summary: recent releases of Lagopus● 0.2.5 Apr 6, 2016

○ GTP-U tunnel support, some bug fixes

● 0.2.6 May 2, 2016○ performance improvement, but DPDK ixgbe vector enabled, much slow

● 0.2.7 May 18, 2016○ DPDK vector disabled again

● 0.2.8 July 12, 2016○ build and tests on Ubuntu 16.04LTS○ deprecated -p parameter

■ ignored if specified○ it works as L2 and/or L3 Hybrid switch

Page 4: Lagopus as open flow hybrid switch 実践編

OpenFlow Hybrid Switch (おさらい)● L2スイッチあるいはL3ルーティングとOpenFlowスイッチの合体

● Lagopusでの現時点での実装は、外部から見てOpenFlowスイッチが前段にある

● OFPP_NORMALに向かってoutputすると、内蔵のL2/L3エンジンに処理が移る

● tapインタフェースが生えていて、Linuxのipコマンド等で操作できる○ IPアドレスを付けるなどすると netlink socketを使ってLagopusが情報を読み内蔵エンジンに反映

Page 5: Lagopus as open flow hybrid switch 実践編

ビルド方法

./configure --enable-hybridmake

Page 6: Lagopus as open flow hybrid switch 実践編

コンフィグの記述方法(conf形式) - L2bridgebridgeの定義に

l2-bridge true;mactable-ageing-time 300;mactable-max-entries 8192;

を加える。

DPDK使用時のみでなく、rawsocketでも動作する。

fail-mode standalone; を書いておくと、コントローラ未接続時L2bridge動作となる。

数字は例。いずれも省略可。ageing-timeの単位は秒max-entriesはエントリ数

デフォルト false

Page 7: Lagopus as open flow hybrid switch 実践編

DSLでの記述(例)1行で記述する。長いので \ 折り返ししているが許してほしい。

bridge BR01 create …. \-l2-bridge true \-mactable-ageing-time 300 \-mactable-max-entires 8192

Page 8: Lagopus as open flow hybrid switch 実践編

L3は?● hybridのlagopusを起動するとinterface設定の名前と同じtap i/fが生える。

● tap i/fにipコマンドなどでIPアドレスをつけると自動的にL3処理対象になる。○ bridgeごとにnamespaceがあるわけではなく、Lagopus全体で一つのL3

● routing daemonはtap i/fに向かってパケット送受信するよう設定。

● 外部とのインタフェースはDPDKあるいはrawsocket。

Page 9: Lagopus as open flow hybrid switch 実践編

動かしてみよう(L2編)● rawsocketで試すのが簡単 (./configure --disable-dpdkつきでビルドしてください)● vethペアを作り、ip netnsで片方を分離させる

● というのを2本生やして、もう片方どうしをLagopus L2bridgeでつなぐ

● 両端に同一ネットワークのIPアドレスを付与し、pingする

NET1 NET2(default)

LagopusL2Bridgeveth0veth1 veth3veth2

172.21.0.1/24 172.21.0.2/24

Page 10: Lagopus as open flow hybrid switch 実践編

vethの準備

sudo ip link add veth0 type veth peer name veth1sudo ip link add veth2 type veth peer name veth3sudo ip netns add NET1sudo ip netns add NET2sudo ip link set veth1 netns NET1sudo ip link set veth3 netns NET2sudo ip netns exec NET1 ip addr add 172.21.0.1/24 dev veth1sudo ip netns exec NET2 ip addr add 172.21.0.2/24 dev veth3sudo ip link set veth0 upsudo ip netns exec NET1 ip link set veth1 upsudo ip link set veth2 upsudo ip netns exec NET2 ip link set veth3 up

Page 11: Lagopus as open flow hybrid switch 実践編

DSLの準備

l2bridge.dsl

interface if0 create -type ethernet-rawsock -device veth0interface if2 create -type ethernet-rawsock -device veth2port p1 create -interface if0port p2 create -interface if2bridge br01 create -l2-bridge true -port p1 1 -port p2 2 -fail-mode standalonebridge br01 enable

Page 12: Lagopus as open flow hybrid switch 実践編

pingしてみる

sudo lagopus -d -C ./l2bridge.dsl

一方他の端末で

sudo ip netns exec NET1 ping 172.21.0.2PING 172.21.0.2 (172.21.0.2) 56(84) bytes of data.64 bytes from 172.21.0.2: icmp_seq=166 ttl=64 time=1.79 ms64 bytes from 172.21.0.2: icmp_seq=167 ttl=64 time=0.886 ms64 bytes from 172.21.0.2: icmp_seq=168 ttl=64 time=0.878 ms64 bytes from 172.21.0.2: icmp_seq=169 ttl=64 time=0.888 ms64 bytes from 172.21.0.2: icmp_seq=170 ttl=64 time=1.06 ms64 bytes from 172.21.0.2: icmp_seq=171 ttl=64 time=0.885 ms64 bytes from 172.21.0.2: icmp_seq=172 ttl=64 time=0.921 ms

OK!

Page 13: Lagopus as open flow hybrid switch 実践編

動かしてみよう(L3編)● rawsocketで試すのが簡単 (./configure --disable-dpdkつきでビルドしてください)● veth0-veth1とveth2-veth3の2つのネットワークを作る。

● NET1のdefault routeを10.0.0.2、NET2のdefault routeを10.1.1.1に設定する。

● NET1からping 10.1.1.2する。

NET1 NET2(default)

LagopusL3Engineveth0veth1 veth3veth2

10.0.0.1/24 10.1.1.2/2410.0.0.2/24 10.1.1.1/24

Page 14: Lagopus as open flow hybrid switch 実践編

vethの準備(まっさらな前提で)sudo ip link add veth0 type veth peer name veth1sudo ip link add veth2 type veth peer name veth3sudo ip netns add NET1sudo ip netns add NET2sudo ip link set veth1 netns NET1sudo ip link set veth3 netns NET2sudo ip netns exec NET1 ip addr add 10.0.0.1/24 dev veth1sudo ip netns exec NET2 ip addr add 10.1.1..2/24 dev veth3sudo ip link set veth0 upsudo ip netns exec NET1 ip link set veth1 upsudo ip link set veth2 upsudo ip netns exec NET2 ip link set veth3 upsudo ip netns exec NET1 route add default gw 10.0.0.2sudo ip netns exec NET2 route add default gw 10.1.1.1

Page 15: Lagopus as open flow hybrid switch 実践編

lagopusを起動してからIPアドレス付与

sudo lagopus -d -C ./l2bridge.dsl

一方別の端末から

sudo ip addr add 10.0.0.2/24 dev veth0sudo ip addr add 10.1.1.1/24 dev veth2sudo ip netns exec NET1 ping 10.1.1.2PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.64 bytes from 10.1.1.2: icmp_seq=1 ttl=63 time=0.117 ms64 bytes from 10.1.1.2: icmp_seq=1 ttl=63 time=1.59 ms (DUP!)64 bytes from 10.1.1.2: icmp_seq=2 ttl=63 time=0.020 ms64 bytes from 10.1.1.2: icmp_seq=2 ttl=63 time=0.673 ms (DUP!)64 bytes from 10.1.1.2: icmp_seq=3 ttl=63 time=0.024 ms64 bytes from 10.1.1.2: icmp_seq=3 ttl=63 time=0.690 ms (DUP!)

あれ?

Page 16: Lagopus as open flow hybrid switch 実践編

設定対象の誤りでした。

● veth0やveth2にIPアドレスを振ってはいけない。

● LagopusとLinuxのネットワークスタックが同時に動いていた。

● veth0→if0、veth2→if2に訂正して、再度試す。

$ sudo ip netns exec NET1 ping 10.1.1.2PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.64 bytes from 10.1.1.2: icmp_seq=1 ttl=63 time=1.43 ms64 bytes from 10.1.1.2: icmp_seq=2 ttl=63 time=0.957 ms64 bytes from 10.1.1.2: icmp_seq=3 ttl=63 time=1.73 ms64 bytes from 10.1.1.2: icmp_seq=4 ttl=63 time=1.02 ms64 bytes from 10.1.1.2: icmp_seq=5 ttl=63 time=1.41 ms

OK!

tapにIPアドレスつけるって解説しておいてこれでしたorz

Page 17: Lagopus as open flow hybrid switch 実践編

動かしてみよう(L3編)正しい図はこちら

● veth0やveth2は、DPDK PMDで動かしているときには、見えない。

● 1:1で対応するtapインタフェースがLagopus起動時に作成される。

● confやDSLに書かれたinterfaceの名前がそれ。

● tapインタフェースに対してIPアドレスを付与する。

NET1 NET2(default)

LagopusL3Engineveth0veth1 veth3veth2

10.0.0.1/24 10.1.1.2/24

10.0.0.2/24 10.1.1.1/24

if0 if2

Page 18: Lagopus as open flow hybrid switch 実践編

最後に、バグのお知らせorz● (./configure --disable-dpdkつきでビルドしてください)● DPDKありでビルドして試すと、rawsocket only modeで動くはずである。

● rawsocket only modeとは○ DPDKありでビルドして rawsocketしか使わない起動コマンドラインで Lagopusを起動する

○ すると、DPDKの機能を使わず、 --disable-dpdkでビルドしたのと同じように動作する

● のはずが、なぜか0.2.8ではDPDK前提のコードに突入して、落ちました。orz● 調査して修正しますので、しばらくお待ちください……