Les bases de LXD

LXD est une interface permettant de manipuler facilement les conteneurs LXC (LinuX Conteners), disponibles sur les distributions Ubuntu notamment.

Mis en place par Canonical, LXD possède un site Internet officiel avec de nombreuses ressources : https://linuxcontainers.org/

Au menu de cet article :

 

Préparation d'un serveur LXD

Installation et initialisation

La première étape est d'installer le paquet lxd sur votre serveur : apt-get install lxd

Une fois le paquet installé, le serveur doit être configuré avec la commande lxd init qui demande quelques informations. Voici un exemple de réponse pour une configuration standard d'un serveur LXD :

InformationValeur
Utilisation du clustering Non
Configuration d'un nouveau pool de stockage Oui
Nom du pool de stockage lxd1
Système de stockage btrfs
Création d'un nouveau pool BTRFS Oui
Utilisation d'un bloc existant Non
Taille du dispositif 15 Go
Connexion à un serveur MAAS Non
Création d'une carte réseau en pont Oui
Nom de la carte réseau lxdbr0
Adresse IPv4 de la carte réseau 192.168.240.1/24
Autorisation du trafic en NAT Oui
Adresse IPv6 Non
Autorisation de LXD à travers le réseau Non
Mise à jour automatique des images en cache Oui
Affichage du fichier YAML pour lxd init Non

Avec cette configuration, le serveur LXD stockera les conteneurs au format BTRFS sur la partition principale du serveur, avec une limite de 15 Go. Les conteneurs pourront communiquer avec le réseau extérieur via une carte réseau en pont nommée lxdbr0, tous les conteneurs et la serveur physique se trouveront dans le réseau 192.168.240.0/24 (la carte du serveur aura pour adresse 192.168.240.1/24).

Configuration du proxy sur LXD

Deux manipulations sont nécessaire afin que votre serveur LXD puis vos conteneurs puissent accéder à Internet si votre serveur accède à Internet via un proxy.

Valorisation des variables système http_proxy et https_proxy  avec les commandes suivantes :

  • export http_proxy="http://identifiant:mdp@ip:port/"
  • export https_proxy="http://identifiant:mdp@ip:port/"

Configuration du proxy dans le serveur LXD avec les commandes suivantes (après avoir installé LXD sur votre serveur évidemment) :

  • lxc config set core.proxy_http http://identifiant:mdp@ip:port
  • lxc config set core.proxy_https http://identifiant:mdp@ip:port

 

Création et gestion des conteneurs

La commande lxc

La commande lxc (et non lxd) permet de gérer les conteneur. Voici ces principales options :

OptionFonction
launch Création et lancement d'un conteneur
init Création d'un conteneur
start Démarrage d'un conteneur
stop Arrêt d'un conteneur
list Liste des conteneurs
exec Exécution d'une commande dans un conteneur
config Configuration du serveur et des conteneurs
file Gestion des fichiers des conteneurs
network Gestion du réseau des conteneurs
publish Gestion de l'image d'un conteneur
image Gestion des images de conteneurs

La liste complète des options est disponible en tapant la commande lxc help sur votre serveur LXD.

Les images

Les conteneurs sont créés à partir d'images disponibles sur trois serveurs en ligne : le serveur ubuntu (images des versions stables d'Ubuntu), le serveur ubuntu-daily (images des dernières versions d'Ubuntu) et le serveur images (images de diverses distributions Linux).

La liste des images disponibles sur un de ces trois serveurs est accessible avec la commande lxc image list serveur: (en remplaçant serveur par le nom du serveur).

Lorsque vous créez un conteneur à partir d'une image en ligne, elle est téléchargée sur le serveur local et stockée localement. Vous pouvez consulter la liste des images locales avec la commande lxc image list local:. Vous pouvez ensuite supprimer une image locale avec la commande lxc image delete aliasimage (si l'image n'a pas d'alias, utilisez le fingerprint).

Création d'un conteneur

 Un conteneur se crée avec la commande lxc init serveur:systeme conteneur avec :

  • serveur : nom du serveur de l'image sur laquelle baser le conteneur ;
  • systeme : version du système d'exploitation (possibilité d'ajouter la version à la suite en la séparant du système avec un /) ;
  • conteneur : nom que vous souhaitez donner à votre conteneur. Si vous n'en précisez aucun, un nom aléatoire sera donné au conteneur.

 Exemples de création de conteneurs:

  • Ubuntu 18.04 : lxc init ubuntu:18.04 srv-ubuntu
  • Debian 9 (Stretch) : lxc init images:debian/stretch mondebian
  • Alpine 3.10 64 bits : lxc init images:alpine/3.10/amd64 servalp

Deux points à noter :

  • Lors de la première création d'un conteneur à partir d'une image, l'image est téléchargée d'Internet avant la création du conteneur, ce qui peut prendre du temps. Si vous créez un deuxième conteneur à partir de la même image, la création sera quasiment instantanée puisque l'image sera stockée sur le serveur LXD.
  • La commande lxc init crée le conteneur ne le lance pas. Si vous souhaitez créer le conteneur et le lancer dans la foulée, utilisez la commande lxc launch.
