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

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

Virtualbox + Cumulus VXでIP Clos構成を組んでみた

データセンタのネットワークにてぼちぼち導入が進められている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!