Containerlab, topologie de lab sur Docker

Avec le nombre croissant de switchs virtuels conteneurisés, le besoin de les exécuter facilement dans des topologies de simulation augmente. Je l’avais déjà évoqué en présentant le cEOS-lab Arista, les outils d’orchestration de conteneurs tels que docker-compose ne conviennent pas, car ils ne permettent pas de créer facilement des connexions entre les conteneurs pour définir une topologie.

Containerlab fournit une interface IaaC (Infrastructure as a Code) sous forme d’un langage de commande pour l’orchestration et la gestion des simulations réseau basées sur des conteneurs. Il démarre les conteneurs, construit un câblage virtuel entre eux pour créer des topologies et gère le cycle de vie des simulations.

Containerlab se concentre sur les NOS (Network Operating System) conteneurisés qui sont généralement utilisés pour tester les fonctionnalités réseau, tels que :

  • Nokia SR-Linux
  • Arista cEOS
  • Azure SONiC
  • Juniper cRPD

En plus des NOS conteneurisés natifs, containerlab peut lancer des machines virtuelles à l’aide de l’intégration vrnetlab :

  • Système d’exploitation Nokia Virtual SR (vSim / VSR)
  • Juniper vMX
  • Cisco IOS XRv9k
  • Arista vEOS

Containerlab est également capable de câbler des conteneurs Linux traditionnels qui peuvent héberger des applications réseau, des fonctions virtuelles ou simplement être une machine de test.

Sur la base d’un serveur Ubuntu 20.04 sur lequel docker-ce est mis en place, containerlab peut s’installer à l’aide de la commande : bash -c "$(curl -sL https://get-clab.srlinux.dev)".

Pour monter une simulation basée sur des cEOS-lab Arista, il convient de télécharger la dernière version et de l’importer à l’aide la commande : docker import cEOS64-lab-4.26.0.1F.tar.xz ceosimage:4.26.0.1F.

Une topologie se définie dans un fichier clab au format YAML.

name: arista

topology:
  kinds:
    ceos:
      image: ceosimage:4.26.0.1F
  nodes:
    ceos1:
      kind: ceos
    ceos2:
      kind: ceos

  links:
    - endpoints: ["ceos1:et1", "ceos2:et1"]

Une fois complété, le fichier de topologie est déployé très rapidement à l’aide la commande : containerlab deploy -t arista.clab.yml.

Un répertoire est créé au même niveau que le fichier clab de manière à stocker un inventory utilisable avec Ansible et une image de la flash de chaque machine.

clab-arista/
├── ansible-inventory.yml
├── ceos1
│   └── flash
│       ├── AsuFastPktTransmit.log
│       ├── debug [error opening dir]
│       ├── fastpkttx.backup
│       ├── Fossil
│       ├── kickstart-config
│       ├── persist
│       │   ├── local
│       │   ├── messages
│       │   ├── persistentRestartLog
│       │   ├── secure
│       │   └── sys
│       ├── schedule
│       │   └── tech-support
│       │       └── ceos1_tech-support_2021-05-29.0456.log.gz
│       ├── SsuRestoreLegacy.log
│       ├── SsuRestore.log
│       ├── startup-config
│       └── system_mac_address
└── ceos2
    └── flash
        ├── AsuFastPktTransmit.log
        ├── debug [error opening dir]
        ├── fastpkttx.backup
        ├── Fossil
        ├── kickstart-config
        ├── persist
        │   ├── local
        │   ├── messages
        │   ├── persistentRestartLog
        │   ├── secure
        │   └── sys
        ├── schedule
        │   └── tech-support
        │       └── ceos2_tech-support_2021-05-29.0456.log.gz
        ├── SsuRestoreLegacy.log
        ├── SsuRestore.log
        ├── startup-config
        └── system_mac_address
all:
  children:
    ceos:
      hosts:
        clab-arista-ceos1:
          ansible_host: 172.20.20.2
        clab-arista-ceos2:
          ansible_host: 172.20.20.3

Il est possible de visualiser graphiquement la topologie réalisée à l’aide de la commande : containerlab graph -t arista.clab.yml.

Containerlab Topology Arista
Topologie ContainerLab

La connexion a l’un des conteneur peut s’effectuer à l’aide de la commande : docker exec -it clab-arista-ceos1 Cli.

L’accès aux switchs est facilité, car les conteneurs sont configurés par défaut avec gNMI, Netconf et eAPI activés. Si on ne précise pas de configuration pour un équipement, à l’aide de la propriété config dans le fichier clab, une configuration par défaut est copiée dans le répertoire clab-arista/ceos1/flash/startup-config.

