Virtualisation avec LXC

Clones dans Matrix

Exploitez les clones !

L'utilisation de machines virtuelles est devenu un impératif dans le cadre du développement agile de site Web.
Elle permet de monter des plateformes dédiées à un projet ou un test pour valider des choix technologiques, des orientations de design, faire du testing A/B, et ceux-ci rapidement, sans empiler des machines physiques et à coût quasi-nul.
Avec une bonne virtualisation, le cycle de vie du service est couvert de sa conception à son exploitation.

Si vous ne souhaitez ni supporter les mauvaises performances I/O des systèmes de virtualisations complets comme VMWare, Xen ou KVM, ni utiliser un noyau spécifique, LXC est la solution de virtualisation du moment.

Cet article vous présente comment créer une machine virtuelle LXC - LinuX Container - sur une plateforme Linux Ubuntu ou Debian like.

Présentation de LXC

LXC est une solution de virtualisation par container au niveau noyau.
Un container est une zone isolée dans le système qui a son propre système de fichiers, réseaux, processus, CPU, mémoire. Les containers LXC sont créé avec les fonctionnalités Control Group and Namespace inclues dans le noyau Linux depuis la version 2.6.26.

LXC fonctionne comme OpenVZ.
L'équipe d'OpenVZ est à l'origine d'une évolution du kernel visant à simplifier la prise en charge des containers par le kernel.
Malheureusement pour OpenVZ, ce système de virtualisation nécessite encore un noyau spécifique et souffre d'une prise en charge réseau limitée (IPSec, IPv6...).

LXC prend ici l'avantage sur OpenVZ :

  • LXC utilise un noyau standard ,
  • LXC gère très simplement le réseau
  • LXC est iso-performance avec le système host, soit bien plus rapide que VMWare, XEN, KVM et autres solutions de virtualisation complètes.

LXC peut donc être utilisé sur un portable XWindows sans avoir à recompiler les drivers d'écran à cause du noyau patché OpenVZ et garantit de disposer du dernier noyau officiel plutôt de d'attendre la version patché par l'équipe OpenVZ.

Les limites actuelles de LXC sont que :

  • l'équipe n'est pas très dynamique actuellement, la mode étant encore aux coûteux systèmes de virtualisation complet comme VMWare, Xen, KVM.
  • la gestion des quota n'est pas encore intégrée. A vous de jouer avec LVM et la priorisation des CPUs pour compenser.
  • impossible de modifier l'emplacement de certains répertoires

LXC est sous licence GPL2 et sponsorisé par IBM. Son développement s'accélère et devrez rapidement arriver à maturité.

Si vous ne supportez ni les mauvaises performances I/O des systèmes de virtualisations complets comme VMWare, Xen ou KVM, ni les noyaux spécifiques, LXC est la solution de virtualisation qu'il vous faut.

Installation de LXC

L'installation est fait sous Ubuntu 12.04. Adaptez les commandes à votre distribution.

# aptitude install lxc bridge-utils debootstrap

Ajoutez le montage cgroups en ajoutant les lignes suivantes à la fin du fichier /etc/fstab :

cgroup        /sys/fs/cgroup        cgroup        defaults    0    0

Montez et vérifiez la configuration de l'environnement :

# mount -a
# lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.38-11-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Créer un quota disque pour LXC

La mise en place de quota n'est pas indispensable sur un environnement de test mais doit être adressé pour les environnements d'exploitation.

LVM permet de créer des disques logiques qui serviront de quota à vos machines. Pour créer un disque logique nommé lv_lxc de 20Go dans le volume group vg, exécutez les commandes :

# lvcreate -L20G -n lv_lxc vg
# mkfs.ext4 /dev/vg/lv_lxc
# mount /dev/vg/lv_lxc /var/lib/lxc

Si vous voulez monter automatiquement ce disque au démarrage de votre serveur, modifiez le fichier /etc/fstab en conséquence.

La taille des containers LXC est réduite. En effet, le container réutilise le noyau de l'hôte et n'installe donc pas une image Linux complète. Une partition de 20Go peut accueillir sans problème plusieurs dizaines de serveurs.

Créer une machine virtuelle LXC

Les scripts de création de template sont les suivants :

$ ls /usr/lib/lxc/templates
lxc-busybox  lxc-fedora    lxc-sshd    lxc-ubuntu-cloud lxc-debian   lxc-opensuse  lxc-ubuntu

Les configurations réseaux disponibles sont :

$ ls /usr/share/doc/lxc/examples/
lxc-complex.conf      lxc-macvlan.conf   lxc-phys.conf  lxc-veth-nomac.conf  
lxc-empty-netns.conf  lxc-no-netns.conf  lxc-veth.conf  lxc-vlan.conf

