Une fois la machine virtuelle serveur de conteneurs lancée, les premières étapes consistent à lui attribuer un nouveau nom et à configurer les interfaces réseau pour joindre le routeur voisin et l'Internet.
|
Q16. |
Comment changer le nom de la machine virtuelle ? |
|
Attribuez le nom d'hôte à l'aide de la commande hostnamectl et redémarrer le système. sudo hostnamectl hostname hosting sudo reboot |
|
|
Q17. |
Comment appliquer les configurations réseau IPv4 et IPv6 à partir de l'unique interface de la machine d'hébergement ? Consulter la documentation de Netplan pour obtenir les informations sur la configuration des interfaces réseau à l'adresse Netplan documentation. |
|
Il existe plusieurs possibilités pour configurer une interface réseau. Dans le contexte de ces manipulations, on utilise Netplan dans le but de séparer la partie déclarative du moteur de configuration. C'est La configuration de base fournie avec l'image maître suppose que l'interface obtienne un bail DHCP pour la partie IPv4 et une configuration automatique via SLAAC pour la partie IPv6. Cette configuration par défaut doit être éditée et remplacée.
Exemple de fichier cat << EOF | sudo tee /etc/netplan/enp0s1.yaml
network:
version: 2
renderer: networkd
ethernets:
enp0s1:
dhcp4: false
dhcp6: false
accept-ra: true
addresses:
- 192.0.2.2/24
- fda0:7a62:1b8::2/64
routes:
- to: default
via: 192.0.2.1
- to: "::/0"
via: fe80::baad:caff:fefe:5
on-link: true
nameservers:
addresses:
- 172.16.0.2
- 2001:678:3fc:3::2
EOF
Bien sûr, il ne faut pas oublier d'appliquer les paramètre de configuration de l'interface. sudo netplan apply |
|
|
Q18. |
Comment valider la configuration réseau du serveur de conteneurs ? Lancer une série de tests ICMP IPv4 et IPv6. |
|
On reprend les tests usuels avec les commandes ping et host.
|
Sur l'hôte qui tient le rôle de serveur d'hébergement, la gestion des conteneurs est confiée à Incus.
Selon l'exergue du site, Incus est un gestionnaire de conteneurs et de machines virtuelles puissant, sûr et moderne.
Dans le contexte de ces manipulations, c'est la variété des modes d'interconnexion réseau offerte par Incus qui est le point le plus déterminant. Ici on utilise le mode macvlan qui raccorde les conteneurs au même domaine de diffusion que la machine hôte. C'est le mode de raccordement le plus simple. Cependant, il n'autorise pas les communications entre les conteneurs du fait de l'isolation des espaces de noms.
|
Q21. |
Quelle est l'instruction de configuration initiale du gestionnaire Incus ? Utiliser l'aide de la commande incus. |
|
C'est l'instruction Copie d'écran de son exécution. incus admin init Would you like to use clustering? (yes/no) [default=no]: Do you want to configure a new storage pool? (yes/no) [default=yes]: Name of the new storage pool [default=default]: Would you like to create a new local network bridge? (yes/no) [default=yes]: no Would you like to use an existing bridge or host interface? (yes/no) [default=no]: yes Name of the existing bridge or host interface: enp0s1 Would you like the server to be available over the network? (yes/no) [default=no]: Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: Would you like a YAML "init" preseed to be printed? (yes/no) [default=no]: |
|
|
Q22. |
Quelle est l'instruction qui permet d'afficher le profil par défaut des conteneurs ? Rechercher dans les options de la commande incus profile. |
|
Exemple d'exécution. incus profile show default config: {}
description: Default Incus profile
devices:
eth0:
name: eth0
nictype: macvlan
parent: enp0s1
type: nic
root:
path: /
pool: default
type: disk
name: default
used_by: []
project: default
L'affichage de ce profil par défaut permet de vérifier que tous les paramètres voulus sont correctement positionnés. |
|
|
Q23. |
Quelle est l'instruction de création et de lancement de nouveaux conteneurs ? Rechercher dans les options de la commande incus. Tester son exécution avec un conteneur de type |
|
Exemple d'exécution pour 3 nouveaux conteneurs. for i in {0..2}; do incus launch images:debian/trixie c$i; done
Launching c0 Launching c1 Launching c2 incus ls +------+---------+--------------------+-------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+--------------------+-------------------------------------------+-----------+-----------+ | c0 | RUNNING | 192.0.2.52 (eth0) | fda0:7a62:1b8:0:216:3eff:febd:a233 (eth0) | CONTAINER | 0 | +------+---------+--------------------+-------------------------------------------+-----------+-----------+ | c1 | RUNNING | 192.0.2.133 (eth0) | fda0:7a62:1b8:0:216:3eff:fe8e:cc62 (eth0) | CONTAINER | 0 | +------+---------+--------------------+-------------------------------------------+-----------+-----------+ | c2 | RUNNING | 192.0.2.187 (eth0) | fda0:7a62:1b8:0:216:3eff:fe7d:6898 (eth0) | CONTAINER | 0 | +------+---------+--------------------+-------------------------------------------+-----------+-----------+ La copie d'écran ci-dessus montre que l'adressage automatique des conteneurs depuis le routeur a fonctionné. |
|
|
Q24. |
Comment tester les communications réseau depuis chaque conteneur ? Rechercher dans les options de la commande incus celle qui permet de lancer un traitement dans le conteneur. |
|
C'est la commande incus exec qui correspond à notre besoin. Exemple de boucle qui permet de lancer les tests ICMP IPv4 et IPv6 dans les 3 conteneurs actifs. for i in {0..2}
do
echo ">>>>>>>>>>>>>>>>> c$i"
incus exec c$i -- ping -qc2 9.9.9.9
incus exec c$i -- ping -qc2 2620:fe::fe
done
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data. --- 9.9.9.9 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 27.887/28.676/29.465/0.789 ms PING 2620:fe::fe (2620:fe::fe) 56 data bytes --- 2620:fe::fe ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 41.727/48.212/54.697/6.485 ms >>>>>>>>>>>>>>>>> c1 PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data. --- 9.9.9.9 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 28.179/34.740/41.302/6.561 ms PING 2620:fe::fe (2620:fe::fe) 56 data bytes --- 2620:fe::fe ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 40.002/40.529/41.057/0.527 ms >>>>>>>>>>>>>>>>> c2 PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data. --- 9.9.9.9 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 28.539/35.408/42.278/6.869 ms PING 2620:fe::fe (2620:fe::fe) 56 data bytes --- 2620:fe::fe ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 40.428/47.517/54.606/7.089 ms |
|
|
Q25. |
Comment exécuter des jeux d'instructions dans les conteneurs depuis le serveur d'hébergement ? On entre ici dans le domaine de l'automatisation à l'aide de scripts Bash. Même si l'ambition reste très modeste, on peut développer un script qui utilise la liste des conteneurs actifs pour lancer une suite de traitements dans ces mêmes conteneurs. Comme les conteneurs Incus appartiennent à la famille des conteneurs système, ils disposent d'une arborescence complète et d'une gestion de paquets. Allons y pour une mise à jour des paquets de chaque conteneur actif. |
|
Exemple de code qui stocke les commandes à lancer dans un tableau et qui les exécute sur chacun des conteneurs actifs. #!/bin/bash
cmds=(
"apt -y update"
"apt -y full-upgrade"
"apt -y clean"
"apt -y autopurge"
)
clist=$(incus list status=running -c n -f compact | grep -v NAME | tr '\n' ' ' | tr -s ' ')
for c in $clist; do
echo ">>>>>>>>>>>>>>>>> $c"
for cmd in "${cmds[@]}"; do
eval "incus exec $c -- $cmd"
done
done
exit 0
Si ce script est enregistré dans le fichier bash run-commands-in-containers.sh >>>>>>>>>>>>>>>>> c0 Hit:1 http://deb.debian.org/debian trixie InRelease Hit:2 http://deb.debian.org/debian trixie-updates InRelease Hit:3 http://deb.debian.org/debian-security trixie-security InRelease All packages are up to date. Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0 Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0 >>>>>>>>>>>>>>>>> c1 Hit:1 http://deb.debian.org/debian trixie InRelease Hit:2 http://deb.debian.org/debian trixie-updates InRelease Hit:3 http://deb.debian.org/debian-security trixie-security InRelease All packages are up to date. Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0 Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0 >>>>>>>>>>>>>>>>> c2 Hit:1 http://deb.debian.org/debian trixie InRelease Hit:2 http://deb.debian.org/debian trixie-updates InRelease Hit:3 http://deb.debian.org/debian-security trixie-security InRelease All packages are up to date. Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0 Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0 Pour compléter, voici une seconde version du script qui utilise les arguments de la ligne de commande pour remplir le tableau des commandes à exécuter. #!/bin/bash
cmds=("$@")
clist=$(incus list status=running -c n -f compact | grep -v NAME | tr '\n' ' ' | tr -s ' ')
for c in $clist; do
echo ">>>>>>>>>>>>>>>>> $c"
for cmd in "${cmds[@]}"; do
eval "incus exec $c -- $cmd"
done
done |
|
|
Q26. |
Comment passer d'un adressage automatique à un adressage statique pour chaque conteneur ? Comme la gestion de la configuration des interfaces est assurée par Cette question est un prétexte pour utiliser le transfert de fichier depuis le serveur d'hébergement vers les conteneurs. Liste des actions à réaliser sur tous les conteneurs actifs.
|
|
Pour connaître les paramètres de configuration réseau d'une interface de conteneur, on peut extraire le fichier incus file pull c0/etc/systemd/network/eth0.network . cat eth0.network [Match] Name=eth0 [Network] DHCP=true [DHCPv4] UseDomains=true [DHCP] ClientIdentifier=mac On vérifie ainsi que la configuration réseau issue de la source de tirage des conteneurs implique un adressage automatique au moins en IPv4. On propose donc de remplacer cet adressage automatique par un adressage statique. Proposition de script qui traite chacun des points définis dans la question. #!/bin/bash
# Préparation -> générer la liste des conteneurs actifs
clist=$(incus list status=running -c n -f compact | grep -v NAME | tr '\n' ' ' | tr -s ' ')
# Étape 1 -> installer le paquet netplan.io
. run-commands-in-containers.sh "apt -y install netplan.io"
addr_idx=0
for c in $clist; do
echo ">>>>>>>>>>>>>>>>> $c"
# Étape 2 -> générer le fichier de configuration réseau YAML
$(cat << EOF > eth0.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
dhcp6: false
accept-ra: true
addresses:
- 192.0.2.$((addr_idx + 10))/24
- fda0:7a62:1b8::$(printf "%x" $((addr_idx + 10)))/64
routes:
- to: default
via: 192.0.2.1
- to: "::/0"
via: fe80::baad:caff:fefe:5
on-link: true
nameservers:
addresses:
- 172.16.0.2
- 2001:678:3fc:3::2
EOF
)
# Étape 3 -> transférer le fichier de déclaration YAML
incus file push eth0.yaml $c/etc/netplan/eth0.yaml
# Étape 4 -> effacer le fichier /etc/systemd/network/eth0.network
incus exec $c -- rm /etc/systemd/network/eth0.network
# Étape 5 -> appliquer la nouvelle configuration
incus exec $c -- netplan apply
((addr_idx++))
done
exit 0
Si le code du script ci-dessus est placé dans un fichier appelé bash set-static-addressing.sh incus restart --all incus ls +------+---------+-------------------+-------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+-------------------+-------------------------------------------+-----------+-----------+ | c0 | RUNNING | 192.0.2.10 (eth0) | fda0:7a62:1b8::a (eth0) | CONTAINER | 0 | | | | | fda0:7a62:1b8:0:216:3eff:febd:a233 (eth0) | | | +------+---------+-------------------+-------------------------------------------+-----------+-----------+ | c1 | RUNNING | 192.0.2.11 (eth0) | fda0:7a62:1b8::b (eth0) | CONTAINER | 0 | | | | | fda0:7a62:1b8:0:216:3eff:fe8e:cc62 (eth0) | | | +------+---------+-------------------+-------------------------------------------+-----------+-----------+ | c2 | RUNNING | 192.0.2.12 (eth0) | fda0:7a62:1b8::c (eth0) | CONTAINER | 0 | | | | | fda0:7a62:1b8:0:216:3eff:fe7d:6898 (eth0) | | | +------+---------+-------------------+-------------------------------------------+-----------+-----------+ |

![[Avertissement]](/images/warning.png)