! Startup-config last modified at Sat May 29 20:18:17 2021 by root
! device: ceos1 (cEOSLab, EOS-4.26.0.1F-21994874.42601F (engineering build))
!
transceiver qsfp default-mode 4x10G
!
service routing protocols model multi-agent
!
hostname ceos1
!
spanning-tree mode mstp
!
no aaa root
!
username admin privilege 15 role network-admin secret sha512 $6$TUpfI0LcwZhBBii6$rHoP.ypl45QhG9ximBIATvzEFpqsZW8LH3uW6/jopVsonJq5qXaGT/49lXYY7XMixP5Kxv8Sjw7WZxiNn3sS8/
!
interface Management0
   ip address 172.20.20.2/24
   ipv6 address 2001:172:20:20::2/64
!
no ip routing
!
management api http-commands
   no shutdown
!
management api gnmi
   transport grpc default
!
management api netconf
   transport ssh default
!
end

Voici un exemple d’accès avec Ansible et eAPI :

---
- name: Get facts on remote cEOS-lab devices
  hosts: ceos
  connection: httpapi
  gather_facts: no
  tasks:
    - name: Get cEOS facts
      arista.eos.eos_facts:
      register: facts
    - name: Display facts
      debug:
        msg: "Device {{ facts.ansible_facts.ansible_net_hostname }} is running version {{ facts.ansible_facts.ansible_net_version }}"
inventory = ./clab-arista/ansible-inventory.yml
host_key_checking = False
---
ansible_connection: ansible.netcommon.httpapi
ansible_network_os: arista.eos.eos
ansible_user: admin
ansible_password: admin
ansible_httpapi_use_ssl: yes
ansible_httpapi_validate_certs: no
ansible_become: yes
ansible_become_method: enable
Ansible Arista cEOS-lab get-facts
Ansible eos_facts

Avec gNMIc installé sur le serveur, la commande gnmic -a clab-arista-ceos1:6030 --insecure -u admin -p admin capabilities permet d’obtenir le résultat suivant :

