Upgrade to Pro — share decks privately, control downloads, hide ads and more …

走りながら作るネットワークテンプレートシステム / Developing Network Te...

走りながら作るネットワークテンプレートシステム / Developing Network Template System for Automation and Policy Enforcement

JANOG47 の発表スライドです。

https://www.janog.gr.jp/meeting/janog47/template/

ネットワーク運用のために自動化は必須です。ミクシィでも、従来の手動オペレーションを許容しながら 自動オペレーションへの移行に取り組んでいます。 現在、個々の業務を自動化するのではなく、テンプレートシステムを使って完全なネットワーク設定を生成しています。これによって、ネットワークのあるべき形・現状とのズレが可視化され、「ネットワークが常に正しく設定されている」状態を維持できるようになりました。 このセッションでは、既存ネットワークにテンプレートを導入した手法、それによって変化したネットワーク運用、効果について紹介します。最後に現在直面している課題、たとえばリソースアサインの自動化・可視化された設定差分が破壊的かどうかの自動判定・パラメーター抽象度の問題について共有し、議論したいと思います。

Shintaro Kojima

February 12, 2021
Tweet

More Decks by Shintaro Kojima

Other Decks in Technology

Transcript

  1. ݱࡏɺωοτϫʔΫӡ༻ͷࣗಈԽʹऔΓ૊ΜͰ͓Γɺ ςϯϓϨʔτ͔Β ׬શͳωοτϫʔΫઃఆΛੜ੒͍ͯ͠·͢ɻ ◦ ͳͥ ͦͷΞϓϩʔν͔ ◦ ςϯϓϨʔτγεςϜͷ։ൃํ๏ ◦ ޮՌɾ՝୊ͷڞ༗

    ˠٞ࿦ 本⽇ 話すこと 完成してから商用投入だと めちゃくちゃ遅い ૸Γͳ͕Β ະ׬ͷঢ়ଶͰσϓϩΠɾ঎༻Ͱಈ͔͠ͳ͕Β։ൃ͢ΔελΠϧ
  2. ͨͱ͑͹ɺ͜ͷهड़͸ 👉 • #(1ϐΞ • JOUFSGBDF ෺ཧɾMPPQCBDL ◦ QBDLFUGJMUFS ◦

    TGMPX • %%P4ରࡦ༻ϧʔςΟϯά͍Ζ͍Ζ ͷઃఆΛੜ੒͢ΔɻʮύϥϝʔλʔΛೖྗ͢Ε͹ؔ࿈ͷઃఆ͕ੜ੒͞ΕΔʯ ͘͠Έ͕ϧʔλʔɾεΠονͷશػೳ෼͋ͬͯɺύϥϝʔλʔΛ૊Έ߹ΘͤΔ ͜ͱͰ׬શͳ SVOOJOHDPOGJHΛੜ੒͢Δɻ テンプレート︖ bgp: peers: - type: ddos_transit_xxx neighbor_as: xxx neighbor_address: x.x.x.x
  3. খౡ ৻ଠ࿠ • codeout ( GitHub / Twitter ) •

    https://about.me/codeout • גࣜձࣾϛΫγΟ ։ൃຊ෦ Πϯϑϥࣨ • ΍͍ͬͯΔ͜ͱωοτϫʔΫઃܭɾӡ༻ • ۀ຿ҕୗϝϯόʔ ◦ ຊ੶ גࣜձࣾίʔμϯε ⾃⼰紹介 ֤ࣾͷ঎඼·ͨ͸αʔϏεͳͲͷ໊শ͸ɺ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
  4. DC #1 • .VMUJ5FOBOU ◦ .1-4WQOJQW 1& • .VMUJ$MPVE •

    .VMUJ7FOEPS • #(1$-04 ◦ +"/0( 041'Ͱ5P3·Ͱ-ʹͯ͠Έͨ ◦ +"/0( ଓ︕(PPECZF*1W0O-5P3ˠ#(1Խ 🎉 • /"5 • -# • ϕϯμʔ੡ --ػثத৺ • -ػث ◦ +"/0( ϗϫΠτϘοΫε఻ૹͷಈ޲ͱ঎༻ར༻ʹ͍ͭͯ ミクシィのネットワーク DC #N Leafs Cloud #1 Cloud #2 Cloud #3 Peers Transits Spines Leafs NAT LB Spines
  5. खಈΦϖϨʔγϣϯத৺ ◦ (JU0QT $IBU0QT ◦ πʔϧͷख͸आΓΔ͕ɺࣗಈઃఆʹ ࢸ͍ͬͯͳ͍ ミクシィのネットワーク運⽤ Network Bots

    Tools Ops team GitHub PR Operation 1VMM3FRVFTU࡞੒ɾϨϏϡʔ͕ͭΒ͍ɻ ϧʔςΟϯάϙϦγʔΛཧղ͍ͯͯ͠΋ɺͦΕͧΕ ਺͔͔࣌ؒͬͨΓ͍ͯͨ͠ 課 題 ֤ࣾͷ঎඼·ͨ͸αʔϏεͳͲͷ໊শ͸ɺ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
  6. දهΏΕ ◦ 'PP#BSUSBOTJUPS'#USBOTJU ◦ JOPVUPSJNQPSUFYQPSU ◦ EFOZQFSNJUPSSFKFDUBDDFQU ◦ PS@ ◦

    େจࣈɾখจࣈ ◦ ແݶʹ͋ͬͨ 設定が標準化されてなかった 😭 peer group 面倒くさい ϧʔςΟϯάϙϦγʔΏΕ ◦ QSFGJYMJTU ◦ BTQBUIMJTU ◦ NBYQSFGJYMJNJU ◦ ໊લ͸ಉ͕ͩ͡ɺεΠον͝ͱʹ த਎͕ҧ͏ ◦ ਺ͦ͜গͳ͍͕ɺ मਖ਼ʹؾΛ࢖͏΍ͭ
  7. • ϏδωεΛࢭΊͳ͍ ◦ ʮࣗಈԽͷલʹ ඪ४Խ͠·͠ΐ͏ʯˠਖ਼͍͠ɻͰ΋஗͍ɻඪ४Խ͠ͳ͕ΒࣗಈԽ͍ͨ͠ ◦ ඪ४Խ͞Ε͍ͯͳ͍ઃఆ΋ڐ༰͍ͨ͠ ◦ ࣗಈͷ࢓૊Έ͕ఆண͢Δ·ͰɺखಈΦϖϨʔγϣϯΛڐ༰͍ͨ͠ •

    ಛఆϋʔυ΢ΣΞɾιϑτ΢ΣΞʹϩοΫΠϯ͞Εͳ͍ ◦ ઃඋ͸ϚϧνϕϯμʔɻΦʔέετϨʔλʔ΋ม͍͖͍͑ͯͨ • $MPTFEMPPQBVUPNBUJPOΛ໨ࢦ͍ͨ͠ ◦ ωοτϫʔΫΠϕϯτൃੜ ˠࣗಈରॲ ˠωοτϫʔΫΠϕϯτൃੜɺͷϧʔϓ ◦ ྫ௨৴඼࣭͕ᮢ஋ΛԼճͬͨ ᷖճ࿏͕͋Ε͹ɺᷖճ͢Δ 構想
  8. 宣⾔的ネットワーキングと従来⼿法の対⽐ ݱࡏͷ ωοτϫʔΫͷঢ়ଶ ͋Δ΂͖ ωοτϫʔΫͷঢ়ଶ ݱࡏͷ ωοτϫʔΫͷঢ়ଶ ͋Δ΂͖ ωοτϫʔΫͷঢ়ଶ ো֐ʹΑΔॖୀ

    ෮چϓϩηεͷ࣮ߦ 2. 手続き的アプローチで あるべき状態にもどす 2. 1 と比較 ো֐ʹΑΔॖୀ ෮چϓϩηεͷ࣮ߦ 3. 手続き的アプローチで あるべき状態にもどす 1. これを記述して ैདྷͷωοτϫʔΫӡ༻ એݴతωοτϫʔΩϯά 1. これを検知して
  9. 宣⾔的ネットワーキングと従来⼿法の対⽐ ݱࡏͷ ωοτϫʔΫͷঢ়ଶ ͋Δ΂͖ ωοτϫʔΫͷঢ়ଶ ݱࡏͷ ωοτϫʔΫͷঢ়ଶ ͋Δ΂͖ ωοτϫʔΫͷঢ়ଶ ো֐ʹΑΔॖୀ

    ෮چϓϩηεͷ࣮ߦ 2. 手続き的アプローチで あるべき状態にもどす 2. 1 と比較 ো֐ʹΑΔॖୀ ෮چϓϩηεͷ࣮ߦ 3. 手続き的アプローチで あるべき状態にもどす 1. これを記述して ैདྷͷωοτϫʔΫӡ༻ એݴతωοτϫʔΩϯά 1. これを検知して 私たちの場合、やりたいのは 「業務ごとの手続きや 障害ごとの手続きを 自動化する」 ではなかった。 パターンの網羅は時間が かかり、手動オペを行うので ゴミが生まれる。ゴミは掃除 するべき。
  10. 宣⾔的ネットワーキングと従来⼿法の対⽐ ݱࡏͷ ωοτϫʔΫͷঢ়ଶ ͋Δ΂͖ ωοτϫʔΫͷঢ়ଶ ݱࡏͷ ωοτϫʔΫͷঢ়ଶ ͋Δ΂͖ ωοτϫʔΫͷঢ়ଶ ো֐ʹΑΔॖୀ

    ෮چϓϩηεͷ࣮ߦ 2. 手続き的アプローチで あるべき状態にもどす 2. 1 と比較 ো֐ʹΑΔॖୀ ෮چϓϩηεͷ࣮ߦ 3. 手続き的アプローチで あるべき状態にもどす 1. これを記述して ैདྷͷωοτϫʔΫӡ༻ એݴతωοτϫʔΩϯά 1. これを検知して むしろ 「あるべき形をどう 記述するか」 「どう比較するか」 「収束させるための 手続きを どう 汎用化するか」 という問題だった
  11. ؆୯ͳϨϕϧͰΑ͚Ε͹ɺ ͋Δ΂͖ܗͷએݴ ωοτϫʔΫ૷ஔͷઃఆ ͳͷͰ͸ʁ ◦ ωοτϫʔΫ૷ஔΛઃఆ͢Δͱ ͦͷܗʹऩଋ͠Α͏ͱ͢Δɻͨͩ͠એݴͱͯ͠࢖͏ͨΊʹ ৚͕݅͋Δ ◦ DBOEJEBUFDPOpHΛɺBUPNJD

    ʹ DPNNJUͰ͖Δ͜ͱ ◦ ଘࡏ͠ͳ͍ઃఆ͸ OPEFMFUF͠ͳͯ͘΋ ফ͑Δ͜ͱ • ຊ౰ʹٻΊ͍ͯΔ΋ͷͰ͸ͳ͍ɻϓϩτίϧ͕૝ఆ͢Δʮ͋Δ΂͖ܗʯ͸ ຊདྷͷϏδωεཁ݅ʹ߹Θͳ͍ ◦ ❌ ,FFQBMJWF1%6͕ /ί࿈ଓͰམͪͳ͍ ◦ ⭕ 1BDLFUMPTT/ ◦ ⭕ ΩϟύγςΟͷ /·ͰτϥϑΟοΫΛ৐ͤΔ 宣⾔の抽象度・粒度の問題
  12. ◦ ؆୯ͳϨϕϧͰΑ͚Ε͹ɺ ͋Δ΂͖ܗͷએݴ ωοτϫʔΫ૷ஔͷઃఆ ͳͷͰ͸ʁ ◦ ωοτϫʔΫ૷ஔΛઃఆ͢Δͱ ͦͷܗʹऩଋ͠Α͏ͱ͢Δɻͨͩ͠એݴͱͯ͠࢖͏ͨΊʹ৚ ͕݅͋Δ ◦

    DBOEJEBUFDPOpHΛɺBUPNJD ʹ DPNNJUͰ͖Δ͜ͱ ◦ ଘࡏ͠ͳ͍ઃఆ͸ OPEFMFUF͠ͳͯ͘΋ ফ͑Δ͜ͱ • ຊ౰ʹٻΊ͍ͯΔ΋ͷͰ͸ͳ͍ɻϓϩτίϧ͕૝ఆ͢Δʮ͋Δ΂͖ܗʯ͸ ຊདྷͷϏδωεཁ݅ʹ߹Θͳ͍ ◦ ❌ ,FFQBMJWF1%6͕ /ί࿈ଓͰམͪͳ͍ ◦ ⭕ 1BDLFUMPTT/ ◦ ⭕ ΩϟύγςΟͷ /·ͰτϥϑΟοΫΛ৐ͤΔ 宣⾔の抽象度・粒度の問題 •あるべき形をどう記述するか •どう比較するか •収束させるための手続きを どう汎用化するか という問題は、あるべき形の宣言粒度を プロトコルに合わせることで、「ネットワーク 機器の設定をどうモデル化するか」まで簡単に できる。 ( 私たちは初手として、それでOK )
  13. • ۀ຿ɾো֐ύλʔϯͷ໢ཏʹ͕͔͔࣌ؒΔͱ൑அ͔ͨ͠Β ◦ "OTJCMFͰ͍͏ QMBZCPPLΛ໢ཏతʹॻ͚ͳ͍ • खಈΦϖϨʔγϣϯΛڐ༰͍͔ͨ͠Β ◦ खಈΦϖϨʔγϣϯ͕ϛε͍ͬͯͨΒݕ஌͍ͨ͠ •

    $MPTFEMPPQBVUPNBUJPOΛ໨ࢦ͍ͯ͠Δ͔Β ◦ ʮ͋Δ΂͖ܗʯͷએݴ͕ඞཁʹͳΔ ここまでのまとめ: テンプレート⽅式を選択した理由
  14. 全体像 Network Database export yaml Template Orchestrator push pull roll

    out モデル化された ネットワーク記述 .yaml テンプレートは、 Orchestrator から呼べるように GitHub ֤ࣾͷ঎඼·ͨ͸αʔϏεͳͲͷ໊শ͸ɺ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
  15. .yaml を DB と テンプレートの interface にする Network Database export

    Template Orchestrator push pull roll out GitHub yaml ࣗ෼͕ͨͪεΩʔϚΛܾΊɺఆٛͨ͠Ϟσϧɻ εΩʔϚʹ४ڌ͍ͯ͠ΔݶΓɺ %#ςϯϓϨʔτ͸޷͖ʹ։ൃͯ͠0, ֤ࣾͷ঎඼·ͨ͸αʔϏεͳͲͷ໊শ͸ɺ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
  16. マージは git にまかせる Network Database export yaml Template Orchestrator roll

    out push pull มߋ͍ͨ͠ͱࢥͬͯ13࡞੒ͨ͋͠ͱɺ Ϟσϧ͕มΘΔ͔΋͠Εͳ͍ɻ σϓϩΠલʹ SFCBTF͢Δɻ GitHub ֤ࣾͷ঎඼·ͨ͸αʔϏεͳͲͷ໊শ͸ɺ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
  17. 現在の開発状況 Network export yaml Template push pull roll out WIP。いまは

    オペレーターが .yaml を編集 ワークフロー整理中。 既存の GitOps + 手動オペレーション で設定している GitHub ֤ࣾͷ঎඼·ͨ͸αʔϏεͳͲͷ໊শ͸ɺ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻ
  18. 1BUDI • Ϟσϧʹ͸ ࣗ༝هड़ཝ ඪ४Խ͕·ͩ ͕͋ΓɺςϯϓϨʔτग़ྗ ඪ४ԽࡁΈ ͱ͚ͬͭͯ͘ग़ྗ • ঃʑʹඪ४ԽΛਐΊΒΕɺʮඪ४֎ͷઃఆʯΛ؅ཧͰ͖Δ

    • 1BUDIඪ४ Λ໨ࢦ͢ɻఆྔධՁͰ͖Δ 標準化しながら⾃動化したい・標準外も許容したい ඪ४ԽࡁΈ ඪ४Խ͕·ͩ ඪ४ԽࡁΈ ඪ४Խ͕·ͩ ඪ४ԽࡁΈ ポイント!
  19. %JGG • ઃఆॱংɾ࡟আ ͳͲΛΑ͠ͳʹߟྀͨ͠EJGGɻ ςϯϓϨʔτग़ྗͱ SVOOJOHDPOGJHΛຖ೔ൺֱ • ߏจղੳ • ʮ͋Δ΂͖ܗʯ͕ઃఆ͞Ε͍ͯΔ͔ɺݫີʹνΣοΫ

    ⼿動オペレーションを許容したい set interfaces xe-0/0/0 unit 10 family inet filter input foo_filter set interfaces xe-0/0/0 unit 10 family inet address 10.0.10.1/30 set interfaces xe-0/0/0 unit 20 family inet filter input foo_filter set interfaces xe-0/0/0 unit 20 family inet address 10.0.20.1/30 delete interfaces xe-0/0/0 unit 10 set interfaces xe-0/0/0 unit 11 family inet filter input bar_filter set interfaces xe-0/0/0 unit 11 family inet address 10.0.11.1/30 set interfaces xe-0/0/0 unit 11 family inet filter input bar_filter set interfaces xe-0/0/0 unit 11 family inet address 10.0.11.1/30 set interfaces xe-0/0/0 unit 20 family inet filter input foo_filter set interfaces xe-0/0/0 unit 20 family inet address 10.0.20.1/30 ςϯϓϨʔτग़ྗ SVOOJOHDPOpH 
  20.  Ϗδωε൑அʹΑΓɺ ωοτϫʔΫʹೖΕΔ  EJGGʹΑͬͯݕ஌͞Εɺ 1BUDI ͢Δ  ඪ४Խ͢Δ΂͖͔ٞ࿦͠ɺ ςϯϓϨʔτԽ͢Δ

    ⼿動で⼊れた設定のライフサイクル ωοτϫʔΫʹ ઃఆ͞Ε͍ͯΔ ⁞   ⁠ ඪ४Խ͞Ε͍ͯΔ ςϯϓϨʔτԽ͞Ε͍ͯΔ 1BUDI͞Ε͍ͯΔ
  21. ޮ཰ ◦ 13࡞੒ ɾϨϏϡʔ͕Ұॠ ◦ ϞσϧZBNM ͚ͩͰ0, ◦ ϕϯμʔͷҧ͍Λؾʹ͠ͳͯ͘ྑ͘ͳͬͨ 🎉

    ϒϨͳ͍ωοτϫʔΫϙϦγʔ ◦ ωοτϫʔΫ͕ਖ਼͘͠ઃఆ͞Ε͍ͯΔɺͱ͍͏҆৺ײ ◦ ϛεɾΰϛ͕ࠞೖ͠ͳ͍ ◦ ωοτϫʔΫશମͰ੔߹ੑ͕ͱΕΔ 得られたもの
  22. 課題1: ⾃動リソースアサイン p2p 10.0.0.0/30 10.0.0.4/30 10.0.0.8/30 U U /30 1コ

    必要 /30 1コ 必要 13࡞੒ 13࡞੒ ༧໿ ༧໿ ར༻த 設定した /30 もう1コ 必要 ༧໿ やっぱやめるわ औফ
  23. • ΞαΠϯ͢ΔλΠϛϯά͸ɺHJU DPNNJUΑΓલ ◦ ͱ͍͏͔೚ҙλΠϛϯά • 13NFSHFɾ DMPTFͷλΠϛϯάͰɺΞαΠϯͨ͠΋ͷΛ֬ఆɾऔফ ◦ 13ʹ

    *1ΞυϨε͕ฒΜͰ͍ͨͱͯ͠ɺ ͲΕ͕ݻఆͰͲΕ͕ࣗಈΞαΠϯ͔൑அͰ͖ΔͩΖ͏͔ʁ • ਓྗͰ͸Մೳͩͬͨʮ࿈൪Ͱཉ͍͠ͷͰ͜͜ৡͬͯ΋Β͑·ͤΜ͔ʯͱ͔͸ ఘΊͳ͍ͱ͍͚ͳ͍ʁ • *1".͸ 13ͱ࿈ಈͰ͖Δͷ͔ʁ 課題1: ⾃動リソースアサイン
  24. • ͋Δ΂͖ܗ͸෼͔͍ͬͯΔɻࠩ෼΋औΕΔ • ഁյతͳมߋ͸खಈͰ΍Γ͍ͨɻ࣮੷͋Δมߋ͸ࣗಈ౤ೖ͍ͨ͠ • มߋΛͲ͏΍ͬͯ෼ׂ͢Δʁ ◦ खಈͰ HJUDPNNJU෼͚ΔΞϓϩʔνΛߟ͑த ◦

    ۀ຿͝ͱͷࣗಈԽͰ͸ؾʹ͠ͳͯ͘Α͔ͬͨ఺ • ෼ׂͨͦ͠ΕͧΕ͕ഁյత͔Ͳ͏͔ɺ൑ఆՄೳ͔ʁ 課題2: 設定デプロイ ݱࡏͷ ωοτϫʔΫ ঢ়ଶ ͋Δ΂͖ ωοτϫʔΫ ঢ়ଶ DFC CF
  25. • ຊདྷఆ͍ٛͨ͠ʮ͋Δ΂͖ܗʯ ◦ ͨͱ͑͹2P4 👉 ◦ ܭଌ͍ͨ͠ϝτϦοΫ͸ɺ ෳ਺ཁૉͷӨڹΛड͚Δ 🤔 •

    ݱঢ়ʮωοτϫʔΫઃఆΛϞσϧԽͨ͠ʯʹ ͗͢ͳ͍ ◦ ந৅౓Λ্͛ΒΕΔͷ͔ʁ ◦ *OUFOUCBTFEͰॻ͚Δʁ ◦ ྫΫϥ΢υͱे෼ͳଳҬͰ઀ଓ͍ͨ͠ 課題3: モデルの抽象度 bgp: peers: - type: ddos_transit_xxx neighbor_as: xxx neighbor_address: x.x.x.x limits: packet_loss: - target: 10.0.0.1 threshold: 10**-5 latency: - target: 10.0.0.1 threshold: 10 # ms action: depref bandwidth: 10 # Gbps action: notify