NTT Tech Conference 2023(https://ntt-developers.github.io/ntt-tech-conference/2023/) マルチベンダに対応したネットワークコントローラを OSS として公開している話 Track1 16:15〜
© NTT Communications Corporation All Rights Reserved.マルチベンダに対応したネットワークコントローラを OSS として開発している話NTT コミュニケーションズイノベーションセンター テクノロジー部⾨Testbed-Service PF PJ⽵中 幹
View Slide
© NTT Communications Corporation All Rights Reserved. 2名前: ⽵中 幹 (たけなか もとき)所属: イノベーションセンター テクノロジー部⾨Testbed-Service PF PJ出⾝: 兵庫県 加古川市趣味: ちいかわ、ポーカー業務: Multi-AS Segment Routing (SR-MPLS, SRv6)に関する技術検証SR網運⽤効率化のためのコントローラ開発=>本セッションの関連内容Testbed の運⽤・更改⾃⼰紹介
© NTT Communications Corporation All Rights Reserved. 3Pola PCESegment Routing ネットワークにおいてパス管理を⾏うことができるネットワークコントローラGo ⾔語による実装• クライアントサーバシステムを導⼊しやすい標準機能RFC/I-D 準拠・マルチベンダ対応• ルータとの通信に利⽤するプロトコルが双⽅を満たす実装OSS 公開• コミュニティによる既存機能のメンテナンス & 新規機能の追加• 利⽤者が増えることによるクライアント実装の充実• NTT Com のプレゼンス向上本セッションでは Pola PCE の開発・運⽤の中で得た知⾒をお話しします︕
© NTT Communications Corporation All Rights Reserved. 4本セッションで話すこと・話さないこと
© NTT Communications Corporation All Rights Reserved. 5本セッションで話すことPola PCE を OSS として実装してみてü RFC/I-D 準拠・マルチベンダ対応したネットワークコントローラ実装について• RFC/I-D に準拠した実装• マルチベンダに対応した実装ü OSS 化するにあたって• プロダクトを使ってもらうための⼯夫• コントリビュータを増やすための⼯夫• 良いコードを書くための⼯夫ü Go ⾔語でクライアントサーバシステムを実装してみた感想• 学習コストについて• goroutine と channel によるサーバ実装• interface を使ってコード整理
© NTT Communications Corporation All Rights Reserved. 6本セッションで話さないことü OSS の詳細• 発表資料https://speakerdeck.com/watal/da-gui-mo-srwang-falseyun-yong-woxiao-lu-hua-surunetutowakukontororafalsekai-fa-ntt-tech-conference-2022• Pola PCE に関するブログhttps://engineers.ntt.com/entry/2022/12/20/090000• GitHubhttps://github.com/nttcom/polaü Segment Routing 技術に関する話• 発表資料https://mpls.jp/2021/presentations/20211101_MPLSJAPAN_NTTCOM_tajima_pub.pdf• ブログhttps://engineers.ntt.com/entry/2022/06/13/090000ü NTT グループにおいて OSS 公開にいたるまでの事務的な⼿続きあれこれ
© NTT Communications Corporation All Rights Reserved. 7Pola PCE (再掲)Segment Routing ネットワークにおいてパス管理を⾏うことができるネットワークコントローラGo ⾔語による実装• クライアントサーバシステムを導⼊しやすい標準機能RFC/I-D 準拠・マルチベンダ対応• ルータとの通信に利⽤するプロトコルが双⽅を満たす実装OSS 公開• コミュニティによる既存機能のメンテナンス & 新規機能の追加• 利⽤者が増えることによるクライアント実装の充実• NTT Com のプレゼンス向上TCP コネクションの上で新しめのプロトコルを複数のクライアント(ルータ)と対話するネットワーク管理サーバのようなもの
© NTT Communications Corporation All Rights Reserved. 8RFC/I-D 準拠・マルチベンダ対応したネットワークコントローラ実装について
© NTT Communications Corporation All Rights Reserved. 9RFC/I-D に準拠したサーバ実装例えば HTTP サーバの場合...引⽤: https://gobyexample.com/http-serversサーバ機能に必要な• クライアントからのリクエストパケットの受信• リクエストパケットの解析• レスポンスパケットの作成• クライアントへのレスポンスパケットの送信を net/http ライブラリが⾏なっている
© NTT Communications Corporation All Rights Reserved. 10RFC/I-D に準拠したサーバ実装なぜ net/http ライブラリの処理が多種多様なクライアントとの通信に使えるか?=> HTTP の標準化された技術仕様に従った通信や処理を⾏っているから通信プロトコルはインターネット標準化団体 IETF によって標準仕様が決められるRFC(Request For Comment):IETF の発⾏するインターネット技術仕様などについての⽂書群⽂書ごとに通番が与えられるI-D (Internet-Draft):RFC 登録前の草案⽂書https://datatracker.ietf.org/doc/html/rfc9112
© NTT Communications Corporation All Rights Reserved. 11RFC/I-D に準拠したコントローラ実装ネットワークコントローラ実装において、通信プロトコル⽤のライブラリが1. あるとき• 通信部分は既存ライブラリで賄えば良い• ネットワーク機器との間でどのような情報を受け渡しするかのみ考慮2. ないとき• 通信プロトコルライブラリから実装する• サーバ処理は⾃作プロトコルライブラリを import しつつ書く本セクション、より正確にはRFC/I-D に準拠したコントローラ実装Þ RFC/I-D に準拠したプロトコルライブラリ & コントローラ実装について⾔及します
© NTT Communications Corporation All Rights Reserved. 12RFC/I-D に準拠したコントローラ実装プロトコルライブラリがない場合...RFC に従ってパケットの構造とプロトコルセッションの動作を把握して実装する必要有︕例えば:• やりとりされるメッセージの種類・⽤途・パケット構造は?• プロトコルの Capability の指定⽅法は?• セッション終了の判断は?実装⽅法1. 既存製品のコントローラ・ルータ間のセッションをキャプチャしてパケット解析• 挙動を理解しつつ製品実装を真似したパケットを⽣成するだけのため⽐較的簡単2. ルータのクライアント実装と RFC/I-D から各挙動をステップバイステップで実装• RFC を読んで挙動を理解した上で実装しないと動かないので難しい どちらにしてもコードの修正が⾟い... ->->
© NTT Communications Corporation All Rights Reserved. 13実装中のコード修正プログラムエラー … コンパイル時・実⾏時にエラーの⾏数とエラー内容を出⼒プロトコルエラー … パケット解析するしかない...プロトコルのエラーメッセージ Wireshark の parse エラーバイト列と RFC を⾒⽐べて各フィールドのデータ・データ⻑・パディングなどが正しいか確認
© NTT Communications Corporation All Rights Reserved. 14RFC/I-D 実装 == マルチベンダ実装 ?RFC に沿った実装を⾏えばマルチベンダに対応した実装になる?HTTP などの枯れたプロトコルの実装に関していえば YESØ プロトコルの定義やその挙動が RFC によって詳細に標準化され、また共通認識されているため⼀⽅で、新しめのプロトコルに関しては NOØ ⼀部、値の定義が TBD (To Be Determined) となっている場合• 各ベンダーごとにルータのクライアント実装が独⾃で⾏われたりするØ プロトコルでの特定の情報のやりとり⾃体が未定義• 同様に各ベンダーごとに実装が独⾃で⾏われたりするRFC/I-D のバージョン追跡状況によってルータ側で実装がされていない可能性有
© NTT Communications Corporation All Rights Reserved. 15マルチベンダに対応したコントローラ実装セッションごとに Vendor Type のようなものを管理Vendor Type 判別はセッション確⽴時に利⽤したメッセージなどから⾏う良い点:• マルチベンダ対応ツールとして拡張・利⽤できる• (RFC 準拠実装が正しく⾏われていれば) ベンダー実装が RFC 準拠にアップデートされても正常に動作し続ける悪い点:• ベンダー実装が “⼀部” RFC 準拠にアップデートされた場合想定しない挙動となるコード管理に問題もつきまとうが、マルチベンダ環境で動いた時は⼀番楽しい︕
© NTT Communications Corporation All Rights Reserved. 16OSS 化するにあたって
© NTT Communications Corporation All Rights Reserved. 17OSS に関与してもらう⼈を増やすためにせっかく OSS 化したので広く関与してもらいたい• プロダクトを使ってもらうための⼯夫• コントリビューターを増やすための⼯夫• プロダクトの品質を⾼めるための⼯夫
© NTT Communications Corporation All Rights Reserved. 18プロダクトを使ってもらうためのExampleツールをすぐに試せる環境を準備ネットワークコントローラとしての課題:• 管理対象のネットワークそのものがまず必要• 試す環境の作成はコスト⾼すぎ問題Example を公開ワンコマンドでネットワーク & コントローラが準備できる(⼀部機能に制限があるが) FRRで構成される環境もあり
© NTT Communications Corporation All Rights Reserved. 19Docker Image を提供中• 実利⽤時のデプロイ簡略化• ホスト環境を汚さずにデプロイGitHub Actions によってタグを打ったタイミングで作成、 アップロードされるようにimage は GitHub Container Registry より Download 可能利⽤開始までの README も完備プロダクトを使ってもらうためのDocker Image
© NTT Communications Corporation All Rights Reserved. 20コードの⽤途ごとに配置するディレクトリを決定プロトタイプ作成段階で勉強会 & 設計会実施Pola PCE においては• ディレクトリ構成は Standard Go Project Layout(https://github.com/golang-standards/project-layout) を踏襲• ディレクトリの⽤途・コードの配置・各命名規則はGoBGP (https://github.com/osrg/gobgp) を踏襲あらかじめの設計で機能拡張やリファクタリングのストレス減最初期のディレクトリ構成案コントリビュータを増やすためのリポジトリ設計
© NTT Communications Corporation All Rights Reserved. 21実装の対象となる RFC/I-D が多いRFC 5440, 8231, 8281, 8664pce-segment-routing-policy-cp など各構造体や定数などに対象となる RFC/I-D の番号・セクションを記載=> コードや挙動の理解補助コントリビュータを増やすためのRFC 対応コメント
© NTT Communications Corporation All Rights Reserved. 22ディレクトリの定義は済んでいるため、細かいファイル単位での整理before (Pola PCE v1.0.0)after (Pola PCE v1.2.1)コード修正や機能追加の際の修正箇所特定が容易に︕プロダクトの品質を⾼めるためのリファクタリング
© NTT Communications Corporation All Rights Reserved. 23プロダクトの品質を⾼めるためのコード品質評価コードの品質を定量的に評価したいGo report Card を⽤いてオンラインで評価• go vet• 問題となり得る疑わしいコードがないか• gofmt• コードに整形できる箇所がないか• gocyclo• 循環的複雑度の⾼い関数がないか• ineffassign• 無駄な変数割り当てがないか• license• ライセンスがあるか• misspell• ミススペルがないかREADME にバッジをつけられる
© NTT Communications Corporation All Rights Reserved. 24単体テスト、結合テスト共に未実装(犯罪)ü 単体テスト• 単なるサボり• ⼈⼿が...機能拡張優先...• プロトコルエラーの解消に貢献しづらい• VS Code の Go 拡張機能で⾃動⽣成できるらしい (Go Generate Unit Test)ü 結合テスト• ないのがキツすぎる• 拡張・リファクタリング後の IPv4/IPv6 での動作確認に⼤体 30m ~ 1h ほど• テストのためのマルチベンダネットワークがそもそも必要• できれば GitHub Actions で⾃動化したいネットワークコントローラのテスト⼿法のアドバイス募集中...︕プロダクトの品質を⾼めるためのTest について
© NTT Communications Corporation All Rights Reserved. 25Go ⾔語でクラサバシステムを実装してみた感想
© NTT Communications Corporation All Rights Reserved. 26学習コストについて開発者 2⼈とも Go をまともに触ったことがなかったGo 不安ポイント:• 特殊な基本構⽂• goroutine と channel による並⾏処理• interface の⽤途どのスレッドで何を実⾏するかをイメージして構成を練れば実装は⽐較的容易
© NTT Communications Corporation All Rights Reserved. 27なぜ Go?クライアントサーバシステムのサーバ実装と相性が良さそうな標準機能が豊富goroutine … 指定した関数をマルチスレッドで⾮同期に実⾏するための機能各セッションごとにスレッドを分けて簡単に管理するなどが可能channel … スレッド間で情報(データ・シグナル)を共有する機能分割されたスレッドから分割元スレッドへ同期処理を依頼することが可能goroutine で簡潔にセッションをスレッド分割しつつ、必要に応じて channel で同期処理が可能
© NTT Communications Corporation All Rights Reserved. 28サーバ実装のサンプルモデルサーバクライアントサーバ操作者gRPC サーバクライアントクライアントTCP コネクション待受TCP コネクション上位層プロトコル処理TCP コネクション上位層プロトコル処理TCP コネクション上位層プロトコル処理サーバ情報の受信・更新コネクション維持プロトコルでの情報交換①①②③② ②③③
© NTT Communications Corporation All Rights Reserved. 29Go によるサーバ簡易実装例サーバメインスレッドgRPC Server ⽤スレッドTCP コネクション待機⽤スレッドerror受信待ちgoroutine でのスレッド分割channel での同期処理メインスレッドから 2 スレッド作成• gRPC リクエストの待ち受け• クライアントとの通信待ち受けどちらかのスレッドで処理が失敗した場合プログラム終了実装ポイント① 実装ポイント② 実装ポイント③TCPコネクション待機⽤スレッドTCP コネクション⽤スレッド1TCP コネクション⽤スレッド2TCP コネクション⽤スレッド3TCP コネクション⽤スレッドTCP上位層プロトコル処理⽤スレッド終了受信待ち&KeepaliveTCP コネクション待機スレッドからクライアント要求に応じてスレッド作成各コネクションスレッドで処理が失敗・終了してもコネクション待機スレッドは認知しないTCP コネクションスレッドから上位層プロトコルの処理スレッド作成プロトコル処理スレッドからのclose シグナルを待ちながら Keepalive
© NTT Communications Corporation All Rights Reserved. 30実装ポイント①サーバ全体処理: サーバメインスレッドgRPC Server ⽤スレッドTCP コネクション待機⽤スレッドgoroutinegoroutinechannel channelerror受信待ち
© NTT Communications Corporation All Rights Reserved. 31実装ポイント②TCP コネクション待機処理: TCPコネクション待機⽤スレッドTCP コネクション⽤スレッド1goroutineTCP コネクション⽤スレッド2goroutineTCP コネクション⽤スレッド3goroutine
© NTT Communications Corporation All Rights Reserved. 32実装ポイント③TCP コネクション処理: TCP コネクション⽤スレッドTCP上位層プロトコル処理⽤スレッドgoroutinechannel終了受信待ち&Keepalive
© NTT Communications Corporation All Rights Reserved. 36まとめ• RFC/I-D 準拠実装とマルチベンダ対応実装の⽅法• RFC 準拠とは• 必ずしも RFC/I-D 準拠 ≠マルチベンダ対応ではない• 実装⽅法について• OSS 化に向けたプロダクト整理• 公開したプロダクトをさせるために⾏なった⼯夫について共有• プロダクトが繁栄することを願って...• Test は近いうちに実装しないといけない• Go でクラサバシステムを実装して⾒た感想• ⾮同期処理が簡単に書けるのでサーバ実装との相性は良い• interface の仕様に馴染むのが個⼈的には難しい
© NTT Communications Corporation All Rights Reserved. 37© NTT Communications Corporation All Rights Reserved. 37© NTT Communications Corporation All Rights Reserved.※画像背景⽤(淡⾊)スライドマスターよりコピー&ペーストにて使⽤ください。
© NTT Communications Corporation All Rights Reserved. 38© NTT Communications Corporation All Rights Reserved. 38© NTT Communications Corporation All Rights Reserved.※背景画像使⽤イメージ38© NTT Communications Corporation All Rights Reserved.