メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

SONiCを少しかじってみた

昨年6月以来の「かじってみた」シリーズ、今回はホワイトボックススイッチのNOS(Network OS)であるSONiCをVirtualBoxにデプロイしてみた。
そして、商用のホワイトボックススイッチのNOSとして多くのデータセンタにて導入が進んでいるCumulus Linuxの仮想アプライアンス版Cumulus VXもVirtualBoxにデプロイし、SONiCとCumulus VXとの間でBGPピアを張らせてみた。


ホワイトボックススイッチとは?
自分を含めネットワークの設計・構築・運用に携わっている者の多くがお世話になっているであろうCiscoのCatalystやNexusやJuniperのEXシリーズスイッチは、ソフトウェアとハードウェアが統合された物であり、我々ユーザー側が勝手にNetwork OSをインストールしたり機能を追加する事は出来なかった。
ホワイトボックススイッチは、我々ユーザ側がOSや機能ソフトウェアを開発およびインストールする事が可能なスイッチであるが、SONiCやCumulus Linux等のようにホワイトボックススイッチ用のNetwork OSがインストール済みのスイッチを購入する事も出来る。


SONiCとは?
SONiC(Software for Open Networking in the Cloud)とは、マイクロソフト社がオープンソースで公開しているホワイトボックススイッチ用のNetwork OS。
他のホワイトボックススイッチ用NOSと同様に、Linuxをベースとしている。
2000年代後半辺りからオープンソースのホワイトボッックス用NOSが幾つも開発されてきたが、その殆どが活動が停滞したり他のプロジェクトに吸収される等淘汰が進み、今はSONiCの1強の状態となりつつある状態だ。
マイクロソフトだけでなく、Arista NetworksやJuniper Networks等のネットワーク機器ベンダだけでなくBroadcomやebayやdocker等も開発に協力しており、OSSのホワイトボックススイッチ用NOSの中で最も開発が活発である。
SONiCの中で動作しているスイッチングやルーティング等の主要なサービスは、SONiC内で各サービス毎に実装されているdockerコンテナの中で動作する。
SONiCのEthernet ASIC周りは、標準化されたAPIを定義するSAI(Switch Abstraction Interface)に基づいて構築されており、ネットワーク機器ベンダは一貫性を持った開発環境を利用しハードウェアプラットフォームを開発する事が出来る。SAIはBroadcomやMarvellやMellanox等Ethernet ASICベンダが実装している。

Googleで検索する際、SONiCだけで検索すると結果はセガの某キャラクターで埋め尽くされるが、SONiC NOSやSONiC Microsoft、SONiC BGP等で検索すると当記事で扱うSONiCが沢山出てくるようになる。
今回は、Cumulus Linuxだけでなく他のOSSなホワイトボックススイッチ用のNOSにも触れてみようという事で、QiitaのAdvent Calendarの記事やSpeaker Deakに掲載されている資料をチラチラ見ながらSONiCに触れてみた。


当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.18
ゲストOS 1:Cumulus VX 4.2.1
ゲストOS 2:SONiC.master.629-10436783


構成
SONiCはデプロイ完了の時点でIPアドレスやBGP等の設定が既に入っている状態である為、複数台のSONiCをデプロイしMACアドレスやIPアドレス等を変更するだけで、SONiCを使った簡単なBGP構成を試す事が出来る。
しかし、それだけではすぐに終わってしまいつまらない。
CiscoやJuniperの仮想アプライアンスのように初期状態からがっつりと設定投入しようという事で、既存の設定内容を大幅に修正したら外部だけでなく他のゲストOSとの通信も出来なくなった為、結局はSONiC側は変更箇所は最低限に済ませた。
よって、今回はCumulus VX側はSONiCの設定に合わせるような内容でIPアドレスをアサインした。
※図をクリックすると拡大表示します



SONiCの導入および設定
2023/4/13編集
1.SONiCのデプロイ
まずはSONiCの仮想アプライアンス版をダウンロード。
https://sonic-net.github.io/SONiC/sonic_latest_images.html
VirtualBoxでは.imgファイルのデプロイは出来ない為、NHCというツールでimg形式からvdiもしくはvmdk形式に変換する必要がある。
https://euee.web.fc2.com/tool/nhc.html#nhc

