Aller au contenu

Incus

Dans cet article

Information

Incus est un gestionnaire de conteneurs système et de machines virtuelles open-source. Il s'agit d'un fork de LXD et fournit un outil simple mais puissant pour gérer les conteneurs Linux et les machines virtuelles sur une plateforme unifiée.

Incus. Fonctionnalités clés

  • Gestion des conteneurs et des VM : Incus permet d'exécuter des conteneurs système Linux et des machines virtuelles QEMU/KVM à part entière via une interface unique.
  • Isolation des processus : Les conteneurs fonctionnent dans un environnement isolé avec leurs propres systèmes de fichiers, interfaces réseau et processus.
  • Capacités réseau : Prise en charge intégrée de divers types de réseaux - ponts, NAT, VLANs, réseaux overlay pour les conteneurs.
  • Gestion du stockage : Système flexible de pools de stockage prenant en charge différents backends - dir, btrfs, ZFS, LVM.
  • Instantanés et migration : Création d'instantanés de l'état des conteneurs, migration en direct entre hôtes sans interruption des services.
  • Profils de configuration : Profils réutilisables pour le déploiement rapide de conteneurs avec des paramètres prédéfinis.
  • Limitation des ressources : Contrôle précis du CPU, de la mémoire, de l'E/S disque et de la bande passante réseau pour chaque conteneur.
  • API REST : API HTTP complète pour l'automatisation et l'intégration avec des systèmes externes.
  • Interface Web : Panneau de gestion web intégré pour le contrôle visuel de l'infrastructure.
  • Bibliothèque d'images : Accès à une vaste collection d'images prêtes à l'emploi de diverses distributions Linux.
  • Clustering : Possibilité de combiner plusieurs hôtes en un seul cluster pour une gestion distribuée.

Fonctionnalités de déploiement

ID Nom du logiciel Système d'exploitation compatible VM BM VGPU GPU Min CPU (Cœurs) Min RAM (GB) Min HDD/SSD (GB) Domaine personnalisé Actif
234 Linux Containers Incus Debian 13 + + + + 2 2 50 Non COMMANDER

Chemins et fichiers principaux d'Incus :

  • Fichier de configuration principal : /etc/default/incus
  • Répertoire de données : /var/lib/incus
  • Pools de stockage : /var/lib/incus/storage-pools/
  • Conteneurs : /var/lib/incus/containers/
  • Images : /var/lib/incus/images/
  • Fichier journal : /var/log/incus/incusd.log
  • Services système : /usr/lib/systemd/system/incus*.service
  • Configuration Sysctl : /etc/sysctl.d/50-incus.conf
  • Configuration utilisateur : /root/.config/incus/

Remarque

Sauf indication contraire, nous installons par défaut la dernière version de sortie du logiciel depuis le site du développeur ou les dépôts du système d'exploitation.

Prise en main après le déploiement d'Incus

Après le paiement, une notification par e-mail sera envoyée à l'adresse spécifiée lors de l'inscription indiquant que le serveur est prêt à fonctionner. Elle contiendra l'adresse IP du VPS et les identifiants d'accès. Les clients de notre entreprise gèrent les équipements via le panneau de gestion des serveurs et l'APIInvapi.

Les données d'authentification peuvent être trouvées soit dans l'onglet Configuration >> Tags du panneau de gestion des serveurs, soit dans l'e-mail envoyé :

  • Lien d'accès à l'interface Web Incus : dans la balise webpanel (port 8443, HTTPS)

Important

Pour accéder à l'interface web, vous devez utiliser HTTPS et accepter le certificat auto-signé dans votre navigateur.

Lors du premier accès à l'interface web Incus, le navigateur avertira d'une connexion non sécurisée en raison du certificat auto-signé. Vous devez accepter le certificat pour continuer :

Après avoir accepté le certificat, la page de connexion s'ouvrira. Cliquez sur le bouton Login with TLS pour démarrer le processus d'authentification :

Le système vous redirigera vers la page d'ajout d'un certificat existant :

Sélectionnez l'onglet Trust token et suivez les instructions :

  1. Dans le terminal du serveur, exécutez la commande pour générer un jeton :

    incus config trust add myclient
    

  2. Le système générera un jeton qui doit être copié :

  3. Collez le jeton obtenu dans le champ de texte correspondant sur la page d'authentification et cliquez sur Import.

