5. Rôle serveur de conteneurs

5.1. Configuration des interfaces du routeur

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.

Q14.

Comment changer le nom de la machine virtuelle ?

Il faut éditer les deux fichiers /etc/hosts et /etc/hostname en remplaçant le nom de l'image maître vm0 par le nom voulu. Il est ensuite nécessaire de redémarrer pour que le nouveau nom soit pris en compte par tous les outils du système.

etu@vm0:~$ sudo sed -i 's/vm0/server/g' /etc/hosts /etc/hostname
etu@vm0:~$ sudo reboot

Q15.

Comment appliquer la configuration réseau IPv4 et IPv6 de l'interface du serveur ?

Consulter les pages de manuels du fichier de configuration système à l'aide de la commande man interfaces.

Il existe plusieurs possibilités pour configurer une interface réseau. Dans le contexte de ces manipulations, on utilise le fichier de configuration fourni par la distribution Debian GNU/Linux : /etc/network/interfaces.

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.

La configuration IPv4 par défaut doit être éditée et remplacée par une configuration statique tandis que la configuration IPv6 doit toujours se faire automatiquement via SLAAC.

Voici une copie du fichier /etc/network/interfaces de la maquette.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s1
iface enp0s1 inet static
        address 192.0.2.2/24
        gateway 192.0.2.1
        dns-nameserver 172.16.0.2

# This is an autoconfigured IPv6 interface
iface enp0s1 inet6 auto

Bien sûr, il ne faut pas oublier de relancer le gestionnaire de configuration réseau ou de redémarrer la machine virtuelle pour que les paramètres soient correctement appliqués.

Q16.

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.

etu@server:~$ ping -q -c2 9.9.9.9
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 = 19.433/19.586/19.740/0.153 ms
etu@server:~$ ping -q -c2 2620:fe::fe
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 = 42.983/43.114/43.246/0.131 ms
etu@server:~$ host kernel.org
kernel.org has address 139.178.84.217
kernel.org has IPv6 address 2604:1380:4641:c500::1
kernel.org mail is handled by 10 smtp1.kernel.org.
kernel.org mail is handled by 10 smtp3.kernel.org.
kernel.org mail is handled by 10 smtp2.kernel.org.

5.2. Installation du gestionnaire de conteneurs LXD

Sur l'hôte serveur, la gestion des conteneurs est confiée à LXD. Pour des raisons de rapidité de mise en œuvre, on choisit de passer par le gestionnaire de paquets snapd pour l'installation des outils.

Q17.

Comment installer le gestionnaire de paquets snap sur une distribution Debian GNU/Linux ?

Effectuer une recherche dans les paquets fournis via APT.

Il existe tout simplement un paquet appelé snapd.

sudo apt -y install snapd

Q18.

Comment installer le gestionnaire de conteneurs LXD ?

Rechercher dans la liste des snaps.

Le snap s'appelle tout simplement lxd.

sudo snap install lxd
2022-10-17T17:59:45+02:00 INFO Waiting for automatic snapd restart...
lxd 5.6-794016a from Canonical✓ installed

On peut lister les snaps installés.

snap list
Name    Version      Rev    Tracking       Publisher   Notes
core20  20220826     1623   latest/stable  canonical✓  base
lxd     5.6-794016a  23680  latest/stable  canonical✓  -
snapd   2.57.2       17029  latest/stable  canonical✓  snapd

Q19.

Comment faire pour que l'utilisateur normal etu ait la capacité à gérer les conteneurs ?

Rechercher le nom du groupe système correspondant à l'utilisation des outils LXD.

Il faut que l'utilisteur normal appartienne au groupe système lxd pour qu'il est tous les droits sur la gestion des conteneurs.

sudo adduser etu lxd

Attention ! Il faut se déconnecter/reconnecter pour bénéficier de la nouvelle attribution de groupe. On peut utiliser la commande groups pour vérifier le résultats.

groups
etu adm cdrom floppy sudo audio dip video plugdev staff netdev lxd

5.3. Configuration du gestionnaire de conteneurs LXD

Q20.

Quelle est l'instruction de configuration initiale du gestionnaire LXD ?

Utiliser l'aide de la commande lxd.

C'est l'instruction lxd init qui nous intéresse.

Voici une copie d'écran de son exécution.

lxd init
Would you like to use LXD 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]:
Name of the storage backend to use (lvm, btrfs, ceph, cephobject, dir) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GiB of the new loop device (1GiB minimum) [default=23GiB]:
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD 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 LXD 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 "lxd init" preseed to be printed? (yes/no) [default=no]:

Q21.

Quelle est l'instruction qui permet d'afficher le profil par défaut des conteneur ?

Rechercher dans les options de la commande lxc.

Voici un exemple d'exécution.

lxc profile show default
config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: macvlan
    parent: enp0s1
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by: []

Q22.

Quelle est l'instruction de lancement d'un conteneur ?

Rechercher dans les options de la commande lxc.

Tester son exécution avec un conteneur de type debian/12.

Voici un exemple d'exécution.