gNMI version: 0.7.0
supported models:
  - arista-acl-deviations, Arista Networks, Inc., 1.0.4
  - arista-intf-augments, Arista Networks <http://arista.com/>, 1.4.3
  - arista-routing-policy-notsupported-deviations, Arista Networks, Inc.,
  - arista-isis-augments, Arista Networks, Inc., 1.0.2
  - openconfig-hercules-interfaces, OpenConfig Hercules Working Group, 0.2.0
  - arista-aft-augments, Arista Networks, Inc., 1.0.1
  - arista-exp-eos-varp-net-inst, Arista Networks <http://arista.com/>,
  - openconfig-aft-types, OpenConfig Working Group, 0.3.4
  - openconfig-igmp, OpenConfig working group, 0.2.0
  - openconfig-openflow, OpenConfig working group, 0.1.2
  - openconfig-lldp, OpenConfig working group, 0.2.1
  - arista-qos-notsupported-deviations, Arista Networks, Inc.,
  - arista-lldp-augments, Arista Networks, Inc., 1.0.1
  - openconfig-openflow-types, OpenConfig working group, 0.1.3
  - vlan-translation, Arista Networks,
  - openconfig-platform-port, OpenConfig working group, 0.3.3
  - arista-gnoi-cert, Arista Networks, Inc.,
  - openconfig-if-types, OpenConfig working group, 0.2.1
  - arista-exp-eos-varp-intf, Arista Networks <http://arista.com/>,
  - arista-relay-agent-deviations, Arista Networks <http://arista.com/>, 1.0.1
  - ietf-yang-types, IETF NETMOD (NETCONF Data Modeling Language) Working Group,
  - arista-system-notsupported-deviations, Arista Networks, Inc.,
  - arista-segmentation.v1, Arista Networks,
  - arista-exp-eos-evpn, Arista Networks, Inc.,
  - openconfig-hercules-platform, OpenConfig Hercules Working Group, 0.2.0
  - openconfig-lacp, OpenConfig working group, 1.1.1
  - ietf-netconf-monitoring, IETF NETCONF (Network Configuration) Working Group,
  - openconfig-vlan-types, OpenConfig working group, 3.1.1
  - openconfig-relay-agent, OpenConfig working group, 0.1.1
  - arista-vlan-augments, Arista Networks <http://arista.com/>, 1.1.2
  - openconfig-segment-routing, OpenConfig working group, 0.3.0
  - arista-exp-eos-vxlan-config, Arista Networks <http://arista.com/>,
  - arista-bfd-deviations, Arista Networks, Inc., 1.0.1
  - arista-bfd-notsupported-deviations, Arista Networks, Inc.,
  - ietf-interfaces, IETF NETMOD (Network Modeling) Working Group,
  - openconfig-pim-types, OpenConfig working group, 0.1.1
  - arista-qos-augments, Arista Networks, Inc., 0.0.4
  - openconfig-if-poe, OpenConfig working group, 0.1.1
  - arista-exp-eos-mlag, Arista Networks <http://arista.com/>,
  - ietf-inet-types, IETF NETMOD (NETCONF Data Modeling Language) Working Group,
  - openconfig-mpls-rsvp, OpenConfig working group, 3.0.2
  - openconfig-bgp, OpenConfig working group, 6.0.0
  - openconfig-platform-cpu, OpenConfig working group, 0.1.1
  - arista-intf-deviations, Arista Networks, Inc., 1.0.2
  - arista-srte-augments, Arista Networks, Inc., 1.1.1
  - openconfig-mpls, OpenConfig working group, 3.1.0
  - arista-system-deviations, Arista Networks, Inc., 1.1.2
  - arista-mpls-augments, Arista Networks <http://arista.com/>, 1.0.1
  - arista-lacp-augments, Arista Networks <http://arista.com/>, 1.0.1
  - openconfig-platform-transceiver, OpenConfig working group, 0.7.1
  - arista-exp-eos-qos, Arista Networks <http://arista.com/>,
  - arista-netinst-deviations, Arista Networks, Inc., 1.0.2
  - openconfig-vlan, OpenConfig working group, 3.2.0
  - arista-bfd-augments, Arista Networks <http://arista.com/>, 1.0.4
  - openconfig-network-instance, OpenConfig working group, 0.14.0
  - openconfig-ospfv2, OpenConfig working group, 0.2.2
  - openconfig-types, OpenConfig working group, 0.6.0
  - openconfig-mpls-ldp, OpenConfig working group, 3.0.2
  - arista-eos-types, Arista Networks <http://arista.com/>,
  - openconfig-network-instance-l3, OpenConfig working group, 0.11.1
  - arista-system-augments, Arista Networks, Inc., 1.1.1
  - openconfig-messages, OpenConfig working group, 0.0.1
  - openconfig-yang-types, OpenConfig working group, 0.2.2
  - arista-openflow-deviations, Arista Networks, Inc., 1.1.1
  - openconfig-qos, OpenConfig working group, 0.2.3
  - arista-exp-eos-igmpsnooping, Arista Networks <http://arista.com/>,
  - openconfig-packet-match, OpenConfig working group, 1.1.1
  - arista-rpol-deviations, Arista Networks, Inc., 1.0.1
  - openconfig-platform-psu, OpenConfig working group, 0.2.1
  - arista-lldp-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-alarm-types, OpenConfig working group, 0.2.1
  - openconfig-system-logging, OpenConfig working group, 0.3.1
  - arista-lacp-deviations, Arista Networks, Inc., 1.0.1
  - openconfig-platform, OpenConfig working group, 0.12.2
  - openconfig-bgp-types, OpenConfig working group, 5.2.1
  - openconfig-platform-types, OpenConfig working group, 1.0.0
  - arista-lldp-deviations, Arista Networks, Inc., 1.0.2
  - openconfig-procmon, OpenConfig working group, 0.4.0
  - openconfig-aaa, OpenConfig working group, 0.5.0
  - openconfig-routing-policy, OpenConfig working group, 3.2.2
  - openconfig-transport-types, OpenConfig working group, 0.12.0
  - arista-acl-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-system, OpenConfig working group, 0.9.1
  - openconfig-qos-types, OpenConfig working group, 0.2.1
  - arista-bgp-augments, Arista Networks, Inc., 2.0.1
  - openconfig-if-tunnel, OpenConfig working group, 0.1.1
  - openconfig-local-routing, OpenConfig working group, 1.1.0
  - openconfig-ospf-types, OpenConfig working group, 0.1.3
  - openconfig-mpls-types, OpenConfig working group, 3.2.0
  - iana-if-type, IANA,
  - openconfig-interfaces, OpenConfig working group, 2.4.3
  - arista-network-instance-notsupported-deviations, Arista Networks, Inc.,
  - arista-mpls-deviations, Arista Networks, Inc., 1.0.1
  - arista-vlan-deviations, Arista Networks <http://arista.com/>, 1.0.2
  - arista-srte-deviations, Arista Networks, Inc., 1.1.1
  - arista-local-routing-deviations, Arista Networks, Inc., 1.0.1
  - openconfig-pf-srte, OpenConfig working group, 0.2.0
  - arista-local-routing-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-extensions, OpenConfig working group,
  - openconfig-isis-types, OpenConfig working group, 0.4.3
  - arista-rpc-netconf, Arista Networks, Inc.,
  - openconfig-acl, OpenConfig working group, 1.1.1
  - openconfig-mpls-sr, OpenConfig working group, 3.0.1
  - arista-bgp-notsupported-deviations, Arista Networks, Inc.,
  - arista-exp-eos-vxlan, Arista Networks <http://arista.com/>,
  - openconfig-alarms, OpenConfig working group, 0.3.2
  - arista-exp-eos-l2protocolforwarding, Arista Networks, Inc.,
  - arista-exp-eos-qos-config, Arista Networks <http://arista.com/>,
  - arista-bgp-deviations, Arista Networks, Inc., 1.1.1
  - openconfig-packet-match-types, OpenConfig working group, 1.0.4
  - arista-exp-eos, Arista Networks <http://arista.com/>,
  - openconfig-hercules-qos, OpenConfig Hercules Working Group, 0.1.0
  - openconfig-isis, OpenConfig working group, 0.6.0
  - openconfig-policy-forwarding, OpenConfig working group, 0.2.1
  - openconfig-system-terminal, OpenConfig working group, 0.3.1
  - arista-platform-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-isis-lsdb-types, OpenConfig working group, 0.4.2
  - openconfig-network-instance-types, OpenConfig working group, 0.8.3
  - openconfig-inet-types, OpenConfig working group, 0.3.5
  - openconfig-bfd, OpenConfig working group, 0.2.1
  - openconfig-srte-policy, OpenConfig working group, 0.2.2
  - openconfig-ospf-policy, OpenConfig working group, 0.1.3
  - ietf-netconf, IETF NETCONF (Network Configuration) Working Group,
  - openconfig-pim, OpenConfig working group, 0.2.0
  - openconfig-aaa-types, OpenConfig working group, 0.4.1
  - openconfig-bgp-policy, OpenConfig working group, 6.0.2
  - openconfig-segment-routing-types, OpenConfig working group, 0.2.0
  - openconfig-igmp-types, OpenConfig working group, 0.1.1
  - arista-lacp-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-platform-linecard, OpenConfig working group, 0.1.2
  - openconfig-license, OpenConfig working group, 0.2.0
  - openconfig-if-aggregate, OpenConfig working group, 2.4.3
  - openconfig-aft, OpenConfig working group, 0.6.0
  - arista-interfaces-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-if-ethernet, OpenConfig working group, 2.8.1
  - openconfig-platform-fan, OpenConfig working group, 0.1.1
  - openconfig-lldp-types, OpenConfig working group, 0.1.1
  - arista-rpol-augments, Arista Networks <http://arista.com/>, 1.0.1
  - arista-pim-augments, Arista Networks <http://arista.com/>, 1.0.1
  - openconfig-if-ip, OpenConfig working group, 3.0.0
  - openconfig-rib-bgp, OpenConfig working group, 0.7.0
  - arista-exp-eos-qos-acl-config, Arista Networks <http://arista.com/>,
  - arista-exp-eos-multicast, Arista Networks <http://arista.com/>,
  - arista-messages-notsupported-deviations, Arista Networks, Inc.,
  - openconfig-system-management, OpenConfig working group, 0.3.0
  - arista-isis-deviations, Arista Networks, Inc., 1.0.2
  - arista-cli, Arista Networks, Inc.,
  - openconfig-policy-types, OpenConfig working group, 3.1.1
  - openconfig-rib-bgp-types, OpenConfig working group, 0.5.0
supported encodings:
  - JSON
  - JSON_IETF
  - ASCII

Chaque fois qu’une configuration est sauvegardée sur le switch (write memory), elle est inscrite dans le fichier startup-config du répertoire flash pour des raisons de persistance de données. Il est également possible d’utiliser la commande containerlab save -t arista.clab.yml pour générer une copie de la configuration des équipements dans le fichier clab-arista/ceos1/flash/conf-saved.conf.

Pour mettre fin à la simulation, on utilise la commande containerlab destroy -t arista.clab.yml. Il faut noter que si les conteneurs sont totalement détruits, les répertoires flash sont conservés.

Note : certaines commandes peuvent nécessiter des droits root (sudo).