Après une authentification réussie, la page principale de l'interface web avec la liste des instances s'ouvrira.

Création d'un nouveau conteneur via l'interface Web

Pour créer un nouveau conteneur, cliquez sur le bouton Create instance dans le coin supérieur droit de l'interface :

Un formulaire de création d'instance avec plusieurs sections de configuration s'ouvrira. Pour sélectionner une image de base, cliquez sur le bouton Browse images. Une fenêtre de sélection d'image avec des filtres par distribution, version, variante, architecture et type s'ouvrira :

Les sections de configuration suivantes sont disponibles :

  • Main configuration — paramètres de base du conteneur : nom, description, type d'instance (conteneur ou machine virtuelle), image de base et profils assignés ;
  • Devices — gestion des périphériques du conteneur :
  • Disk — configuration du périphérique de disque et du point de montage ;
  • Network — configuration de l'interface réseau ;
  • GPU — connexion d'accélérateurs graphiques ;
  • Proxy — configuration de la redirection de ports entre l'hôte et le conteneur ;
  • Other — types de périphériques supplémentaires ;
  • Resource limits — limitation des ressources : processeur (CPU), RAM, opérations E/S disque ;
  • Security policies — politiques de sécurité : configuration de l'isolation, privilèges et profils de sécurité (AppArmor, SELinux) ;
  • Snapshots — gestion des instantanés de l'état du conteneur pour la sauvegarde et la récupération ;
  • Migration — paramètres de migration des conteneurs entre hôtes ;
  • Boot — paramètres de démarrage : ordre des périphériques de démarrage, démarrage automatique au démarrage du système ;
  • Cloud init — configuration de l'initialisation automatique du conteneur via cloud-init (utilisateurs, réseau, paquets, scripts).

Sélectionnez l'image souhaitée en cliquant sur le bouton Select à côté :

Après avoir sélectionné une image, remplissez les paramètres de base :

  • Instance name — nom du conteneur ;
  • Description — description (facultatif) ;
  • Instance type — type d'instance (Container ou Virtual Machine) ;
  • Profiles — profils de configuration.

Pour démarrer le conteneur immédiatement après sa création, cliquez sur Create and start. Pour créer sans démarrer, utilisez le bouton Create.

Surveillance de l'état du conteneur

Pendant le déploiement du conteneur, la progression du téléchargement de l'image est affichée. Le statut "Setting up" avec l'indication de la progression du téléchargement montre l'avancement actuel de la création de l'instance. Une fois l'installation terminée, le statut passera à "Running" avec un indicateur vert :

Gestion des services

Vérification de l'état :

systemctl status incus

Redémarrage du service :

systemctl restart incus

Arrêt du service :

systemctl stop incus

Démarrage du service :

systemctl start incus

Affichage des journaux :

journalctl -u incus -f
tail -f /var/log/incus/incusd.log

Configuration initiale de l'infrastructure

Après le déploiement du serveur, il est recommandé d'effectuer la configuration initiale de l'infrastructure Incus.

Création d'un pool de stockage

Un pool de stockage définit où les données des conteneurs seront stockées :

incus storage create default dir source=/var/lib/incus/storage-pools/default

Vérification des pools de stockage créés :

incus storage list

Pour afficher des informations détaillées sur un pool :

incus storage show default

Configuration réseau

Création d'un pont NAT pour les conteneurs avec adressage IPv4 automatique :

incus network create incusbr0 ipv4.address=auto ipv6.address=none

Vérification des paramètres réseau :

incus network list

Affichage de la configuration réseau :

incus network show incusbr0

Configuration du profil par défaut

Le profil default définit la configuration de base pour les nouveaux conteneurs. Ajout d'un disque racine au profil :

incus profile device add default root disk path=/ pool=default

Ajout d'une interface réseau au profil :

incus profile device add default eth0 nic network=incusbr0

Vérification de la configuration du profil :

incus profile show default

Création et gestion des conteneurs

Création d'un conteneur

Exemple de création d'un conteneur Debian 12 avec des limites de ressources :

incus launch images:debian/12 deb12 --profile default \
  -c limits.cpu=2 -c limits.memory=2GiB

