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

気になった事を黙々とメモし続ける

SONiCを少しかじってみた

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

SONiC(Software for Open Networking in the Cloud)とは、マイクロソフト社がオープンソースで公開しているホワイトボックススイッチ用のNOS(Network OS)。
他のホワイトボックススイッチ用NOSと同様に、Linuxをベースとしている。
SONiCの中で動作している主要なサービスは、SONiC内のdockerコンテナの中で動作しているという特徴が有る。
Googleで検索する際、SONiCだけで検索すると結果はセガの某キャラクターで埋められるが、SONiC NOSやSONiC Microsoft等で検索すると当記事で扱うSONiCが沢山出てくるようになる。
マイクロソフトだけでなく、アリスタやブロードコム等のネットワーク機器ベンダも開発に協力し、OSSのホワイトボックススイッチ用NOSの中で最も開発が活発である。今回は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等の設定が既に入っていた状態だった。
既存の設定内容を大幅に修正したら外部だけでなく他のゲストOSとの通信も出来なくなった為、SONiC側は変更箇所は最低限に済ませた。
Cumulus VX側はSONiCの設定に合わせるような内容でIPアドレスをアサイン。


SONiCの導入および設定
1.SONiCのデプロイ
まずはSONiCの仮想アプライアンス版をダウンロード。
https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-image-202012/lastSuccessfulBuild/artifact/target/sonic-vs.img.gz
本来であればsonic-vs.imgを使用するのだが、自分の環境ではsonic.xmlの内容の読み込みが出来なく正常にデプロイが完了しなかった為、以下のイメージファイルを使用した。ただし、VirtualBoxでは.vhdxファイルのデプロイは出来ない為、NHCというツールでvhdx形式からvdi(VirtualBox dynamically expanding)形式に変換。
https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-image-pr/lastSuccessfulBuild/artifact/target/sonic-vs.vhdx
https://euee.web.fc2.com/tool/nhc.html#nhc

※2021/2/2追記
.imgファイルもNHCで.vdiファイルに変換出来た。よって.vhdxファイルをわざわざ探す必要は無い。


その後、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にデプロイが可能となった。


2.VirtualBoxの設定
Hard Diskの設定にて、Use an existing virtual hard disk fileを選択し上記にて生成した.vdiファイルを選択。

[General]
Operating System:Other Linux (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, 'intnet')
Adapter 3:Paravirtualized Network (Internal Network, 'intnet')
Adapter 4:Paravirtualized Network (Internal Network, 'intnet')


3.デプロイ開始
起動中、以下のようなログが1出力されるが今回は無視してそのまま進める。

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
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:27: Invalid GROUP operation
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:29: 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


4.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ファイルを直接編集する方法と、vtyshモードでCisco IOSのコマンドとほぼ同じコマンドを打つ方法の2つが有る。
BGPのネイバのアドレス、AS番号、自側のアドレス、name欄(Ciscoで言うdescription)を修正。
設定内容の保存後、show runningconfig allコマンドを叩くと以下のように出力される。
/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内のドキュメントや海外の導入事例等をもう少し深く読んで、今回投入した設定が本当に正しいか再度確認したい。



問題点など
自分の環境下だけだろうか...
・毎回ではないが、再起動後、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もまたこちらをのぞいているのだ」



参照先など
開発者および先達の皆さまに感謝。
https://azure.github.io/SONiC/ SONiC
https://github.com/Azure/SONiC/wiki/Configuration SONiC Configuration
https://cumulusnetworks.com/ Cumulus Linux
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の動作確認 (2020/2/14追記)