Pour créer une machine virtuelle LXC avec la distribution Debian nommé www1 :

# lxc-create -t debian -n www1

Votre machine est crée, en 4 secondes sur mon portable SSD... Encore plus rapide qu'OpenVZ. Sa taille est de :

# du -hs /var/lib/lxc/www1
241M    /var/lib/lxc/www1

soit 84 serveurs Debian vierge sur une partition de 20Go.

Pour information, il est tout à fait possible d'installer un seul programme dans le container, comme sshd. La taille de ce serveur virtuel SSH est alors de seulement 130Ko... Imbattable !

Dans l'exemple précédant, j'ai opté la configuration réseau par défaut, veth. Dans les versions précédentes la 0.7 de lxc, je vous recommende d'utiliser la configuration réseau macvlan.

Si vous souhaitez modifier la configuration réseau, éditez le fichier /var/lib/lxc/www1/config et modifiez les lignes concernées :

lxc.network.type = macvlan
lxc.network.flags = up
lxc.network.link = eth0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.network.ipv4 = 1.2.3.4/24
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596

Si vous mettez en commentaire la ligne lxc.network.ipv4, le serveur DHCP sera utilisé pour récupérer une IP v4. Pratique pour une plateforme de test.

Lancer une machine virtuelle LXC

Listez les machines LXC disponibles :

$ lxc-ls
debian1  debian2  www1  lost+found  vm1
debian1 

Les machines virtuelles disponibles sont listées disponibles, suivi de la liste des machines démarrées. Dans l'exemple, la machine debian1 est démarrée.

Démarrez la machine virtuelle nommé www1 :

# lxc-start -n www1 -d

Si vous omettez l'option -d, votre console est capturée par la machine qui démarre.

Vérifiez l'état de votre machine LXC :

# lxc-info -n www1
'www1' is RUNNING

La machine virtuelle est up.

Connectez-vous à cette machine. Par défaut le mot de passe est root :

# lxc-console -n www1
Type <Ctrl+a q> to exit the console

Debian GNU/Linux 6.0 debian2 tty1

www1 login: root
Password: 
Last login: Thu Aug 25 15:24:37 UTC 2011 on console
Linux debian2 2.6.38-11-generic #48-Ubuntu SMP Fri Jul 29 19:02:55 UTC 2011 x86_64

root@www1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
rootfs                 20G  1.5G   18G   8% /
root@debian2:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:ff:12:34:56:79  
          inet addr:10.40.216.187  Bcast:10.40.219.255  Mask:255.255.252.0
          inet6 addr: fe80::2ff:12ff:fe34:5679/64 Scope:Link

Vous êtes dans votre machine virtuelle qui dispose de son adresse réseau IPv4 et IPv6.
Pour vous déconnectez, tapez Ctrl+a q

Arrêtez la machine virtuelle :

# lxc-stop -n www1

Si vous êtes connecté à la machine, vous pouvez lancer un poweroff pour lancer la procédure d'arrêt Linux.

Pour démarrer automatiquement la machine virtuelle www1 au lancement du serveur hôte, liez le fichier /var/lib/lxc/www1/config dans le répertoire /etc/lxc/auto comme suit :

# ln -s /var/lib/lxc/www1/config /etc/lxc/auto/www1

Voilà!

Commentaires

Merci pour ce super article d'introduction à la virtualisation avec LXC ! Je m'interroge quand même sur votre remarque concernant la possibilité de n'installer qu'un seul programme dans le container (sshd dans votre exemple). Pour moi, la virtualisation par containers permet l'isolation d'applications/services. Quel serait ici l'intérêt d'un accès ssh ? (étant donné que l'accès ssh donnerait accès seulement au container).

Je suis intéressé par votre point de vue à ce sujet et également la méthode pour réaliser cela (lxc-execute je crois ?).

LXC peut être vu comme un super chroot.
Un ou des services sont isolés les uns des autres afin d'éviter simplement les effets de bords, de bénéficier de services avec différentes configuration, de minimiser les impacts en cas d'attaque d'un service...

Vous pouvez donc virtualiser une machine Linux complète et autonome, l'approche traditionnelle ; ce qui permettra probablement dans les versions futures de LXC de gérer la scabilité au travers le cloud computing, la haute disponibilité via la redondance de service...

Vous pouvez également ne virtualiser qu'un service : un serveur ssh, un serveur DNS, un proxy-web... Ces services ou processus tournent alors dans des environnements isolés. La sécurité est améliorée en cas d'attaque et la consommation des ressources physiques est réduite.
Ces services dit isolés peuvent bien sûr communiquer entre eux et avec l'extérieur en fonction de votre configuration réseau. Configuration que vous allez spécifier en paramètre de la commande lxc-execute