Paramètres de la commande :

  • images:debian/12 - image du dépôt public
  • deb12 - nom du conteneur
  • --profile default - utilisation du profil par défaut
  • -c limits.cpu=2 - limitation à 2 cœurs CPU
  • -c limits.memory=2GiB - limitation de mémoire de 2 Go

Affichage des conteneurs

Liste de toutes les instances :

incus list

La sortie contiendra des informations sur l'état, les adresses IP et le type de chaque conteneur.

Gestion de l'état du conteneur

Démarrage d'un conteneur :

incus start <name>

Arrêt d'un conteneur :

incus stop <name>

Redémarrage d'un conteneur :

incus restart <name>

Suppression d'un conteneur (nécessite un arrêt) :

incus delete <name>

Suppression forcée d'un conteneur en cours d'exécution :

incus delete <name> --force

Accès au conteneur

Connexion via bash :

incus exec deb12 -- bash

Connexion à la console TTY :

incus console deb12

Pour quitter la console, utilisez la combinaison de touches Ctrl+a q.

Redirection de ports

Pour accéder aux services à l'intérieur d'un conteneur depuis un réseau externe, la redirection de ports est utilisée via un périphérique proxy :

incus config device add deb12 web proxy \
  listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80

Cette commande redirige le port 8080 de l'hôte vers le port 80 du conteneur.

Exemple pour plusieurs ports :

HTTP :

incus config device add mycontainer http proxy \
  listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80

HTTPS :

incus config device add mycontainer https proxy \
  listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443

SSH :

incus config device add mycontainer ssh proxy \
  listen=tcp:0.0.0.0:2222 connect=tcp:127.0.0.1:22

Gestion de la configuration des conteneurs

Affichage de la configuration

Affichage de la configuration complète développée du conteneur :

incus config show <name> --expanded

Affichage de la configuration de base sans les profils :

incus config show <name>

Modification des paramètres

Définition des paramètres de configuration :

Limitation du CPU :

incus config set <name> limits.cpu=4

Limitation de la mémoire :

incus config set <name> limits.memory=4GiB

Limitation des E/S disque :

incus config set <name> limits.disk.priority=5

Démarrage automatique du conteneur :

incus config set <name> boot.autostart=true

Ajout de périphériques

Syntaxe générale pour l'ajout de périphériques :

incus config device add <name> <device-name> <type> key=value

Exemples :

Ajout d'un disque supplémentaire :

incus config device add mycontainer data disk \
  source=/data/mycontainer pool=default

Ajout d'une interface réseau supplémentaire :

incus config device add mycontainer eth1 nic \
  network=incusbr1 name=eth1

Montage d'un répertoire hôte dans un conteneur :

incus config device add mycontainer shared disk \
  source=/host/path path=/container/path

Suppression d'un périphérique :

incus config device remove <name> <device-name>

Travail avec les instantanés et la migration

Création d'instantanés

Les instantanés permettent de sauvegarder l'état du conteneur pour une récupération ultérieure :

incus snapshot <name> <snapshot-name>

Exemple :

incus snapshot deb12 before-update

Liste des instantanés du conteneur :

incus info <name>

Restauration à partir d'un instantané

incus restore <name> <snapshot-name>

Exemple :

incus restore deb12 before-update

Suppression d'un instantané :

incus delete <name>/<snapshot-name>

Renommage et copie

Renommage d'un conteneur :

incus move <name> <newname>

Copie d'un conteneur sur le même hôte :

incus copy <name> <newname>

Copie d'un conteneur vers un autre hôte Incus :

incus copy <name> <remote>:<newname>

Pour travailler avec des hôtes distants, vous devez d'abord ajouter un distant :

incus remote add myremote https://remote-ip:8443

Gestion des images

Affichage des images

Liste des images locales :

incus image list

Liste des images dans le dépôt distant :

incus image list images:

Recherche d'une distribution spécifique :

incus image list images: debian
incus image list images: ubuntu

Copie d'images

Copie d'une image depuis le dépôt public avec mise à jour automatique :

incus image copy images:debian/12 local: --auto-update

Copie d'une image avec alias :

incus image copy images:debian/12 local: --alias debian12

Création d'une image à partir d'un conteneur

incus publish <container-name> --alias my-custom-image

Suppression d'images

incus image delete <image-fingerprint>

ou par alias :

