Un lab réseau avec containerlab

Docker et containerlab sur une machine Linux, une image d'OS réseau, un spine et deux leaves câblés ensemble, une première configuration d'interface, et le tout dans un dépôt git.

débutant~30 min de manipulation
#containerlab#docker#srlinux#ceos#lab#netdevops

Pas encore validée de bout en bout — sois le premier.Signaler un problème

Brouillon — pas encore exécuté de bout en bout. Cette page est écrite mais son auteur ne l'a pas encore déroulée sur une vraie machine. Des commandes peuvent être fausses : lis avant de lancer, et dis-nous ce qui casse.

En un coup d'œilUne machine, trois switches
Machine de lab
Lab ${LAB_NAME}
sshdeployslinklink
Ton portablessh · git
containerlabdeploy · inspect · destroy
spine1
leaf1
leaf2

containerlab lit topology.clab.yml, demande à Docker trois conteneurs qui font tourner l'OS réseau, les câble virtuellement et met leurs interfaces de management sur ${MGMT_SUBNET}.

Un lab réseau, c'était une baie, une semaine de câblage et une licence. Avec containerlab, c'est un fichier YAML et une commande : les nœuds sont des conteneurs qui font tourner un vrai OS réseau, les liens sont des câbles virtuels entre eux. Cette page installe l'outillage sur une machine Linux, monte un spine et deux leaves, configure les premiers liens, et met le tout dans git pour que les pages suivantes construisent dessus.

Avant de commencer

$sudo apt update && sudo apt install -y curl git
$mkdir -p
Vérification
$lsb_release -is && docker --version >/dev/null 2>&1 || echo no-docker-yet
Retour attendu
Ubuntu
no-docker-yet

Installer Docker et containerlab

Commande sensible — exécute un script distant. Vérifie avant d'exécuter.
$curl -fsSL https://get.docker.com | sudo sh
$sudo usermod -aG docker $USER
$newgrp docker
$docker run --rm hello-world | head -2

Puis containerlab, fixé à la version :

$sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v
$containerlab version
Vérification
$containerlab version | grep -o 'version: '
Retour attendu
version: 

Récupérer l'image

$docker pull
Vérification
$docker image ls  -q | wc -l
Retour attendu
1

Écrire la topologie

${LAB_DIR}/topology.clab.yml
name:
mgmt:
network: -mgmt
ipv4-subnet:
topology:
kinds:
nokia_srlinux:
image:
nodes:
spine1: { kind: nokia_srlinux, mgmt-ipv4: }
leaf1: { kind: nokia_srlinux, mgmt-ipv4: }
leaf2: { kind: nokia_srlinux, mgmt-ipv4: }
links:
- endpoints: ["spine1:e1-1", "leaf1:e1-1"]
- endpoints: ["spine1:e1-2", "leaf2:e1-1"]
Vérification
$cd  && python3 -c 'import yaml; t = yaml.safe_load(open("topology.clab.yml")); print(len(t["topology"]["nodes"]), len(t["topology"]["links"]))'
Retour attendu
3 2

Déployer et regarder

$cd
$sudo containerlab deploy -t topology.clab.yml
$sudo containerlab inspect -t topology.clab.yml

Connecte-toi à un nœud. containerlab a créé les entrées /etc/hosts, et les identifiants par défaut sont admin / NokiaSrl1! :

$ssh admin@
text
A:spine1# show version
A:spine1# show interface brief
Vérification
$docker ps --filter name=clab-- -q | wc -l
Retour attendu
3
Vérification
$sudo containerlab inspect -t /topology.clab.yml | grep -c running
Retour attendu
3
Si un nœud reste en « created » ou redémarre en boucle

docker logs clab-<V name="LAB_NAME" />-spine1 te le dit. Les causes habituelles : pas assez de RAM (le noyau tue le plus gros processus, dmesg | grep -i kill), ou un sous-réseau de management qui chevauche un réseau que l'hôte a déjà (ip route ; choisis un autre ). Détruis, corrige, redéploie.

Une première configuration

text
enter candidate
set / interface ethernet-1/1 admin-state enable
set / interface ethernet-1/1 subinterface 0 admin-state enable
set / interface ethernet-1/1 subinterface 0 ipv4 admin-state enable
set / interface ethernet-1/1 subinterface 0 ipv4 address 10.1.0.0/31
set / interface ethernet-1/2 admin-state enable
set / interface ethernet-1/2 subinterface 0 admin-state enable
set / interface ethernet-1/2 subinterface 0 ipv4 admin-state enable
set / interface ethernet-1/2 subinterface 0 ipv4 address 10.1.0.2/31
set / network-instance default interface ethernet-1/1.0
set / network-instance default interface ethernet-1/2.0
commit now

Depuis spine1, pingue leaf1 à travers le lien :

text
ping -c 3 10.1.0.1 network-instance default
Vérification
$docker exec clab--spine1 sr_cli 'ping -c 3 10.1.0.1 network-instance default' | grep -o '3 received'
Retour attendu
3 received

Sauver, détruire, redéployer

$cd
$sudo containerlab save -t topology.clab.yml
$ls clab-/
$sudo containerlab destroy -t topology.clab.yml
$sudo containerlab deploy -t topology.clab.yml
Vérification
$sudo containerlab inspect -t /topology.clab.yml | grep -c running
Retour attendu
3

Le lab dans git

${LAB_DIR}/.gitignore
clab-*/
*.tar.xz
.venv/
$cd
$git init
$git add topology.clab.yml .gitignore
$git commit -m "containerlab topology: spine1, leaf1, leaf2"
Vérification
$git -C  status --short | wc -l
Retour attendu
0

Terminé

Trois nœuds SR Linux tournent dans , câblés spine vers leaf, joignables sur , et , et la topologie est dans git. Tu peux détruire et reconstruire le tout en deux commandes :

$cd && sudo containerlab destroy -t topology.clab.yml --cleanup && sudo containerlab deploy -t topology.clab.yml

Les adresses que tu as tapées à la main sur cette page sont les dernières que tu taperas : la page suivante modélise le lab dans NetBox, équipements, interfaces, câbles et IP, pour que la configuration puisse en être générée.

Tout a fonctionné ?

Si tu as suivi cette page jusqu'au bout sur une vraie machine, dis-le. Ta validation est datée et enregistre ta stack : le prochain lecteur sur le même chemin sait que ça marche toujours.

Cette copie est en lecture seule. Pour dire que ça marche, ou que ça ne marche pas, ouvre une issue

Seuls tes choix de stack sont enregistrés, jamais tes valeurs. Le pseudo reste sur ce navigateur.