Nested Virtualization VM(Google Cloud)上にcontainerlabを構築してCisco XRdとCisco Catalyst 8000VをBGP接続してみた

前回containerlab上でXRd同士を接続したが、今回はXRdとCatalyst 8000vとの接続を試してみる
8000vのimage fileはqcow2のVMとなっているため、前回と異なり以下二点の対応が必要
1. Nested Virtulization有効化
2. 8000v(VM)のコンテナ化

下記手順通り実施すれば誰でもXRdと8000vとの接続構成を構築できるはず。CSR1000vも基本やることは一緒
一部説明文を省略しているので詳細は前回を参照

https://qiita.com/gemunopedy/items/74906279084c86413386


# 環境
### VMインスタンス(Google Cloud)
- Debian GNU/Linux 12 (bookworm)
- n2-standard-8
- disk
  - 200GB  #defaultのままだと構築途中に容量不足でエラーとなったため気持ち多めに
- spot
  - 節約のため

# 手順
1. Nested Virtualization VMインスタンス作成
2. containerlabインストール
3. Cisco XRd用設定
4. vrnetlabによるDockerイメージ作成
5. containerlab topology作成
6. bgp設定

## 1. Nested Virtualization VMインスタンス作成
gloud initでgloud CLIが使用できるようにしておく(ローカル端末でコマンド実施)
Nested Virtualizationのためにカスタムイメージを作成

```
gcloud compute images create nested-debian --source-image-family=debian-12 --source-image-project=debian-cloud --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
```
作成したカスタムイメージを指定してVM作成
```
gcloud compute instances create clab --machine-type=n2-standard-8 --boot-disk-size=200GB --image=nested-debian --provisioning-model=SPOT
```

## 2. containerlabインストール
以降はVM上実施
```
wget -qO - https://ftp-master.debian.org/keys/archive-key-15.asc | apt-key add -
apt update
apt -y upgrade
curl -sL https://containerlab.dev/setup | sudo -E bash -s "all"
```

## 3. Cisco XRd用設定
```
sysctl -w fs.inotify.max_user_instances=64000
```

## 4. vrnetlabによるDockerイメージ作成
containerlabはコンテナを管理するためVMベースのノードはコンテナ化する必要がある。
それを実現させるのがvrnetlab

page32,33参考

https://enog.jp/wordpress/wp-content/uploads/2022/11/ENOG76_containerlab_%E4%BA%8B%E5%BE%8C%E8%B3%87%E6%96%99.pdf

ただ上記資料のvrnetlab/vrnetlabだと以下のエラーでイメージ作成できないためhellt/vrnetlabにてイメージ作成（このトラシューでだいぶ時間消費した...）

https://github.com/srl-labs/containerlab/issues/2095

```
git clone https://github.com/hellt/vrnetlab.git
cd vrnetlab/c8000v
```
vrnetlab/c8000v配下にqcow2ファイルを保存
```
root@clab2:~/vrnetlab/c8000v# ll
total 1820188
drwxr-xr-x  3 root root       4096 Nov 28 06:53 .
drwxr-xr-x 26 root root       4096 Nov 28 06:52 ..
-rw-r--r--  1 root root        643 Nov 28 06:52 Makefile
-rw-r--r--  1 root root       4696 Nov 28 06:52 README.md
-rw-r--r--  1 root root 1863843840 Jul 13  2023 c8000v-17.11.01a.qcow2
drwxr-xr-x  2 root root       4096 Nov 28 06:52 docker
```
Dockerイメージ作成
```
make docker-image
```

Dockerイメージが作成されている
```
root@clab4:~/vrnetlab/c8000v# docker images
REPOSITORY              TAG         IMAGE ID       CREATED          SIZE
vrnetlab/cisco_c8000v   17.11.01a   b8f351a24b52   25 seconds ago   3.14GB
```

## 5. containerlab topology作成
```yaml
root@clab4:~# cat lab.yaml 
name: lab

topology:
  nodes:
    xrv:
      kind: cisco_xrd
      image: ios-xr/xrd-control-plane:7.10.2
    c8000v:
      kind: cisco_c8000v
      image: vrnetlab/cisco_c8000v:17.11.01a
      
  links:
    - endpoints: ["xrv:Gi0-0-0-0", "c8000v:Gi2"]
```

```
clab deploy -t lab.yaml
```

docker psで確認。c8000vは起動に少し時間がかかり、最終的にhealthy状態になっていれば問題なし
```
root@clab4:~# docker ps 
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS                   PORTS                                                 NAMES
a8e5d324176f   vrnetlab/cisco_c8000v:17.11.01a   "/launch.py --userna…"   4 minutes ago   Up 4 minutes (healthy)   22/tcp, 830/tcp, 5000/tcp, 10000-10099/tcp, 161/udp   clab-lab-c8000v
2b40ce8cc7ea   ios-xr/xrd-control-plane:7.10.2   "/usr/sbin/init"         4 minutes ago   Up 4 minutes                                                                   clab-lab-xrv
```

ログイン確認
```
root@clab4:~# ssh admin@clab-lab-c8000v
Warning: Permanently added 'clab-lab-c8000v' (RSA) to the list of known hosts.
(admin@clab-lab-c8000v) Password: 

c8000v#
c8000v#show ip int bri
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet1       10.0.0.15       YES manual up                    up      
GigabitEthernet2       unassigned      YES unset  administratively down down    
```

## 6. bgp設定
以下configを投入
・c8000v
```
conf t
int gi2
no shut
ip address 192.168.0.1 255.255.255.0

router bgp 65100
bgp router-id 192.168.0.1
neighbor 192.168.0.2 remote-as 65200
address-family ipv4
end
```

・XRd
```
conf
int gi0/0/0/0
no shut
ip address 192.168.0.2/24

router bgp 65200
bgp router-id 192.168.0.2
neighbor 192.168.0.1 remote-as 65100
commit
```

bgp確認
```
c8000v#show ip bgp summary 
BGP router identifier 192.168.0.1, local AS number 65100
BGP table version is 1, main routing table version 1

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.0.2     4        65200       3       2        1    0    0 00:00:52        0




RP/0/RP0/CPU0:xrv#show bgp ipv4 unicast summary 

(省略)

Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
192.168.0.1       0 65100       8       7        1    0    0 00:01:11          0!
```

これで今後はcontainerlab上でのIOS-XEとIOS-XRの挙動確認が可能