incus image delete <alias>

Interaction réseau

Gestion du réseau

Liste des réseaux :

incus network list

Affichage de la configuration réseau :

incus network show <network-name>

Création d'un nouveau réseau :

# Création d'un réseau pont
incus network create mybr0 \
  ipv4.address=10.10.10.1/24 \
  ipv4.nat=true \
  ipv6.address=none


# Création d'un réseau macvlan
incus network create mymacvlan \
  type=macvlan \
  parent=eth0

Modification d'un réseau :

incus network edit <network-name>

Suppression d'un réseau :

incus network delete <network-name>

Règles de redirection réseau

Création d'une règle de redirection pour la redirection de ports :

incus network forward create incusbr0 <external-ip>
incus network forward port add incusbr0 <external-ip> tcp 80 <container-ip> 80

Gestion du stockage

Gestion des pools de stockage

Liste des pools :

incus storage list

Affichage des informations du pool :

incus storage show <pool-name>

Création d'un pool de stockage :

Pool basé sur Dir :

incus storage create mypool dir source=/var/lib/incus/pools/mypool

Pool Btrfs :

incus storage create mybtrfs btrfs source=/dev/sdb

Pool ZFS :

incus storage create myzfs zfs source=/dev/sdc

Modification d'un pool :

incus storage edit <pool-name>

Suppression d'un pool :

incus storage delete <pool-name>

Gestion des volumes

Création d'un volume personnalisé :

incus storage volume create <pool-name> <volume-name>

Liste des volumes dans un pool :

incus storage volume list <pool-name>

Attachement d'un volume à un conteneur :

incus config device add <container> <device-name> disk \
  pool=<pool-name> \
  source=<volume-name> \
  path=/mount/path

Copie d'un volume :

incus storage volume copy <pool>/<volume> <pool>/<new-volume>

Suppression d'un volume :

incus storage volume delete <pool-name> <volume-name>

Configuration du NAT et du routage

Dans certains cas, une configuration manuelle des règles NAT et de routage peut être nécessaire pour fournir un accès réseau des conteneurs au réseau externe.

Passage à nftables

update-alternatives --set iptables /usr/sbin/iptables-nft
update-alternatives --set ip6tables /usr/sbin/ip6tables-nft
update-alternatives --set arptables /usr/sbin/arptables-nft
update-alternatives --set ebtables /usr/sbin/ebtables-nft

Activation du transfert IP

sysctl -w net.ipv4.ip_forward=1

Pour une application permanente, ajoutez à /etc/sysctl.conf :

net.ipv4.ip_forward=1

Redémarrage d'Incus après les modifications :

systemctl restart incus

Configuration de la table NAT

Création de la table NAT et de la chaîne POSTROUTING :

nft add table ip nat
nft add chain ip nat POSTROUTING '{ type nat hook postrouting priority srcnat; }'

Ajout d'une règle de masquerade pour le sous-réseau des conteneurs :

nft add rule ip nat POSTROUTING oifname "ens1" ip saddr 10.1.4.0/24 counter masquerade

Remarque

Remplacez ens1 par le nom de votre interface réseau externe et 10.1.4.0/24 par le sous-réseau de votre pont Incus.

Configuration de la chaîne FORWARD

Création de la table de filtrage et de la chaîne FORWARD :

nft add table ip filter
nft add chain ip filter FORWARD '{ type filter hook forward priority 0; policy accept; }'

Ajout de règles pour autoriser le trafic :

Autoriser le trafic des conteneurs vers l'extérieur :

nft insert rule ip filter FORWARD iifname "incusbr0" oifname "ens1" accept

Autoriser le trafic établi/associé en retour :

nft insert rule ip filter FORWARD iifname "ens1" oifname "incusbr0" ct state established,related accept

Vérification des règles nftables

Affichage de toutes les règles :

nft list ruleset

Sauvegarde des règles (pour Debian/Ubuntu) :

Installation du paquet pour la sauvegarde des règles :

apt-get install nftables

Sauvegarde des règles actuelles :

nft list ruleset > /etc/nftables.conf

Activation du chargement automatique :

systemctl enable nftables

Remarque

Des informations détaillées sur toutes les fonctionnalités d'Incus sont contenues dans la documentation officielle du développeur.

Commande d'un serveur avec Incus via l'API