Slide 1

Slide 1 text

Event Driven BGPD BGP によるコナミコマンド Shintaro Kojima コーダンス/@codeout "Domino" by Jeff Pioquinto, SJ is licensed under CC BY 2.0

Slide 2

Slide 2 text

Event Driven ? ʮೖྗʹରͯ͠Կ͔͢Δʯͱ͍͏ҙຯͰ͸ ΋ͱ΋ͱϧʔλʔ͸&WFOU%SJWFO ύέοτ ܦ࿏ ύέοτ ܦ࿏ やれるよ?

Slide 3

Slide 3 text

Event Driven ? ͦΕͰ͸ෆे෼Ͱɺೖྗʹରͯ͠ ೚ҙͷϓϩάϥϜ࣮ߦΛ͸͞Έ͍ͨ ύέοτ ܦ࿏ ύέοτ ܦ࿏ ϓϩάϥϜ

Slide 4

Slide 4 text

Event Driven ? ύέοτసૹʹ ϓϩάϥϜ࣮ߦΛ͸͞Ήͷ͸ εϧʔϓοτ͕଍Βͳ͍͕ɺ ܦ࿏సૹͳΒ͍͚ΔͷͰ͸ʂ

Slide 5

Slide 5 text

BMP があった ܦ࿏ ܦ࿏ Adj RIBs-In Loc RIB 3PVUF'JMUFS ϓϩάϥϜ

Slide 6

Slide 6 text

興味があるのはLoc-RIB ܦ࿏ ܦ࿏ Adj RIBs-In Loc RIB 3PVUF'JMUFS ϓϩάϥϜ もっと言うと Best Path

Slide 7

Slide 7 text

やりたいこと શϧʔλʔͷ#FTU1BUIมԽʹϑοΫͯ͠ w ଞࣾͷܦ࿏มԽΛ͔ͭ·͑Δ w ॏཁͳมԽΛ௨஌ w มԽͨ͠ΒϧʔλʔͷઃఆΛม͑Δ w #(1$PNNVOJUZʹԠͯ͡ૹ৴ܦ࿏Λʜ w /FYUIPQ͕มΘͬͨΒͦΕΛίϐʔʜ w ϝϯςφϯε࣌ͷܦ࿏֬ೝΛϥΫʹ w ੍ޚର৅͕Ͳ͏มΘ͔ͬͨ௨஌

Slide 8

Slide 8 text

実装した J#(1 1VCMJTI 4VCTDSJCF ܦ࿏มԽ τϦΨʔͰ ઃఆมߋ &WFOU%SJWFO #(1% ϓϩάϥϜ ϓϩάϥϜ

Slide 9

Slide 9 text

サンプル実装 w IUUQTHJUIVCDPNDPEFPVUFWFOUESJWFOCHQE w ௨ৗ͸σϑΥϧτϧʔτͷΈ޿ࠂ w ಛఆͷܦ࿏Λɺܾ·ͬͨॱ൪ʹड৴ͨ͠Β
 ϑϧϧʔτΛ޿ࠂ͠͸͡ΊΔ codeout/event-driven-bgpd

Slide 10

Slide 10 text

サンプル実装 σϞಈը ͨͿΜ https://youtu.be/4uQqg7uXqwY

Slide 11

Slide 11 text

コナミコマンド #!/bin/sh gobgp global rib add 10.0.0.0/8 community 65000:38 # ↑ gobgp global rib del 10.0.0.0/8 gobgp global rib add 10.0.0.0/8 community 65000:38 # ↑ gobgp global rib add 10.0.0.0/8 community 65000:40 # ↓ gobgp global rib del 10.0.0.0/8 gobgp global rib add 10.0.0.0/8 community 65000:40 # ↓ gobgp global rib add 10.0.0.0/8 community 65000:37 # ← gobgp global rib add 10.0.0.0/8 community 65000:39 # → gobgp global rib add 10.0.0.0/8 community 65000:37 # ← gobgp global rib add 10.0.0.0/8 community 65000:39 # → gobgp global rib add 10.0.0.0/8 community 65000:66 # B gobgp global rib add 10.0.0.0/8 community 65000:65 # A gobgp global rib del 10.0.0.0/8 gobgp neighbor 192.168.0.64 reset # Start なにそれ? と思ったら ググって

