LXD est un gestionnaire de conteneurs système et de machines virtuelles de nouvelle génération, développé par Canonical. À la différence des conteneurs applicatifs Docker ou Podman, LXD instancie des systèmes Linux complets : chaque conteneur embarque son propre espace utilisateur, son processus init, ses services systemd — à l’instar d’une machine virtuelle, mais avec les performances natives d’un conteneur. La version 6.8, publiée en 2026, est aujourd’hui la référence stable pour les environnements de production Debian et Ubuntu.
Cet article présente deux piliers essentiels de l’orchestration LXD : les profils, qui définissent des configurations réutilisables pour les instances, et le clustering, qui distribue la charge sur plusieurs nœuds physiques avec une base de données distribuée Dqlite. Ces deux mécanismes combinés offrent une infrastructure conteneurisée homogène, scalable et résiliente.
Que vous gériez un parc de conteneurs sur un serveur unique ou que vous construisiez un cluster de plusieurs dizaines de nœuds, LXD fournit une interface unifiée — la commande lxc — et une API REST cohérente pour piloter l’ensemble de l’infrastructure.
Installation et initialisation de LXD
Installation via snap
LXD est distribué via snap, ce qui garantit une version à jour et isolée des dépendances système. Sur Ubuntu, snap est préinstallé. Sur Debian :
# Installer snapd sur Debian
sudo apt install snapd
sudo snap install core
# Installer LXD
sudo snap install lxd
# Vérifier la version installée
lxd --version
Ajoutez votre utilisateur au groupe lxd pour éviter de préfixer chaque commande avec sudo :
sudo usermod -aG lxd $USER
newgrp lxd
Initialisation de base
La commande lxd init guide l’initialisation. Pour une configuration non interactive avec un fichier preseed (recommandé pour l’automatisation) :
cat <<EOF | lxd init --preseed
config: {}
networks:
- name: lxdbr0
type: bridge
config:
ipv4.address: 10.10.10.1/24
ipv4.nat: "true"
ipv6.address: none
storage_pools:
- name: default
driver: zfs
config:
size: 50GiB
profiles:
- name: default
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: default
type: disk
EOF
# Vérifier l'état de l'installation
lxc info
ZFS est le backend de stockage recommandé pour LXD en production : il offre snapshots atomiques, clones rapides et compression native. Pour une présentation approfondie de ZFS, consultez l’article ZFS sur Linux : snapshots, clones et RAID-Z en pratique.
Gestion des profils LXD
Les profils sont des modèles de configuration réutilisables. Chaque instance hérite d’un ou plusieurs profils appliqués dans l’ordre déclaré. Le profil default est assigné automatiquement à toute nouvelle instance.
Anatomie d’un profil
Un profil se compose de deux sections : config (paramètres de l’instance : limites CPU, mémoire, options kernel) et devices (périphériques attachés : réseau, disque, GPU).
# Afficher le profil default
lxc profile show default
Sortie typique :
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: default
type: disk
name: default
used_by: []
Créer et configurer un profil
Exemple : un profil web limitant CPU et mémoire, adapté aux serveurs applicatifs :
# Créer le profil
lxc profile create web
# Limiter à 2 vCPU et 1 Go de RAM
lxc profile set web limits.cpu 2
lxc profile set web limits.memory 1GiB
# Ajouter une interface réseau
lxc profile device add web eth0 nic network=lxdbr0 name=eth0
# Disque racine avec quota de 20 Go
lxc profile device add web root disk path=/ pool=default size=20GiB
# Vérifier le résultat
lxc profile show web
Pour éditer un profil directement en YAML (ouvre $EDITOR) :
lxc profile edit web
Exemple de profil db pour un serveur de base de données, à haute mémoire :
lxc profile create db
lxc profile set db limits.cpu 4
lxc profile set db limits.memory 8GiB
# Modules kernel requis par certains moteurs SQL
lxc profile set db linux.kernel_modules "ip_tables,ip6_tables"
Appliquer des profils aux instances
Les profils peuvent être combinés — le dernier profil qui définit une clé est prioritaire. Les paramètres définis directement sur l’instance écrasent toujours les profils.
# Lancer une instance Ubuntu 24.04 avec les profils default + web
lxc launch ubuntu:24.04 mon-site --profile default --profile web
# Ajouter un profil à une instance existante
lxc profile add mon-site web
# Retirer un profil d'une instance
lxc profile remove mon-site web
# Dupliquer un profil pour créer une variante
lxc profile copy web web-heavy
lxc profile set web-heavy limits.memory 4GiB
lxc profile set web-heavy limits.cpu 8
# Lister tous les profils
lxc profile list
Clustering LXD multi-nœuds
Architecture d’un cluster
Un cluster LXD est constitué d’un nœud bootstrap et d’au moins deux membres supplémentaires. En production, trois membres minimum sont requis pour garantir le quorum Raft — un cluster à deux nœuds ne peut pas survivre à la perte d’un membre.
L’état du cluster est stocké dans une base Dqlite, une implémentation distribuée de SQLite répliquée via l’algorithme Raft. Tous les membres partagent la même configuration globale, tandis que certaines options (pools de stockage, interfaces réseau) restent locales à chaque nœud.
Prérequis réseau : tous les nœuds du cluster doivent pouvoir se joindre sur le port
8443/TCP. Synchronisez leurs horloges via NTP (systemd-timesyncdouchrony) — un écart de temps provoque des erreurs d’authentification Raft.
Initialisation du nœud bootstrap
# Sur node1 (192.168.1.10) — futur bootstrap
lxd init
Réponses aux questions clés :
Would you like to use LXD clustering? (yes/no) [default=no]: yes
What IP address or DNS name should be used to reach this server? [default=192.168.1.10]: 192.168.1.10
Are you joining an existing cluster? (yes/no) [default=no]: no
What name should be used to identify this server in the cluster? [default=node1]: node1
# Vérifier l'état initial du cluster
lxc cluster list
Ajouter des membres avec un join token
LXD utilise un système de tokens à usage unique pour sécuriser l’adhésion au cluster :
# Sur node1 — générer un token pour node2
lxc cluster add node2
# → Affiche un token base64 long. Copiez-le.
# Sur node2 — rejoindre le cluster
lxd init
# Répondre "yes" au clustering, "yes" pour rejoindre, coller le token
# Répéter pour node3
lxc cluster add node3
# → Lancer lxd init sur node3 avec le nouveau token
# Vérifier les membres du cluster depuis n'importe quel nœud
lxc cluster list
Gestion quotidienne du cluster
# Détails sur un membre
lxc cluster show node2
# Mettre un nœud en maintenance (déplace ses instances)
lxc cluster evacuate node2
# Restaurer après maintenance
lxc cluster restore node2
# Lancer une instance sur un nœud spécifique
lxc launch ubuntu:24.04 web01 --target node2
# Migrer une instance en live entre nœuds
lxc move web01 --target node3 --live
# Retirer définitivement un membre
lxc cluster remove node3
Groupes de placement (LXD 6.7+)
Les groupes de placement permettent de regrouper des nœuds par rack, zone ou usage pour contraindre l’emplacement des instances — utile pour la tolérance aux pannes rack :
# Créer un groupe par rack physique
lxc cluster group create rack-A
lxc cluster group assign node1 rack-A
lxc cluster group assign node2 rack-A
lxc cluster group create rack-B
lxc cluster group assign node3 rack-B
# Lancer une instance sur un groupe de placement
lxc launch ubuntu:24.04 db01 --target @rack-B
Bonnes pratiques pour la production
Snapshots automatiques : configurez des snapshots périodiques pour chaque instance ou via un profil :
# Snapshot toutes les 6 heures, expiration après 7 jours
lxc config set mon-site snapshots.schedule "0 */6 * * *"
lxc config set mon-site snapshots.expiry "7d"
# Créer un snapshot manuel avant une opération risquée
lxc snapshot mon-site avant-maj
lxc restore mon-site avant-maj
Sécurité et isolation :
# Désactiver le nesting (conteneurs dans conteneurs) par défaut
lxc profile set default security.nesting false
# Forcer les conteneurs non privilégiés (pas de mapping root=root)
lxc profile set default security.privileged false
# Activer AppArmor sur tous les conteneurs
lxc profile set default security.apparmor true
Supervision de la santé du cluster :
# État global du cluster
lxc cluster list
# Ressources disponibles sur un nœud
lxc info --resources node2:
# Lister toutes les instances avec leur nœud d'hébergement
lxc list -c nNsS
Pour les environnements exigeant une haute disponibilité avec stockage partagé, LXD s’intègre nativement avec Ceph pour le stockage distribué et OVN pour le réseau overlay — le complément idéal aux mécanismes vus dans l’article sur Pacemaker et Corosync pour la haute disponibilité Linux.
À lire également
- Installation et Configuration des Conteneurs LXC sur Linux — Les fondamentaux de LXC sur lesquels LXD s’appuie : création, gestion et configuration des conteneurs système.
- Gestion des ressources cgroups v1/v2 avec LXC — Comprendre les cgroups pour maîtriser les limites CPU, mémoire et I/O appliquées par LXD sous le capot.
- Podman : alternative rootless à Docker — Une autre approche de la conteneurisation sans daemon, à comparer avec LXD selon les cas d’usage.
- Pacemaker et Corosync — cluster haute disponibilité Linux — Pour les architectures HA au niveau applicatif qui complètent un cluster LXD.