12 KiB
Incus pour gérer vos VM et CT
- Incus, c'est quoi ?
- Installation
- Commandes utiles
- Lancer des conteneurs et tester
- Lancer un conteneur dans le réseau local
- Sources
Incus, c'est quoi ?
Incus est une solution moderne de virtualisation et de gestion de conteneurs, conçue comme un fork communautaire de LXD après le changement de licence de Canonical. Open source et axé sur la simplicité, Incus permet de créer et gérer des conteneurs et des machines virtuelles, le tout avec une intégration fluide sur Linux. Il se distingue par sa légèreté, sa sécurité renforcée et sa compatibilité avec les technologies cloud, tout en offrant une interface en ligne de commande intuitive et une API REST. Idéal pour les développeurs et les administrateurs système, Incus facilite le déploiement d’environnements isolés, que ce soit pour le développement, les tests ou la production, tout en restant performant et facile à prendre en main. Son approche modulaire et sa communauté active en font un outil de choix pour ceux qui recherchent une alternative flexible et transparente aux solutions propriétaires.
Installation
Incus est compatible et disponible sur la majorité des distributions Linux.
Dans mon cas, j'ai installé Incus sur une machine Fedora 43.
Ma machine hôte est dotée de 2 cartes réseau, une qui sera utilisée pour la connexion à la machine et une autre qui sera utilisée comme pont pour les machines invitées.
Installer le paquet incus sur la machine
dnf install -y incus
Activer et démarrer le service Incus
systemctl enable --now incus
systemctl start incus
Configuration du kernel
Ces modifications sont nécessaires pour permettre au kernel linux de lancer les machines virtuelles et les conteneurs. Pour aller plus loin, vous pouvez consulter cette page.
Mettre le contenu suivant dans /etc/sysctl.d/90-incus-override.conf
## The following changes have been made for LXD ##
# fs.inotify.max_queued_events specifies an upper limit on the number of events that can be queued to the corresponding inotify instance
- (default is 16384)
fs.inotify.max_queued_events = 1048576
# fs.inotify.max_user_instances This specifies an upper limit on the number of inotify instances that can be created per real user ID -
(default value is 128)
fs.inotify.max_user_instances = 1048576
# fs.inotify.max_user_watches specifies an upper limit on the number of watches that can be created per real user ID - (default is 8192)
fs.inotify.max_user_watches = 1048576
# vm.max_map_count contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of cal
ling malloc, directly by mmap and mprotect, and also when loading shared libraries - (default is 65530)
vm.max_map_count = 262144
# kernel.dmesg_restrict denies container access to the messages in the kernel ring buffer. Please note that this also will deny access t
o non-root users on the host system - (default is 0)
kernel.dmesg_restrict = 1
# This is the maximum number of entries in ARP table (IPv4). You should increase this if you create over 1024 containers.
net.ipv4.neigh.default.gc_thresh3 = 8192
# This is the maximum number of entries in ARP table (IPv6). You should increase this if you plan to create over 1024 containers.Not nee
ded if not using IPv6, but...
net.ipv6.neigh.default.gc_thresh3 = 8192
# This is a limit on the size of eBPF JIT allocations which is usually set to PAGE_SIZE * 40000. Set this to 1000000000 if you are running Rocky Linux 9.x
net.core.bpf_jit_limit = 1000000000
# This is the maximum number of keys a non-root user can use, should be higher than the number of containers
kernel.keys.maxkeys = 2000
# This is the maximum size of the keyring non-root users can use
kernel.keys.maxbytes = 2000000
# This is the maximum number of concurrent async I/O operations. You might need to increase it further if you have a lot of workloads th
at use the AIO subsystem (e.g. MySQL)
fs.aio-max-nr = 524288
Redémarrer la machine
Une fois que la machine a redémarré, lancer
sysctl net.core.bpf_jit_limit
Et vérifier que le retour est bien
net.core.bpf_jit_limit = 1000000000
Initialisation d'Incus
Lancer la commande incus admin init.
Le processus permet de choisir la configuration qui sera appliquée.
Would you like to use clustering? (yes/no) [default=no]:
Ce choix permet d'activer ou non le mode cluster, je laisse le choix par défaut (no) car je n'ai qu'une seule machine pour le moment.
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Ici, laisser le choix par défaut (yes) pour configurer le stockage d'Incus.
Name of the new storage pool [default=default]:
Ici, il est possible de choisir le nom pour le stockage, je laisse la valeur par défaut.
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]:
Ici, il est possible de choisir le système de stockage qui sera utilisé. Dans mon cas, j'ai choisi dir.
dir n'est pas recommandé pour la production, mais permet d'accéder facilement aux fichiers présents dans les conteneurs sans passer par Incus.
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=incusbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Laisser ces choix à leurs valeurs par défaut, il s'agit ici de configurer le réseau qui sera utilisé par nos invités.
Would you like the Incus server to be available over the network? (yes/no) [default=no]: yes
Ici, il est possible de permettre (ou non) d'accéder au serveur depuis le réseau. Je choisi yes car je veux pouvoir gérer Incus depuis ma machine de travail.
Address to bind Incus to (not including port) [default=all]:
Port to bind Incus to [default=8443]:
Laisser ces choix à leurs valeurs par défaut aussi, il s'agit de configurer le port et l'interface sur laquelle l'API d'Incus se mettra en écoute.
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
Ici, il est possible d'activer (ou non) la mise à jour automatique des images de VM ou CT. Laisser le choix par défaut (yes).
Would you like a YAML "incus admin init" preseed to be printed? (yes/no) [default=no]:
Laisser le choix par défaut (no).
Configurer l'utilisateur d'administration
Il est possible et recommandé de créer un utilisateur spécifique pour l'administration du serveur Incus.
Dans mon cas, cet utilisateur sera balin.
Ajouter l'utilisateur aux groupes Incus :
usermod -aG incus-admin balin
usermod -aG incus balin
Configurer les subuid et subgid pour l'utilisateur root :
Dans les fichiers /etc/subuid et /etc/subgid, ajoutez la ligne suivante :
root:1000000:1000000000
Redémarrer la machine
Configuration du pare-feu / réseau
Les commandes données utiliseront firewalld car c'est le programme par défaut de Fedora.
Ajouter une zone pour le pont réseau
firewall-cmd --new-zone=bridge --permanent
firewall-cmd --reload
Ajouter le pont réseau à la nouvelle zone
firewall-cmd --zone=bridge --add-interface=incusbr0 --permanent
firewall-cmd --zone=bridge --set-target=ACCEPT --permanent
firewall-cmd --reload
Lancer firewall-cmd --zone=bridge --list-all et vérifier le résultat
bridge (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: incusbr0
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Créer une zone pour le réseau local
firewall-cmd --new-zone=local --permanent
firewall-cmd --reload
Accepter le trafic local dans la nouvelle zone
firewall-cmd --zone=local --add-source=127.0.0.1/8 --permanent
firewall-cmd --zone=local --set-target=ACCEPT --permanent
firewall-cmd --reload
Vérifier la configuration de la nouvelle zone firewall-cmd --zone=local --list all
local (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 127.0.0.1/8
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Ajouter le réseau local dans la zone trusted ainsi que le service ssh (si pas déjà fait)
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
firewall-cmd --zone=trusted --add-service=ssh
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
Configuration d'un pont physique
J'ai choisi d'utiliser la deuxième interface réseau de ma machine (enp5s0f1) pour permettre aux VMs et CTs d'accéder en direct à mon réseau local.
incus network create localnet --type=physical parent=enp5s0f1
Pour que cela fonctionne, il est aussi nécessaire d'installer et démarrer openvswitch
dnf install -y openvswitch
systemctl enable --now openvswitch
systemctl start openvswitch
Commandes utiles
-
incus list - Lister toutes les instances (conteneurs et machines virtuelles).
-
incus launch images:ubuntu/22.04 <nim> - Créer et démarrer un conteneur à partir d’une image Ubuntu 22.04.
-
incus start <nom> - Démarrer une instance existante.
-
incus stop <nom> - Arrêter une instance en cours d’exécution.
-
incus restart <nom> - Redémarrer une instance.
-
incus delete <nom> - Supprimer définitivement une instance.
-
incus exec <nom> -- bash - Ouvrir un shell interactif dans un conteneur.
-
incus file pull <nom>/chemin/vers/fichier ./ - Copier un fichier depuis un conteneur vers la machine hôte.
-
incus file push ./fichier <nom>/chemin/ - Copier un fichier de la machine hôte vers un conteneur.
-
incus config show <nom> - Afficher la configuration d’une instance.
-
incus image list - Lister les images disponibles localement.
-
incus profile list - Lister les profils de configuration disponibles.
-
incus network list - Lister les réseaux configurés.
Lancer des conteneurs et tester
Nous allons maintenant lancer deux conteneurs pour vérifier que tout fonctionne et qu'ils peuvent communiquer entre eux.
Lancer les conteneurs
incus launch images:fedora/43 foo
incus launch images:fedora/43 bar
Dans un premier terminal, lancer
incus exec foo -- bash
Et dans un second
incus exec bar -- bash
Normalement le ping entre les deux devrait fonctionner.
Les deux conteneurs devraient avoir des adresses IP similaires à 10.123.111.40/24, donc des adresses IP qui ne sont pas dans le réseau local mais dans le réseau d'Incus.
Lancer un conteneur dans le réseau local
Précédemment, un pont "physique" a été créé pour permettre de connecter des VMs et CTs directement au réseau local.
Créer un conteneur sans interface réseau
incus init images:fedora/43 testlocal
Lui ajouter une interface réseau
incus config device add testlocal eth0 nic nictype=macvlan parent=enp5s0f1 name=eth0
Puis le démarrer
incus start testlocal
Finalement, ouvrir un shell dans le conteneur
incus exec testlocal -- bash
Et vérifier son adresse IP.
Il devrait avoir une interface eth0 avec une adresse IP dans le réseau local et attribuée par le routeur.