Slide 12

Slide 12 text

サンプル実装 ࣮૷͸೉͘͠ͳ͍ #(1% w &WFOUΛ2VFVFʹ౤͛Δ෦෼͚ͩॻ͍ͯɺ
 #(1%ͱͯ͠ͷ;Δ·͍͸HPCHQEʹཔΔ w "1*Λୟ͚ͩ͘ ϓϩάϥϜ w &WFOUΛ2VFVF͔Βऔ͖ͬͯͯԿ͔͢Δ w ໨త͝ͱʹখ͘͞ॻ͘ɻݴޠ͸ͳΜͰ΋0,

Slide 13

Slide 13 text

Queue に イベントを投げる &WFOU%SJWFO #(1% // setup kafka client, err := kafka.NewProducer() if err != nil { log.Fatal(err) } // monitor new routes and peer state w := s.Watch(gobgp.WatchBestPath(), gobgp.WatchPeerState(false)) for { select { case ev := <-w.Event(): switch msg := ev.(type) { case *gobgp.WatchEventBestPath: client.SendPathListMessage(msg) case *gobgp.WatchEventPeerState: client.SendPeerStateMessage(msg) } } } kafka ドライバー初期化 Best Path が 変化したら処理する。 変化があるまでブロック

Slide 14

Slide 14 text

Queue から イベントを取ってくる kafka = Kafka.new(seed_brokers: 'localhost:9092') handler = EventHandler.new('10.0.0.0/8') kafka.each_message(topic: 'edb', start_from_beginning: false) do |message| handler.process message.value end イベントが取れたら 処理する。 取れるまでブロック ϓϩάϥϜ kafka、イベントハンドラー ドライバー初期化

Slide 15

Slide 15 text

イベントハンドラー def configure_peer if @sequence==KONAMI @gobgp.update_policy default_accept: true else @gobgp.update_policy default_accept: false end end def process(event) event = JSON.parse(event) case event['type'] when 'peer_state' process_peer_state event['value'] when 'best_path' process_best_path event['value'] unless event['value']['withdrawal'] end end ピア状態イベントの処理 落ちたらコナミ判定 ϓϩάϥϜ コナミの並びなら 広告ポリシーを変える Best Path 変化イベントの処理 Update の履歴を記録

Slide 16

Slide 16 text

そんなに難しくない w શ෦ͰϑΝΠϧɺߦ w ͑ͬʂͨͬͨͦΕ͚ͩʁ؆୯ event-driven-bgpd $ ls bgpd/**/*.go konami/**/*.rb~*_pb.rb bgpd/kafka/client.go konami/event_handler.rb konami/subscriber.rb bgpd/main.go konami/gobgp_client.rb event-driven-bgpd $ cat bgpd/**/*.go konami/**/*.rb~*_pb.rb | wc -l 209

Slide 17

Slide 17 text

まとめ w &WFOU%SJWFO#(1%Λͭ͘Δͷ͸
 ͦΜͳʹ೉͘͠ͳ͍ w طଘωοτϫʔΫʹ෇Ճ͠΍͍͢Α͏J#(1Ͱ w ӡ༻ίετ͕Լ͕ͬͨΓɺ"1*ͱͯ͠ͷ#(1Λఏڙ Ͱ͖ΔՄೳੑ͕͋Δ • "show route" ΛݮΒ͢ • #(1ͰϦΫΤετΛड͚ͯαʔϏεઃఆΛม͑Δ ΂ΜΓͰ͢Αʂͥͻࢼͯ͠Έ͍ͯͩ͘͞