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

SONiCイントロダクション

Masaru OKI
November 28, 2018

 SONiCイントロダクション

ホワイトボックススイッチ向けのルーティングソフトウェアコレクションであるSONiCについて、紹介します。

Masaru OKI

November 28, 2018
Tweet

More Decks by Masaru OKI

Other Decks in Technology

Transcript

  1. パケット転送箱いろいろ • 外観は似ている • しかし中身や扱いは異なる 5 複数NICなPC メーカー製スイッチ ホワイトボックススイッチ パケット処理H/W

    CPU(遅い) メーカー謹製ASIC 外販されるASIC OS 選んで入れる メーカー謹製 選んで入れる ルーティングエンジン OS次第、選んで入れる メーカー謹製 OS次第、選んで入れる サポート ハードウェアのみ 製品丸ごと ハードウェアのみ 機能追加・バグ修正 自前 or OSベンダー メーカー(不自由) 自前 or OSベンダー
  2. • 基本、PC - Video(KVM) + スイッチASIC(マーチャントシリコン) • シリアルコンソール • 管理用NIC

    • ストレージ小さめ(8GB等) • USBはだいたいついてる • 製品によってはIPMIあり • OSは入っていない • OSインストーラ ONIEがよく使われている ホワイトボックススイッチ 6 CPU SSD DDR4 スイッチ ASIC PCIe SerDes Mgmt NIC
  3. プロセッサからASICはどのように見えるか • PCIe経由で接続される • ドライバはチップごとに違う ◦ Broadcom Trident, 2, 2+,

    3, ◦ Broadcom Tomahawk, 2, ◦ Broadcom Jericho, ◦ Barefoot Tofino ◦ (Cavium XPliant) ◦ Mellanox Spectrum, 2, ◦ etc. スイッチASIC PCIe メモリ (NOSを載せて使う) 7
  4. NOSの一般的な階層構成 • その他(LED等含む) PCIe / i2c / GPIO / ...

    Linux kernel デバイスドライバ ライブラリ ASIC SDK CLI API SNMP config DB other processes プロトコルデー モン(bgpd等) スイッチASIC ハードウェア カーネル空間 ユーザ空間 ASICベンダーが提供 ASICベンダーが提供 NOS インストールイメージ 8
  5. NOSいろいろ • 商用 ◦ Cumulus Linux (Cumulus Networks) ◦ OcNos

    (IP infusion) ◦ PicOS (Pica8) ◦ Switch Light OS (Big Switch Networks) ◦ OS10 (Dell) ◦ Onyx (Mellanox) ◦ 他 • OSS ◦ Open Network Linux ◦ SONiC ◦ OpenSwitch • ??? ◦ SnapRoute (以前OSSだったがgithub repoが削除され、現在は水面下で活動中らしい ) 9
  6. 商用 vs OSS • 商用 ◦ サポートしてくれる ◦ 購入、保守に費用がかかる ◦

    機能拡張やバグ修正などはメーカー依存で時間を要する ◦ ハードウェアにインストールされた状態で出荷されるケースもある • OSS ◦ サポートはない(サポートのついたものを商用としているメーカーもある ) ◦ インストールや保守は基本自前 ◦ 自由に変更や機能拡張が可能だが、それができる技術が必要 ◦ 周りで使われなくなると孤立する ◦ ASIC SDKがないとビルドできない (あるいはバイナリイメージ提供されるものを使う ) • どちらも ◦ 動かせるハードウェアは (それぞれで違うが)決まっている(OSSなら頑張れば移植は可能 ?) 10
  7. 代表的なOSSの比較 Open Network Linux https://opennetlinux.org/ SONiC http://azure.github.io/SONiC/ OpenSwitch (OPX) https://www.openswitch.net/

    管理団体 OCP OCP OpenSwitch (事実上Dell) 利用事例 ONF CORD and Stratum Microsoft datacenter (Dell OS10) 対応スイッチベンダー accton(edgecore), alphanetworks, celestica, dell, DNI(delta), hpe, ingrasys, inventec, mellanox, netberg, quanta https://opennetlinux.org/hcl accton(edgecore), alphanetworks, arista, barefoot, celestica, centec, dell, DNI(delta), embedway, facebook, ingrasys, inventec, marvell, mellanox, mitac, quanta, wnc https://github.com/Azure/SONiC/wiki/Support ed-Devices-and-Platforms accton(edgecore), dell https://github.com/open-switch/opx-do cs/wiki/hardware-support 対応ASIC 自分でSDK等入手して使う。OF-DPA, OpenNSL, SAIは使えるとのこと。ほぼ broadcomのみ SAIを使ったものなら対応する barefoot, broadcom, cavium, centec, generic, marvell, mellanox, nephos SAIを使ったものに対応とのことだが 現状broadcom のみ ルーティングエンジン 自分で載せて使う。SONiCも載る。 ビルド時はQuagga, FRR, goBGPから選べる (SONiCのパッケージに含まれている) 自分で載せて使う。quaggaを使用する 例がある 設定インタフェース - CLIあるいはJSON変換でredisへの書き込み Linux command, C++,Python API 特徴 スイッチで動くLinux distribution ASICサポートは別途必要 インストールイメージはLinux kernelを含むが、 基本はプログラムパッケージ(*.debの集合) ASIC portをCumulus LinuxのようにNIC に見せていてip(8)等で操作可能 11
  8. SONiCとは Software for Open Network in the Cloud • クラウドデータセンター向けに、必要なL3機能を盛り込んだソフトウェアの集合。

    • Microsoft, Dell, MellanoxおよびAristaにより2016年8月に仕様が提出された。 • Open Compute Project (OCP)に寄贈されている。 • ライセンスはApache v2 ◦ Linux kernel moduleはGPLv2。 • サポートはコミュニティベース。有償サポートは現在提供されていない。 13
  9. SONiCは、どこまでなにができるのか • 物理インタフェース、VLANインタフェースの設定 • VLANの設定 • L3 VRFの設定 • BGPによる経路交換

    • ACLの設定 • SNMP, gRPCによる統計情報取得 • syslog、ntpの設定 • CLIによる設定変更、コンフィグの保存とロード • Debian上で動くため、Linux上の各種アプリと連携可能 15
  10. SONiCの触り方 • 実機にインストールする方法 ◦ ONIE(Open Network Install Environment)経由でインストール ◦ https://github.com/Azure/SONiC/wiki/Supported-Devices-and-Platforms

    • 実機にインストール済みの場合 ◦ ユーザ名admin、パスワードYourPaSsWoRdでログイン ▪ 古いビルドだとadmin, PaSsWoRd ▪ ユーザ名とパスワードは、ビルド時に変更可能 ◦ bashが起動するので各種 Linuxコマンドを実行できる • ソフトウェア実装の場合(3種類ある) ◦ SONIC-P4, SONiC-VS(docker)の場合は、docker exec -it コンテナ名 bash ◦ SONiC-VS(KVM)の場合、ホストからtelnet 127.0.0.1 7000で接続し、実機と同じ手順でログイン • 共通 ◦ SONiC専用にconfigコマンド、showコマンドが用意されている 16
  11. configコマンド、showコマンド Usage: config [OPTIONS] COMMAND [ARGS]... SONiC command line -

    'config' command Options: --help Show this message and exit. Commands: aaa AAA command line acl ACL-related configuration tasks bgp BGP-related configuration tasks ecn ECN-related configuration tasks interface Interface-related configuration tasks interface_naming_mode Modify interface naming mode for interacting… load Import a previous saved config DB dump file. load_mgmt_config Reconfigure hostname and mgmt interface based… load_minigraph Reconfigure based on minigraph. mirror_session platform Platform-related configuration tasks qos 以下略 Usage: show [OPTIONS] COMMAND [ARGS]... SONiC command line - 'show' command Options: -?, -h, --help Show this message and exit. Commands: aaa Show AAA configuration acl Show ACL related information arp Show IP ARP table clock Show date and time ecn Show ECN configuration environment Show environmentals (voltages, fans, temps) interfaces Show details of the network interfaces ip Show IP (IPv4) commands ipv6 Show IPv6 commands line Show all /dev/ttyUSB lines and their info lldp LLDP (Link Layer Discovery Protocol)... logging Show system log mac Show MAC (FDB) entries mirror Show mirroring (Everflow) information 以下略 17
  12. SONiCのconfig (JSON) • /etc/sonic/config_db.jsonに書かれたものを起動時に読み込みredisに格納。 • config load, config saveでJSONとredisの相互変換を行う。 "BGP_NEIGHBOR":

    { "10.0.0.61": { "local_addr": "10.0.0.60", "asn": 64015, "name": "ARISTA15T0" }, "10.0.0.49": { "local_addr": "10.0.0.48", "asn": 64009, "name": "ARISTA09T0" }, ... } 18
  13. SONiCの内部構成(概略) • Software for Open Networkinig in the Cloud •

    bgpdなどのrouting daemonや設定DBと、ASIC設定の橋渡しが主な役割。 • 設定DBはredis、routing daemonからの情報取得はnetlinkで。 • ASIC設定にはSAI (Switch Abstraction Interface)を使う。 • カーネルやRouting dameon等込みのインストールイメージが提供される。 ASIC SDK SAI SONiC orchestration processes Routing daemons Linux kernel libraries utilities 20
  14. SONiCによる設定反映フロー 1. SONiCは、config databaseとしてredisを使っている 2. 設定変更はconfig dbの中身を変更(たとえばjsonを書いて”config load”) 3. config

    dbにsubscribeしたプロセスが通知を受け、SAIのAPIパラメータに変換 4. 変換結果はasic dbに書き込まれる 5. asic dbにsubscribeしたプロセスがSAIを呼び出し(直接or thrift RPC経由) 6. SAIによってASICの設定が変更される config db asic db orchagent syncd saiserver ASIC 22
  15. SONiCによる状態反映フロー 1. bgpd等により変更がnetdev(Ethernet0等)に指示される 2. netlink経由でSONiCの同期daemonがappl dbに状態を書き込む 3. appl dbにsubscribeしたプロセスが変更を検知し、SAIのAPIパラメータに変換 4.

    変換結果はasic dbに書き込まれる 5. asic dbにsubscribeしたプロセスがSAIを呼び出し(直接or thrift RPC経由) 6. SAIによってASICの設定が変更される appl db asic db orchagent syncd saiserver ASIC intfsyncd neighsyncd etc. bgpd etc. netlink 23
  16. Processes, scripts and Databases in SONiC CONFIG_DB APPL_DB ASIC_DB orchagent

    syncd saiserver intfsyncd neighsyncd fpmsyncd lldp_syncd portsyncd teamsyncd arp_update ntp-config.sh rsyslog-config.sh switch ASIC netlink STATE_DB portmgrd intfmgrd vlanmgrd netdev intfs config_db.json ntpd.conf rsyslogd.conf bgpd bgpcfgd ntpd rsyslogd config command show command sonic-cfggen config save config load hostcfgd /etc/pam.d/commo n-auth-sonic tacplus_nss.conf nsswitch.conf COUNTER_DB warmstart vtysh snmp i.e. ip(8) shadow SAI thrift RPC 24
  17. 実機なしにSONiCを使う方法 1. SONiC-P4 ◦ https://github.com/Azure/SONiC/wiki/SONiC-P4-Software-Switch ◦ SAIの実装として、https://github.com/Mellanox/SAI-P4-BM を利用。 ◦ P4言語ソフトウェアエミュレーションで

    router.p4とswitch.p4を動かし、SAI thrift RPCで制御。 ◦ 解説に沿ってやれば、解説の通りには動く。 ◦ SAI-P4-BMが更新されず、SONiC本体と使用するSAIのバージョンが不一致でビルドできず。 ◦ 解説で参照しているバイナリはバージョンが古く、最新に追従できない (例: config bgpがない)。 2. SONiC-VS (Virtual Switch) ◦ https://github.com/Azure/sonic-buildimage/tree/master/platform/vs ◦ 独自データプレーンを実装。実体は src/sonic-sairedis/vslib ◦ dockerコンテナの中で動作する。 ◦ 2018年11月にKVMイメージも追加された。 ◦ 最新ツリーでもビルドできるので、 PoCレベルの検証などにはこれを使っている。 26
  18. SONiC-VSの使い方 (docker) 1. docker環境を整える。 2. docker-sonic-vs.gzを入手する。 a. ソースコードを拾ってビルドする、あるいは b. 定期ビルドの結果を拾う

    3. gzip -dc docker-config-vs.gz | docker load 4. README.vsdocker.md の手順に従ってコンテナを作って動作確認できる。 注意点: 現時点ではstatusを正しく取得できない(link up/downやカウンターなど) 27
  19. SONiC-VSの使い方(KVM) 1. sonic-vs.imgとsonic.xmlを入手する。 ◦ ソースコードを拾ってビルドする、あるいは ◦ 定期ビルドの結果を拾う 2. sonlc.xmlを編集する。 ◦

    sonic-vs.imgのパスを合わせる。 3. README.vsvm.md に従いVMを作る。 ◦ virsh create sonic.xml 4. telnet 127.0.0.1 7000 ◦ admin, YourPaSsWoRdでログイン。 docker版より実機環境に近い。 2018年11月20日に追加されたばかり。 28
  20. SONiC-VSの内部構成(docker) • swがASIC相当、vEthernet*がASIC port相当でパケット送受信する。 • vs上のEthernet*は実機のSONiCと同様tapで、netlinkのために用意される。 • vEthernet*は、--network container:swによりswとvsとで共有される。 sw

    (docker container) vs (docker container) vEthernet0 vEthernet4 vEthernet8 vEthernet0 vEthernet4 vEthernet8 Ethernet0 Ethernet4 Ethernet8 dataplane (vslib) bgpd sw-srv0 sw-srv2 作例ではnetnsを32個作っている sw-srv*はnetns vethを作って片方をswに もう片方はnetns内で名前はeth0 eth0 vEthernet*はvethでなくてもよい たとえば物理NICのリネームもOK ip link set ens0 name vEthernet0 29 eth0
  21. SONiCの現状 • VRF, VXLAN対応はこれから。作ったりはできるが設定内容がまだ不足。 • 設定の動的反映、現状できるのはIP, LAG, Portとlinkのup/downのみ。 ◦ 起動時にconfigの設定を読み出して、

    jinja2テンプレートを使いxxxx.confを吐く機能が多い • REST APIも提案はされているものの未着手の模様。 ◦ https://github.com/Azure/SONiC/wiki/OCP-Summit-2018--and-SONiC-SAI-Workshop-Slide-Col lection • ロードマップ https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning • ドキュメントが、完備ではない、わりと不足気味。 ◦ 概略は公式wikiである程度把握できるが、具体例などが見つからない。 ◦ config dbのschemaがどうなっているかもソースコードで確認。 ◦ 前出の内部関係図もソースコードを調べないとわからなかった。 • コミュニティMailing Listは日に数通レベル。 32
  22. SONiCのソースコードとビルド方法 • 基本C, C++とPythonで記述されている。 • 実機用のビルドの場合、ASIC制御ライブラリのランタイムが使われる。 ◦ たとえばbroadcomだとlibsaibcm_3.1.3.5-11_amd64.debを外部から取得する。 • ビルド方法

    (環境にもよるがクリーンビルドに1.5~2時間ほどかかる) ◦ git clone https://github.com/Azure/sonic-buildimage; cd sonic-buildimage ◦ make init ◦ make configure PLATFORM=xxx (xxx=broadcom, mellanox, …, p4 or vs) ◦ make all • rules/configファイルを変更することでカスタマイズ可能 ◦ たとえば、デフォルトの routing stackはquaggaだが、frrやgobgpに変更できる • 実機用だとONIE用のインストーラとインストールイメージが作られる • SONiC-VSだと、dockerイメージ(docker-sonic-vs.gz)が作られる 35
  23. SONiCビルド時の注意 • インターネット接続環境が必要。 ◦ git submoduleなどで、必要なソースコードやパッケージを取得するため • docker環境が要求される。 ◦ ビルドするユーザーに

    docker操作権限を与えること。 ◦ docker上でビルドが走るので、環境の差は基本 dockerで吸収される。 • ストレージの空きを要求される。 ◦ 厳密にどのくらい必要か計測してないが、空き 100GBでNo space left on diskが出ることも ◦ /tmpも大きくないとダメそう。空き 40GBで、ときどきNo space left on diskが出る • ローカルな変更をしているとsubmodule同期に失敗することがある。 ◦ git submodule deinit -f --allできれいにしてからrebaseするとうまくいく • ソースを変更しないならJenkinsの定期ビルド結果を拾うのでもいいかも。 ◦ https://sonic-jenkins.westus2.cloudapp.azure.com/ 36