Manipulation d'un conteneur
  • Démarrage d'un conteneur : lxc start conteneur
  • Arrêt d'un conteneur : lxc stop conteneur
  • Suppression d'un conteneur : lxc delete conteneur
Exécution d'une commande dans un conteneur

La commande lxc exec permet d'exécuter une commande à l'intérieur d'un conteneur avec la syntaxe suivante : lxc exec conteneur commande.  Par exemple, pour mettre à jour les dépôts sur un conteneur nommé srv-web : lxc exec srv-web apt-get update

La commande lxc exec permet également d'accéder facilement au shell d'un conteneur en lançant le shell (via le raccourci /bin/bash) du conteneur : lxc exec conteneur /bin/bash. Vous pouvez ensuite executer directement les commandes dans le conteneur sans passer par lxc exec.

 

Gestion du réseau

Mode bridged

Mode par défaut, les conteneurs communiquent vers l'extérieur via la carte pont créée lors de l'initialisation de LXD. Un réseau IP particulier est créé entre les conteneur et la carte pont du serveur, la machine hôte fait office de routeur avec que le réseau des conteneurs puissent communiquer avec le réseau externe au serveur.

La carte réseau des conteurs ont une configuration IP attribuée par LXD en DHCP. Vous pouvez néanmoins attrivuer une configuration IP particulière à vos conteneurs avec les commandes suivantes :

  • Attachement de la carte réseau du conteneur au pont : lxc network attach pont conteneur interfaceconteneur
  • Définition de l'adresse IP : lxc config device set conteneur interfaceconteneur ipv4.address X.X.X.X

Un redémarrage du conteneur ou une relance de Netplan dans le conteneur est parfois nécessaire pour que l'adresse IP soit attribuée correctement à la carte réseau du conteneur.

Exemple, pour attribuer l’adresse 192.168.1.1 à l’interface eth0 du conteneur srv-test, qui sera attachée à la carte pont lxdbr0 :

  • lxc network attach lxdbr0 srv-test eth0
  • lxc config device set srv-test eth0 ipv4.address 192.168.1.1
Mode macvlan

Le mode macvlan permet à un conteneur d'accéder directement au réseau externe au serveur LXD, en attribuant une deuxième adresse MAC à la carte réseau du serveur LXD permettant d'identifier les trames du conteneur.

Manipulation préalable : le mode promiscuité (permettant à une carte réseau d'accepter des trames qui ne lui sont pas destinées) doit être activé sur la carte réseau du serveur LXD. Ce mode s'active avec la commande ip link set enp0s3 promisc on (à faire une seule fois pour l'ensemble des conteneurs mais à chaque redémarrage du serveur).

Limite du mode macvlan : le conteneur pourra communiquer avec toutes les machines du réseau extérieur à l'exception du serveur LXD.

La solution la plus simple pour utiliser macvlan est la création d'un profil basé sur le profil par défaut, que l'on attribuera aux conteneurs devant accéder directement au réseau extérieur :

  • Création d'un profil nommé macvlan basé su le profil par défaut: lxc profile copy default macvlan
  • Edition du profil macvlan : lxc profile edit macvlan puis modifier les lignes :
    • nictype: macvlan
    • parent: enp0s3 (nom de la carte réseau du serveur LXD par lequel passeront les communications des conteneurs)
  • Vérification de la prise en compte de la modification : lxc profile show macvlan
  • Attribution du profil à un conteneur : lxc profile apply conteneur macvlan
  • Vérification de la prise en compte du profil pour le conteneur : lxc info conteneur

 Vous pouvez ensuite configurer la carte réseau de votre conteneur directement dans le conteneur.

Afin d'éviter que votre conteneur prenne une adresse IPv6 parasite, ajoutez la ligne net.ipv6.conf.all.disable_ipv6=1 dans le fichier /etc/sysctl.conf du conteneur.

 

Echange de données entre serveur et conteneurs

Transfert des fichiers
  • Du serveur LXD à un conteneur : lxc file push fichier conteneur/repertoire/
  • D'un conteneur au serveur LXD : lxc file pull conteneur/repertoire/fichier
Répertoire partagé

lxc config device add conteneur nom disk source=/rep1/ path=/rep2

  • source : répertoire du serveur LXD
  • path : répertoire du conteneur

 

Exportation et importation de conteneur

Les conteneurs peuvent s'exporter et s'importer sous forme d'image.

Création de l'image d'un conteneur
  • Création de l'image d'un conteneur avec l'alias nomimage : lxc publish conteneur --alias=nomimage
  • Exportation de l'image sous forme de fichier compressé : lxc image export nomimage

L'image est ainsi exportée dans un fichier compressé avec un nom très long, en hexadécimal, dans votre répertoire de travail.

Importation d'une image d'un conteneur et création du conteneur à partir de l'image
  • Importation de l'image sous le nom nomimage : lxc image import xxxxxx.tar.gz --alias=nomimage
  • Création du conteneur à partir de l'image : lxc init local:nomimage conteneur