データセンタのネットワークにてぼちぼち導入が進められているIP Clos構成を、Cumulus Linuxの仮想アプライアンス版であるCumulus VXで試してみた。
今回は、Cumulus VXのIP Clos設定のメモ。
今まで携わってきた、North-South(クライアント-サーバ)なトラフィックを重視した旧来なデータセンタのネットワーク設計ではなく、East-West(サーバ間)なトラフィックが多いデータセンタの設計にも携われるよう、入門としてまずはVirtualbox内でCumulus VXを使って以下を試してみる。
・Leaf-Spineによる2層な構成。Leaf~Spine間はeBGPで接続。
・BGP unnumberedにより、IPv6リンクローカルアドレスでBGP Peerを自動で張らせる。
・ホワイトボックススイッチに導入されているNOS(Network OS)の代表格であるCumulus Linuxの予習。
当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.16
ゲストOS:Cumulus VX 4.2.1
昨今の仮想アプライアンスはホスト機側に要求されるスペックが高くなっていく一方で、Cumulus VXは最新版であっても仮想RAMは1GBで済む。(がっつり動かすにはより多くのメモリのアサインが必要だが...)
データセンタ環境向けの通信設定の検証用としては、10年程前のオンボロPCで検証するにはお値打ちな製品である。
構成
今回の構成は以下の図のとおり。
上の2台はSpineスイッチ、下の3台はLeafスイッチの役割。
intnetxxの記載は、VirtualboxのネットワークアダプタのName欄の内容。Name欄の記載内容を対向先との間で1対にする事で、仮想的にケーブルで接続された状態となる。
※図をクリックすると拡大表示します
Cumulus VXの導入および設定
1.Cumulus VXのデプロイ
Cumulus Linuxとは、Cumulus Networks社(現:NVIDIA社)が提供している商用Linuxのディストリビューションのうちの1つ。
OSがインストールされていないスイッチ(ホワイトボックススイッチ)にインストールするNetwork OSとして利用されている。
まずはCumulus Linuxの仮想アプライアンスであるCumulus VXをダウンロード。Cumulus VXの.ovaファイルを叩いてデプロイを開始。
ネットワーク設定以外は、Virtualbox環境における検証目的であればデフォルト設定で問題無いだろう。
VirtualboxのゲストOS間で通信を可能にするには、ゲストOS間のネットワーク設定を「内部ネットワーク」(英語版の場合はInternal Network)にする。
加えて、ゲストOS間で仮想的に1本づつケーブル接続する際は、Virtualboxのネットワーク設定にて編集が必要。
設定方法は以下のリンク先を参照。
https://debslink.hatenadiary.jp/entry/20201217/1608182777 (VirtualboxのゲストOS間を仮想ケーブルで接続する)
複数台のデプロイを試みたが、全機に対しsshでアクセス出来る、全機が互いにBGPピアを張れるという点で5台が限界だった。
Adapter1はホストOSとの通信で使用される為、Adapter2以降のName欄を修正する。
2.デプロイ完了後の初回ログイン
username、password共に「cumulus」と入力する。
初回ログイン時にパスワードをcumulusで入力すると、パスワード変更が求められる。
ここでパスワードを変更。
3.初回ログイン後の設定
自分の場合、初回ログイン後はNCLU(Network Command Line Utility)で以下を設定した。
①sshログインする為の最低限の設定
interface eth0にIPアドレスの設定。
外部やホストOSとの間で通信が出来るよう、デフォルトルートの設定。 ※管理用の為 vrf mgmtで分けられている
②ホスト名やNTP周りの設定
③上記①と②の設定後、net commitコマンドで設定内容を反映。
その後はインタフェース周りとBGP周りを設定。
以下はSpine01のインタフェース周りの設定。自分の環境では、/etc/network/interfacesファイルを直接編集した。
NCLUでも設定は可能で、net commitを打つと/etc/network/interfacesファイルに設定内容が反映される。
aliasやmtu等の設定は、参照したサイトに記載されていたものをほぼ踏襲した。
尚、インタフェースのalias設定はCiscoやJuniperで言うdescription設定に該当する。
auto lo iface lo inet loopback address 10.1.1.99/32 auto eth0 iface eth0 address 192.168.3.254/24 alias External_via_virtio gateway 192.168.3.1 link-speed 100 vrf mgmt auto swp1 iface swp1 alias DEV=jpmtkvmsw01 IF=swp1 link-speed 10000 mtu 9216 auto swp2 iface swp2 alias DEV=jpmtkvmsw02 IF=swp1 link-speed 10000 mtu 9216 auto swp3 iface swp3 alias DEV=jpmtkvmsw03 IF=swp1 link-speed 10000 mtu 9216 auto mgmt iface mgmt address 127.0.0.1/8 address ::1/128 alias UNUSED vrf-table auto
以下はLeaf01のインタフェース周りの設定。Spine01と同様に、自分の環境では/etc/network/interfacesファイルを編集した。
auto lo iface lo inet loopback address 10.1.1.1/32 auto eth0 iface eth0 address 192.168.3.250/24 alias External_via_virtio gateway 192.168.3.1 link-speed 100 vrf mgmt auto swp1 iface swp1 alias DEV=jpmtkvmsw99 IF=swp1 link-speed 10000 mtu 9216 auto swp2 iface swp2 alias DEV=jpmtkvmsw98 IF=swp2 link-speed 10000 mtu 9216 auto swp3 iface swp3 alias DEV=jpmtkvmsv00 IF=eth0 bridge-vids 100 link-speed 1000 auto bridge iface bridge bridge-ports swp3 bridge-vids 11 bridge-vlan-aware yes auto vlan11 iface vlan11 address 172.16.1.1/24 vlan-id 11 vlan-raw-device bridge auto mgmt iface mgmt address 127.0.0.1/8 address ::1/128 vrf-table auto
BGPピアを張るインタフェースに対し、IPアドレスは設定していない。
net show interfaceコマンドを打つと自動でアサインされたIPv6のアドレスを確認する事が出来る。
以下はインタフェースswp1にアサインされたIPv6アドレスを確認した内容。
Routingの項目にinet6 fe80::a00:27ff:feca:a932/64 の出力が有る。
cumulus@jpmtkvmsw99:mgmt:~$ net show interface swp1 Name MAC Speed MTU Mode -- ---- ----------------- ----- ---- ------- UP swp1 08:00:27:ca:a9:32 10G 9216 Default Alias ----- DEV=jpmtkvmsw01 IF=swp1 cl-netstat counters ------------------- RX_OK RX_ERR RX_DRP RX_OVR TX_OK TX_ERR TX_DRP TX_OVR ----- ------ ------ ------ ----- ------ ------ ------ 0 0 0 0 18 0 0 0 Routing ------- Interface swp1 is up, line protocol is up Link ups: 0 last: (never) Link downs: 0 last: (never) PTM status: disabled vrf: default OS Description: DEV=jpmtkvmsw01 IF=swp1 index 3 metric 0 mtu 9216 speed 10000 flags: <UP,BROADCAST,RUNNING,MULTICAST> Type: Ethernet HWaddr: 08:00:27:ca:a9:32 inet6 fe80::a00:27ff:feca:a932/64 Interface Type Other protodown: off ND advertised reachable time is 0 milliseconds ND advertised retransmit interval is 0 milliseconds ND advertised hop-count limit is 64 hops ND router advertisements sent: 7 rcvd: 0 ND router advertisements are sent every 10 seconds ND router advertisements lifetime tracks ra-interval ND router advertisement default router preference is medium Hosts use stateless autoconfig for addresses.
BGPのAS番号の設定。
自分の環境だけだろうか、/etc/frr/frr.confに直接書き込むだけではBGPを喋ってくれなかった。
Leaf、Spine共に事前にNCLUコマンドでAS番号の設定をする事で、net show bgpで始まるBGP関連のコマンドを打てるようになっただけでなく、BGPを喋る事が出来るようになった。
net add bgp autonomous-system [AS番号] net commit
以下はSpine01のルーティング周りの設定。
Cumulus LinuxのルーティングスイートはFRRoutingであり、設定の際はNCLUもしくは/etc/frr/frr.confファイルの編集となる。
自分の環境では/etc/frr/frr.confを編集しルーティング周りの設定をした。
BGPを喋るインタフェースにてRA(Router Advertisement)を有効にし、IPv6リンクローカルアドレスをアドバタイズする設定を投入。
そしてRAメッセージの送信間隔を10秒に設定。
全機にそれぞれ別のBGP AS番号をアサイン。eBGPでピアを張らせる。
neighborコマンドで指定しているのはBGPピアのIPアドレスではなくピアグループ名。
bgp bestpath as-path multipath-relaxのコマンドは、ASパス長が同じであれば異なるASパスでECMPを可能にする。
capability extended-nexthopオプションは、ローカルで持っているIPv4の経路情報を、IPv6リンクローカルアドレスを持つBGPピアのNext Hop宛てにアドバタイズしたい場合に使用。(RFC5549)
BFD(Bidirectional Forwarding Detectiion)を有効にしリンクの障害を検出し通知する設定を入れているものの、BGPプロセスのエラー検知の為にKeepaliveとholdtimerを明示的に設定している。
frr version 7.4+cl4.2.1u1 frr defaults datacenter hostname jpmtkvmsw99 log syslog informational service integrated-vtysh-config interface swp1 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra interface swp2 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra interface swp3 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra router bgp 65001 bgp router-id 10.1.1.99 bgp bestpath as-path multipath-relax neighbor FABRIC peer-group neighbor FABRIC remote-as external neighbor FABRIC bfd neighbor FABRIC capability extended-nexthop neighbor swp1 interface peer-group FABRIC neighbor swp2 interface peer-group FABRIC neighbor swp3 interface peer-group FABRIC timers bgp 3 9 address-family ipv4 unicast network 10.1.1.99/32 exit-address-family line vty vrf mgmt ip route 0.0.0.0/0 192.168.3.1 exit-vrf
以下はLeaf01のルーティング周りの設定。Spine同様に/etc/frr/frr.confファイルを編集した。
Spine側もだが、BGPの設定はまだまだ改善の余地は有るな...
frr version 7.4+cl4.2.1u1 frr defaults datacenter hostname jpmtkvmsw01 log syslog informational service integrated-vtysh-config interface swp1 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra interface swp2 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra router bgp 65011 bgp router-id 10.1.1.1 bgp bestpath as-path multipath-relax neighbor FABRIC peer-group neighbor FABRIC remote-as external neighbor FABRIC bfd neighbor FABRIC capability extended-nexthop neighbor swp1 interface peer-group FABRIC neighbor swp2 interface peer-group FABRIC timers bgp 3 9 address-family ipv4 unicast network 10.1.1.1/32 network 172.16.1.0/24 exit-address-family line vty vrf mgmt ip route 0.0.0.0/0 192.168.3.1 exit-vrf
上記ではLeaf01とSpine01のみ載せているが、実際はLeafスイッチ3台、Spineスイッチ2台に設定投入している。
ステータスの確認
設定および設定内容の保存が終わり次第、各機器にてshowコマンドを打ちルーティングのステータス確認を実施する。
以下はSpine01のルーティングテーブル。
宛先ネットワークがIPv4なアドレスである事に対し、ゲートウェイに使われているIPアドレスがIPv6である事が分かる。このIPv6なアドレスはBGPピアのIPv6リンクローカルアドレスである。
Spine02(10.1.1.98/32)宛てのエントリにゲートウェイが3本出力され、ECMPの設定が効いている事がわかる。
cumulus@jpmtkvmsw99:mgmt:~$ net show route show ip route ============= Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route B>* 10.1.1.1/32 [20/0] via fe80::a00:27ff:fe67:24e2, swp1, weight 1, 00:32:04 B>* 10.1.1.2/32 [20/0] via fe80::a00:27ff:fe05:366b, swp2, weight 1, 00:31:23 B>* 10.1.1.3/32 [20/0] via fe80::a00:27ff:fe23:6f70, swp3, weight 1, 00:30:43 B>* 10.1.1.98/32 [20/0] via fe80::a00:27ff:fe05:366b, swp2, weight 1, 00:30:39 * via fe80::a00:27ff:fe23:6f70, swp3, weight 1, 00:30:39 * via fe80::a00:27ff:fe67:24e2, swp1, weight 1, 00:30:39 C>* 10.1.1.99/32 is directly connected, lo, 00:35:20 B>* 172.16.1.0/24 [20/0] via fe80::a00:27ff:fe67:24e2, swp1, weight 1, 00:32:04 B>* 172.16.2.0/24 [20/0] via fe80::a00:27ff:fe05:366b, swp2, weight 1, 00:31:23 B>* 172.16.3.0/24 [20/0] via fe80::a00:27ff:fe23:6f70, swp3, weight 1, 00:30:43 show ipv6 route =============== Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route C * fe80::/64 is directly connected, swp2, 00:35:22 C * fe80::/64 is directly connected, swp3, 00:35:22 C>* fe80::/64 is directly connected, swp1, 00:35:22
以下はLeaf01のルーティングテーブル。
Spine01同様、ゲートウェイに使われているIPアドレスが、自側のIPv6リンクローカルアドレスである事が分かる。
Leaf02(10.1.1.2/32)、Leaf03(10.1.1.3/32)、Leaf02のLANセグメント(172.16.2.0/24)、Leaf03のLANセグメント(172.16.3.0/24)宛てのそれぞれのエントリにゲートウェイが2本づつ出力され、ECMPの設定が効いている事がわかる。
cumulus@jpmtkvmsw01:mgmt:~$ net show route show ip route ============= Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route C>* 10.1.1.1/32 is directly connected, lo, 00:24:59 B>* 10.1.1.2/32 [20/0] via fe80::a00:27ff:fe22:2624, swp2, weight 1, 00:24:12 * via fe80::a00:27ff:feca:a932, swp1, weight 1, 00:24:12 B>* 10.1.1.3/32 [20/0] via fe80::a00:27ff:fe22:2624, swp2, weight 1, 00:23:31 * via fe80::a00:27ff:feca:a932, swp1, weight 1, 00:23:31 B>* 10.1.1.98/32 [20/0] via fe80::a00:27ff:fe22:2624, swp2, weight 1, 00:24:52 B>* 10.1.1.99/32 [20/0] via fe80::a00:27ff:feca:a932, swp1, weight 1, 00:24:56 C>* 172.16.1.0/24 is directly connected, vlan11, 00:24:59 B>* 172.16.2.0/24 [20/0] via fe80::a00:27ff:fe22:2624, swp2, weight 1, 00:24:12 * via fe80::a00:27ff:feca:a932, swp1, weight 1, 00:24:12 B>* 172.16.3.0/24 [20/0] via fe80::a00:27ff:fe22:2624, swp2, weight 1, 00:23:31 * via fe80::a00:27ff:feca:a932, swp1, weight 1, 00:23:31 show ipv6 route =============== Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR, f - OpenFabric, > - selected route, * - FIB route, q - queued route, r - rejected route C * fe80::/64 is directly connected, vlan11, 00:25:00 C * fe80::/64 is directly connected, bridge, 00:25:00 C * fe80::/64 is directly connected, swp1, 00:25:01 C>* fe80::/64 is directly connected, swp2, 00:25:01
以下はSpine01のBGPテーブル。
3台のLeafスイッチとBGPピアの関係を確立出来ている事が分かる。
ネイバはIPアドレスではなくBGPピアのホスト名と自側のインタフェースが表示されている。
バージョン(Vの項目)が4になっているのはBGPv4を指すものであって、IPv4の事ではない。
Wiresharkで確認したいところだが、VirtualboxのゲストOS間通信のキャプチャはゲストOSにWiresharkをインストールしなければならないか...
cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary show bgp ipv4 unicast summary ============================= BGP router identifier 10.1.1.99, local AS number 65001 vrf-id 0 BGP table version 9 RIB entries 15, using 2880 bytes of memory Peers 6, using 128 KiB of memory Peer groups 1, using 64 bytes of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd jpmtkvmsw01(swp1) 4 65011 653 653 0 0 0 00:32:15 3 jpmtkvmsw02(swp2) 4 65012 641 639 0 0 0 00:31:34 3 jpmtkvmsw03(swp3) 4 65013 627 625 0 0 0 00:30:54 3 Total number of neighbors 3
以下はLeaf01のBGPテーブル。
2台のSpineスイッチとの間でBGPピアの関係を確立出来ている事が分かる。
cumulus@jpmtkvmsw01:mgmt:~$ net show bgp summary show bgp ipv4 unicast summary ============================= BGP router identifier 10.1.1.1, local AS number 65011 vrf-id 0 BGP table version 12 RIB entries 15, using 2880 bytes of memory Peers 2, using 43 KiB of memory Peer groups 1, using 64 bytes of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd jpmtkvmsw99(swp1) 4 65001 512 513 0 0 0 00:25:12 5 jpmtkvmsw98(swp2) 4 65000 513 511 0 0 0 00:25:09 5 Total number of neighbors 2
今回はここまで。
5台のCumulus VXをVirtualBoxにデプロイし、Leaf-SpineなIP Clos構成を組む事が出来た。
Cumulus Linux (Cumulus VX)に触れ始めてまだ日が浅いが、実環境にて多くの導入実績を持つ他社製の仮想アプライアンスと遜色が無い程、思っていた以上によく出来た製品だと感じた。
他にも幾つか検証してみたい構成が有る為、もう暫くの間Cumulus VXで仮想データセンタごっこで遊んでみたい。
以下は、PCの画面を覗き込む、Cumulus Linuxのキャラクター「Rocket Turtle」。
作りが雑な為、壊れないように人の手が届きにくい高い場所に飾ってある。(...それに比べて、昔アキバのぷらっとホームで購入したTux君人形やデーモン君人形の頑丈さ、そして完成度の高さよ)
その他
・IP Clos構成のClosとは、人名(Charles Clos氏)が由来だったのね...
・Cumulus LinuxのNCLUは思っていた以上に違和感無く使えた。net show configの出力内容の前半と後半でフォーマットが異なるように見える点は残念だが、その他は概ね満足。
・過去の記事にて、ライセンスを適用させなければCumulus LinuxのNCLUが打てないと書いたが、今回はライセンスを適用させる事無くNCLUを打てた。
NCLUが打てなかった原因はライセンスではなく、NCLU未対応なバージョン(2.x)を使っていた為と思われる。
・BGPに久しぶりに触れた。ハラビ本読んで基礎から復習しよう。
・メンタルが絶不調だった今年は、HPE VSR1000やKemp LoadMasterやMirageOS UnikernelやAlpine Linuxなど色々な物に手を出してはすぐに放棄...を繰り返してきた。やや安定している今振り返ってみると、Cumulus LinuxとMigareOS Unikernelは今後も触れ続けていくような気がした。
・CiscoやJuniperの製品でIP Clos構成の実現は可能なのだが、自宅で検証するとなると、動作が軽い・試用期限が無い(?)・ドキュメントがある程度揃っている・商用環境への導入実績が有る...等の点でCumulus VXの1択なのかなと思う。
・いじっていて楽しかったのはLagopus Switch。SONiCはVirtualvoxで動いてくれればなぁ。UbuntuのゲストOSを立ち上げて、その中で動かすしかないのか...
・Cumulus Linuxは気に入ったものの、ホワイトボックススイッチに過度な期待はしていない。理由は以下のIIJさんの資料の内容とほぼ同じ。
https://www.slideshare.net/IIJ_PR/ss-123665681
参考したサイト
Cumulus LinuxやIP Clos構成の世界にいざなってくださった先達の皆様に感謝致します。
https://cumulusnetworks.com/ Cumulus Linux
https://t.co/JwAAiOHh1f?amp=1 Cloud Native Data Center Networking
https://www.apresiatac.jp/blog/20190311992/ Cumulus LinuxでIP CLOS構築(APRESIA SYSTEMS Technical Blog)
https://tekunabe.hatenablog.jp/entry/202005/16/bgp_unnumbered BGP Unnumbered で遊んでみた
https://foobaron.hatenablog.com/entry/bgp-in-the-data-center-01 baron tech blog
https://foobaron.hatenablog.com/entry/bgp-in-the-data-center-04 baron tech blog
https://www.janog.gr.jp/meeting/janog43/program/line LINEのネットワークをゼロから再設計した話
https://cyberagent.ai/blog/tech/658/ RFC5549の技術の導入を実現する方法とメリット
https://cumulusnetworks.com/blog/bgp-unnumbered-overview/ BGP unnumbered overview(Cumulus Linux)
http://docs.frrouting.org/en/latest/ FRRouting User Guide
https://ieeexplore.ieee.org/document/6770468 A study of non-blocking switching networks
https://www.networkworld.com/article/2226122/clos-networks-what-s-old-is-new-again.html Clos Networks: What's Old Is New Again
https://cumulusnetworks.com/blog/hey-rocket-turtle-pimp-ride/ Hey Rocket Turtle, Pimp My Ride!