その後、VirtualBoxからUUIDが無いよと怒られてデプロイ出来なかった為、DOS窓にて以下のコマンドを打ち、生成した.vdiファイルにUUIDを付与。

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands sethduuid "C:\Users\User\VirtualBox VMs\sonic-vm\sonic-vs.vdi"

.vdiファイルの準備が出来、これでようやくVirtualBoxにデプロイが可能となった。

VirtualBoxの設定
Hard Diskの設定にて、Use an existing virtual hard disk fileを選択し上記にて生成した.vdiファイルを選択。
VirtualBoxやEVE-NG環境で動かすのであれば、仮想RAMは2GB有れば充分だろう。しかしメモリをよく食べるRedis DBを中で動作させている為、商用環境で動かすとなると2GBでは少し心配かも。

[General]
Operating System:Debian (64-bit)

[System]
Base Memory:2048MB
Processors:1
Boot Order:Hard Disk
Acceleration:VT-x/AMD-V, Nested Paging, PAE/NX, KVM Paravirtualization

[Display]
Video Memory:16MB
Graphics Controller:VMSVGA
Remote Desktop Server:Disabled
Recording:Disabled

[Storage]
Controller:IDE
IDE Primary Master:sonic-vm.vdi

[Audio]
Disabled

[Network]
Adapter 1:Paravirtualized Network (Bridged Adapter, Broadcom 4313 802.1b/g/n)
Adapter 2:Paravirtualized Network (Internal Network, 'intnet01')
Adapter 3:Paravirtualized Network (Internal Network, 'intnet02')
Adapter 4:Paravirtualized Network (Internal Network, 'intnet03')

デプロイ開始
VirtualBoxにて起動ボタン(英語版ではStartボタン)をクリックし、SONiCのデプロイ開始。
起動中、以下のようなログが出力されるが今回は無視してそのまま進める。

systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:18: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:19: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:20: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:21: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:22: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:23: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:24: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:25: Invalid GROUP operation


デプロイ(起動)が完了したら、ログインIDとパスワードを入力しSONiCにログイン。出力内容から解るように、SONiCはDebian GNU/Linuxがベースとなっている。
ログインIDはadmin、パスワードはYourPaSsWoRd
パスワードの変更やユーザの追加は、DebianやUbuntuと同じくbashのコマンドで実行可能。

Debian GNU/Linux 10 sonic tty1

sonic login:


sshログインが出来るよう、以下のコマンドを投入し設定内容を保存。

sudo config interface ip add eth0 192.168.3.254/24 192.168.3.1
sudo config save



BGPの設定
Cumulus VXに倣いBGP unnumberedでBGPのピアを張りたかったのだが、下記リンク先のロードマップによると、BGP unnumberedは今年の6月末にリリースされるバージョン(SONiC.202106)にて実装されるようだ。
よって、今回はeBGPの基本的な設定を投入した。
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning
https://debslink.hatenadiary.jp/entry/20201206/1607231451

インタフェースのIPアドレスは、SONiCにて既存の設定に合わせる形で/31のサブネットで設定。

SONiC側の設定は以下のとおり。/etc/sonic/config_db.jsonファイルを直接編集する方法と、sudo config xxxxのコマンドで設定する方法と、vtyshモードでCisco IOSのコマンドとほぼ同じコマンドを打って設定する方法の3つが有る。
sudo configのコマンドで設定した内容をsaveすると、保存された設定内容は/etc/sonic/config_db.jsonファイルに反映される。
今回は、BGPのネイバのアドレス、AS番号、自側のアドレス、name欄(Ciscoで言うdescription)を/etc/sonic/config_db.jsonファイルの内容を編集するやり方で修正した。
設定内容の保存後、show runningconfig allコマンドを叩くと以下のように出力される。
show runningconfigコマンドは、出力する内容は/etc/sonic/config_db.jsonファイルから拾っているようだ。

{
    "BGP_NEIGHBOR": {
        "10.0.0.1": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.0",
            "name": "CUMULUS-VX-PATH1",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.3": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.2",
            "name": "CUMULUS-VX-PATH2",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.5": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.4",
            "name": "CUMULUS-VX-PATH3",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.0.0.7": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.0.0.6",
            "name": "CUMULUS-VX-PATH4",
            "nhopself": "0",
            "rrclient": "0"
        },
        "10.1.1.99": {
            "admin_status": "up",
            "asn": "65099",
            "holdtime": "180",
            "keepalive": "60",
            "local_addr": "10.1.1.98",
            "name": "CUMULUS-VX-LO",
            "nhopself": "0",
            "rrclient": "0"
        }
    },