for i in {0..2}; do lxc launch images:debian/12 c$i; done
Creating c0
Starting c0
Creating c1
Starting c1
Creating c2
Starting c2
lxc ls
+------+---------+------+-------------------------------------------+-----------+-----------+
| NAME |  STATE  | IPV4 |                   IPV6                    |   TYPE    | SNAPSHOTS |
+------+---------+------+-------------------------------------------+-----------+-----------+
| c0   | RUNNING |      | fda0:7a62:1b8:0:216:3eff:fe9a:c1d1 (eth0) | CONTAINER | 0         |
+------+---------+------+-------------------------------------------+-----------+-----------+
| c1   | RUNNING |      | fda0:7a62:1b8:0:216:3eff:fe57:7019 (eth0) | CONTAINER | 0         |
+------+---------+------+-------------------------------------------+-----------+-----------+
| c2   | RUNNING |      | fda0:7a62:1b8:0:216:3eff:fe6b:c9de (eth0) | CONTAINER | 0         |
+------+---------+------+-------------------------------------------+-----------+-----------+

Q23.

Comment automatiser l'adressage IPv4 statique de chaque conteneur ?

Comme la gestion de la configuration des interfaces est assurée par systemd-networkd, il faut s'intéresser à la syntaxe du fichier /etc/systemd/network/eth0.network de chaque conteneur.

Une fois la syntaxe d'un fichier de configuration établie, il faut l'intégrer dans un script Bash avec une boucle qui parcourt toutes les instances de conteneurs.

Voici une proposition de code qui permet d'appliquer une configuration statique et de redémarrer le gestionnaire de configuration réseau de chacun des trois conteneurs.

#!/bin/bash

for i in {0..2}
do
        echo ">>>>>>>>>>>>>>>>> c$i"
config=$(cat << EOF
[Match]
Name=eth0

[Network]
DHCP=false
Address=192.0.2.$((i + 10))/24
Address=fda0:7a62:1b8::$(printf "%x" $((i + 10)))/64
Gateway=192.0.2.1
DNS=172.16.0.2
EOF
)
        lxc exec c$i -- bash -c "echo \"${config}\" | tee /etc/systemd/network/eth0.network"
        lxc exec c$i -- systemctl restart systemd-networkd
done

exit 0

Si le code du script ci-dessus est placé dans un fichier appelé c-static-addresses.sh, on peut l'exécuter directement et relever les résultats.

bash c-static-addresses.sh
lxc ls
+------+---------+-------------------+-------------------------------------------+-----------+-----------+
| NAME |  STATE  |       IPV4        |                   IPV6                    |   TYPE    | SNAPSHOTS |
+------+---------+-------------------+-------------------------------------------+-----------+-----------+
| c0   | RUNNING | 192.0.2.10 (eth0) | fda0:7a62:1b8::a (eth0)                   | CONTAINER | 0         |
|      |         |                   | fda0:7a62:1ae:0:216:3eff:fe9a:c1d1 (eth0) |           |           |
+------+---------+-------------------+-------------------------------------------+-----------+-----------+
| c1   | RUNNING | 192.0.2.11 (eth0) | fda0:7a62:1b8::b (eth0)                   | CONTAINER | 0         |
|      |         |                   | fda0:7a62:1ae:0:216:3eff:fe57:7019 (eth0) |           |           |
+------+---------+-------------------+-------------------------------------------+-----------+-----------+
| c2   | RUNNING | 192.0.2.12 (eth0) | fda0:7a62:1b8::c (eth0)                   | CONTAINER | 0         |
|      |         |                   | fda0:7a62:1ae:0:216:3eff:fe6b:c9de (eth0) |           |           |
+------+---------+-------------------+-------------------------------------------+-----------+-----------+

Q24.

Comment vérifier la connectivité réseau depuis les conteneurs ?

La question précédente montre qu'à ce stade de la configuration les conteneurs ne disposent que d'adresses IPv6. C'est donc sur ce protocole que les tests doivent porter.

Voici un exemple de test ICMP.

for i in {0..2}
do
        echo ">>>>>>>>>>>>>>>>> c$i"
        lxc exec c$i -- ping -c2 2620:fe::fe
done
>>>>>>>>>>>>>>>>> c0
PING 2620:fe::fe(2620:fe::fe) 56 data bytes
64 bytes from 2620:fe::fe: icmp_seq=1 ttl=58 time=44.8 ms
64 bytes from 2620:fe::fe: icmp_seq=2 ttl=58 time=42.9 ms

--- 2620:fe::fe ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 42.936/43.857/44.778/0.921 ms
>>>>>>>>>>>>>>>>> c1
PING 2620:fe::fe(2620:fe::fe) 56 data bytes
64 bytes from 2620:fe::fe: icmp_seq=1 ttl=58 time=43.4 ms
64 bytes from 2620:fe::fe: icmp_seq=2 ttl=58 time=42.8 ms

--- 2620:fe::fe ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 42.762/43.104/43.447/0.342 ms
>>>>>>>>>>>>>>>>> c2
PING 2620:fe::fe(2620:fe::fe) 56 data bytes
64 bytes from 2620:fe::fe: icmp_seq=1 ttl=58 time=43.6 ms
64 bytes from 2620:fe::fe: icmp_seq=2 ttl=58 time=42.7 ms

--- 2620:fe::fe ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 42.676/43.144/43.612/0.468 ms

On peut ensuite passer à la gestion de paquets après paramétrage du resolver DNS.

for i in {0..2}
do
        echo ">>>>>>>>>>>>>>>>> c$i"
        lxc exec c$i -- apt update
        lxc exec c$i -- apt -y full-upgrade
        lxc exec c$i -- apt clean
done