:
:
    },
    "DEVICE_METADATA": {
        "localhost": {
            "bgp_asn": "65098",
            "buffer_model": "traditional",
            "default_bgp_status": "up",
            "default_pfcwd_status": "disable",
            "hostname": "jpmtkvmsw98",
            "hwsku": "Force10-S6000",
            "mac": "52:54:00:12:34:56",
            "platform": "x86_64-kvm_x86_64-r0",
            "type": "LeafRouter"
        }
    "FEATURE": {
        "bgp": {
            "auto_restart": "enabled",
            "has_global_scope": "False",
            "has_per_asic_scope": "True",
            "has_timer": "False",
            "high_mem_alert": "disabled",
            "state": "enabled"
        },
:


vtyshモードにてshow running-configコマンドを叩くと以下のように出力される。
ルータIDとネイバのIPアドレスとdescriptionを変更し、ネイバの数を減らしている。ルートマップの設定は残してある。

router bgp 65098
 bgp router-id 10.1.1.98
 bgp log-neighbor-changes
 no bgp ebgp-requires-policy
 no bgp default ipv4-unicast
 bgp graceful-restart restart-time 240
 bgp graceful-restart
 bgp graceful-restart preserve-fw-state
 bgp bestpath as-path multipath-relax
 neighbor PEER_V4 peer-group
 neighbor PEER_V6 peer-group
 neighbor 10.0.0.1 remote-as 65099
 neighbor 10.0.0.1 peer-group PEER_V4
 neighbor 10.0.0.1 description CUMULUS-VX-PATH1
 neighbor 10.0.0.3 remote-as 65099
 neighbor 10.0.0.3 peer-group PEER_V4
 neighbor 10.0.0.3 description CUMULUS-VX-PATH2
 neighbor 10.0.0.5 remote-as 65099
 neighbor 10.0.0.5 peer-group PEER_V4
 neighbor 10.0.0.5 description CUMULUS-VX-PATH3
 neighbor 10.0.0.7 remote-as 65099
 neighbor 10.0.0.7 peer-group PEER_V4
 neighbor 10.0.0.7 description CUMULUS-VX-PATH4
 neighbor 10.1.1.99 remote-as 65099
 neighbor 10.1.1.99 peer-group PEER_V4
 neighbor 10.1.1.99 description CUMULUS-VX-LO
 !
 address-family ipv4 unicast
  network 10.1.1.98/32
  neighbor PEER_V4 soft-reconfiguration inbound
  neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in
  neighbor PEER_V4 route-map TO_BGP_PEER_V4 out
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.3 activate
  neighbor 10.0.0.5 activate
  neighbor 10.0.0.7 activate
  neighbor 10.1.1.99 activate
  maximum-paths 64
 exit-address-family
 !


Cumulus VX側の設定は以下のとおり。
Cumulus VX側もSONiCに倣い、インタフェースのIPアドレスは/31のサブネットマスクで設定。

router bgp 65099
  bgp router-id 10.1.1.99
  bgp bestpath as-path multipath-relax
  timers bgp 60 180
  neighbor 10.0.0.0 remote-as 65098
  neighbor 10.0.0.2 remote-as 65098
  neighbor 10.0.0.4 remote-as 65098
  neighbor 10.0.0.6 remote-as 65098
  neighbor 10.1.1.98 remote-as 65098

  address-family ipv4 unicast
    network 10.1.1.99/32
    network 192.168.99.0/24



BGPの確認
設定を終えたところで、BGPのステータスの確認。
SONiC側は以下のとおり。
show ip bgp summaryコマンドを叩いてBGPテーブルの確認だが、通常のモードでもvtyshモードでもどちらでも実行可能。
設定直後はBGPピアを張れなかったが、VirtualBoxのNetwork設定欄内の 'intnet'の文字列を適当な文字列に変更した後、'intnet'に戻したらBGPピアを張る事が出来た。
BGPピアは張ったもののネットワークアドレスがアドバタイズされていない。SONiC同士やCumulus VX同士だとアドバタイズされるのだが、どうした事か。

jpmtkvmsw98# show ip bgp summary 

IPv4 Unicast Summary:
BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0
BGP table version 1
RIB entries 3, using 576 bytes of memory
Peers 5, using 128 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
10.0.0.1        4      65099         0         3        0    0    0    never       Active        0
10.0.0.3        4      65099         0         7        0    0    0    never       Active        0
10.0.0.5        4      65099        53        52        0    0    0 00:19:38     (Policy) (Policy)
10.0.0.7        4      65099        33        35        0    0    0 00:19:43     (Policy) (Policy)
10.1.1.99       4      65099         0         0        0    0    0    never       Active        0

Total number of neighbors 5
jpmtkvmsw98# 


show bgp summaryコマンド上ではBGPピアは張れているが、念の為プロセスレベルで確認してみる。
vtyshモードから抜けて、show serviceコマンドを叩いてBGPサービスが動作している事を確認。
BGPコンテナとその中のプロセスが出力され、BGPは動作している事が分かる。

jpmtkvmsw98# exit
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$ show services
:
:
bgp     docker
---------------------------
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.9  32268 20308 pts/0    Ss+  11:42   0:01 /usr/bin/python3 /usr/local/bin/supervisord
root        19  0.0  0.7  27632 15608 pts/0    S    11:42   0:00 python3 /usr/bin/supervisor-proc-exit-listener --container-name bgp
root        22  0.0  0.0 225856  2016 pts/0    Sl   11:42   0:00 /usr/sbin/rsyslogd -n -iNONE
frr         26  0.0  0.5 677812 11476 pts/0    Sl   11:42   0:00 /usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M fpm -M snmp
frr         27  0.0  0.2  43884  4468 pts/0    S    11:42   0:00 /usr/lib/frr/staticd -A 127.0.0.1
frr         28  0.0  0.6 297708 14004 pts/0    Sl   11:42   0:01 /usr/lib/frr/bgpd 127.0.0.1 -M snmp
root        37  0.0  0.9  39876 18772 pts/0    S    11:42   0:00 /usr/bin/python3 /usr/local/bin/bgpcfgd
root        38  0.0  0.6  21912 12576 pts/0    S    11:42   0:00 /usr/bin/python3 /usr/local/bin/bgpmon
root        39  0.0  0.1  82128  2916 pts/0    Sl   11:42   0:00 fpmsyncd
:
admin@jpmtkvmsw98:~$


また、systemctl status bgp.serviceコマンドを叩いたところ、bgp.serviceはLoadedでactive(running)である事から、正常に動作しているっぽい。

admin@jpmtkvmsw98:~$ systemctl status bgp.service
● bgp.service - BGP container
   Loaded: loaded (/lib/systemd/system/bgp.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-01-31 2:42:39 UTC; 27min ago
  Process: 1144 ExecStartPre=/usr/local/bin/bgp.sh start (code=exited, status=0/SUCCESS)
 Main PID: 1591 (bgp.sh)
    Tasks: 3 (limit: 2357)
   Memory: 17.9M
   CGroup: /system.slice/bgp.service
           tq1591 /bin/bash /usr/local/bin/bgp.sh wait
           tq1592 /bin/bash /usr/bin/bgp.sh wait
           mq1593 python3 /usr/local/bin/container wait bgp
admin@jpmtkvmsw98:~$


BGP のプロセス自体は正常に動作している事は分かったが、ネイバからネットワークアドレスがアドバタイズされない点は気になる。以下のコマンドを打ちBGPのプロセスを再起動させてみた。

admin@jpmtkvmsw98:~$ sudo config bgp shutdown all
Shutting down BGP session with neighbor 10.0.0.1...
Shutting down BGP session with neighbor 10.0.0.3....
Shutting down BGP session with neighbor 10.0.0.5...
Shutting down BGP session with neighbor 10.0.0.7...
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$
admin@jpmtkvmsw98:~$ sudo config bgp startup all
Starting up BGP session with neighbor 10.0.0.1...
Starting up BGP session with neighbor 10.0.0.3....
Starting up BGP session with neighbor 10.0.0.5...
Starting up BGP session with neighbor 10.0.0.7...
admin@jpmtkvmsw98:~$


show ip bgp summaryのステータスに変化が無かった為、SONiCを再起動。
再起動後のBGPのステータスは状態は以下のとおり。
今度はBGPピアよりネットワークアドレスを受信出来た。

jpmtkvmsw98# show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0
BGP table version 3
RIB entries 5, using 960 bytes of memory
Peers 5, using 107 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
10.0.0.1        4      65099         0         2        0    0    0    never       Active        0
10.0.0.3        4      65099         0         0        0    0    0    never       Active        0
10.0.0.5        4      65099         8         8        0    0    0 00:03:01            2        2
10.0.0.7        4      65099         8         8        0    0    0 00:03:01            2        2
10.1.1.99       4      65099         0         0        0    0    0    never       Active        0

Total number of neighbors 5
jpmtkvmsw98#


Cumulus VX側は以下のとおり。
こちらもBGPピアは張れているものの、ネイバからネットワークアドレスがアドバタイズされていなかった。
しかし、SONiCの再起動後はBGPネイバよりネットワークアドレスがアドバタイズされた。

cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary
show bgp ipv4 unicast summary
=============================
BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0
BGP table version 5
RIB entries 5, using 960 bytes of memory
Peers 5, using 128 KiB of memory

Neighbor              V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
10.0.0.0              4      65098         0         0        0    0    0    never       Active
jpmtkvmsw98(10.0.0.2) 4      65098        41        39        0    0    0 00:03:08            1
jpmtkvmsw98(10.0.0.4) 4      65098        41        39        0    0    0 00:03:08            1
10.0.0.6              4      65098         0         0        0    0    0    never       Active
10.1.1.98             4      65098         0         0        0    0    0    never      Connect

Total number of neighbors 5


show bgp ipv6 unicast summary
=============================
% No BGP neighbors found


show bgp l2vpn evpn summary
===========================
% No BGP neighbors found
cumulus@jpmtkvmsw99:mgmt:~$


今回はここまで。
vtyshモードではCisco IOS のコマンドとほぼ同じなので大きな間違いは無いと思うのだが、github内のドキュメントや海外の導入事例等をもう少し深く読んで、今回投入した設定が本当に正しいか再度確認したい。


問題点など
SONiCにおけるvtyshモードでの設定保存について。
writeコマンドの実行時、/etc/frrディレクトリ内のファイルに保存された旨のログが出力されるが、実際は/etc/sonic/frrディレクトリ内のファイルに保存される。/etc/frrディレクトリは存在しないので注意。

自分の環境下だけだろうか...
・毎回ではないが、再起動後、sshログインの設定が入っているにも関わらずsshログインが出来ない事が有る。その場合は再度sshログインの設定を投入するとsshログインが可能になる。
・今回は載せていないが、前日に同じ構成にてテストした結果、SONiC側から見たネイバ10.0.0.9およびCumulus VX側から見たネイバ10.0.0.10のステータスはActiveになっているにも関わらず、Up時間がカウントし続ける事が有った。
・PingのReplyが返ってこない、BGPのピアが張れない...等の現象は、大抵はSONiCの再起動で改善された。
・上記の構成にて、SONiCとCumulus VXの起動完了後BGPのピアを張るまでに要する時間がまちまち。起動完了後30秒以内だったり5分前後だったり...


Rocket Turtle(Cumulus Linuxのマスコットキャラクター)「SONiCをのぞく時、SONiCもまたこちらをのぞいているのだ」



参照先など (2023/1/9修正)
開発者および先達の皆さまに感謝。
https://sonic-net.github.io/SONiC/ SONiC
https://github.com/Azure/SONiC/wiki/Configuration SONiC Configuration
https://github.com/Azure/SONiC/wiki/Architecture SONiCのアーキテクチャ
https://qiita.com/advent-calendar/2019/sonic SONiC Advent Calendar 2019
https://qiita.com/advent-calendar/2020/sonic SONiC Advent Calendar 2020
https://speakerdeck.com/imasaruoki Speaker Deckに掲載れているSONiCの資料

https://debslink.hatenadiary.jp/entry/20210214/1613279732 SONiCのWarm Bootの動作確認
https://debslink.hatenadiary.jp/entry/20210822/1629600666 SONiCとCumulus LinuxでBGP unnumbered
https://debslink.hatenadiary.jp/entry/20210902/1630584311 SONiCとCumulus LinuxでBGP/EVPN/VXLAN
https://debslink.hatenadiary.jp/entry/20210912/1631418907 SONiCとCumulus Linuxで4byte ASなBGP + IP Clos構成
https://debslink.hatenadiary.jp/entry/20220122/1642852049 SONiCでL2 MC-LAGを組んでみた

https://debslink.hatenadiary.jp/entry/20210627/1624789102 SONiCの解説動画