Introduction

Dans cet article, nous allons décrire comment installer des conteneurs LXC, qui rempliront le rôle de machines virtuelles sur un serveur dédié Dédibox (Online.net). Nous affecterons une IP FailOver par conteneur ce qui nous permettra d'isoler les services entre Lxc.

  • Lxc : Pour « LinuX Containers » ( aussi appelés « chroot on steroïds » ) sont une technique de compartimentation à base de chroot (pour isoler le système de fichier), et des cgroups (pour isoler processus, CPU et mémoire).
  • LVM, pour « Logical Volume Manager » permet d’agréger ses disques dur physiques en volumes logiques plus facilement manipulables et redimensionnables. C'est avec ça que nous allons créer les partitions spécifiques pour les chroot des conteneur Lxc.
  • Ip FailOver (IPFO) : Ce sont des IPs supplémentaires (payante chez Online) qui permette normalement d'être basculé rapidement d'un serveur à un autre. Cela sert principalement en cas de panne d'un serveur, l'ip failover pouvant ainsi être positionné sur un serveur de backup.

Dans cet article, nous n'allons pas nous servir de l'ip failover pour ça, mais plutôt pour permettre à un conteneur de posséder sa propre ip différente de l'ip de l'host. J'ai donc commandé une ip failover sur la console d'online (0.99€HT/ip) et je l'ai configurée pour qu'elle pointe sur le serveur où l'on va installer les conteneurs.

Configuration des LVM

Je ne vais pas rentrer dans les détails ici sur LVM, Je conseille toujours cette page du wiki d'Archlinux, qui est très bien documenté sur la question.

En plus de cela, j'ajoute un chiffrement des partitions avec Luks sur chaque volume logique. La aussi le wiki d'Archlinux contient des informations à ce sujet. https://wiki.archlinux.org/index.php/Encrypted_LVM

Vous l'avez compris, je fais un volume logique par conteneur. Pour le choix de la partition, c'est sans importance pour moi, j'ai choisi ext4.

Installation de Lxc

LXC utilise une technologie (les cgroups) apporté dans le noyau 2.6.26. Il vous faut donc au moins un noyau de version égale où supérieur.

La Dédibox en question est sur une Debian Wheezy (Stable, 7.1) avec un noyau 3.2. Ma version de lxc est 0.9.0~alpha3-2 mais globalement l'installation doit être semblable à partir de la version 0.8.0 (Présente dans les dépôts stables : 0.8.0~rc1-8+deb7u1).

Il faut maintenant tester votre système avec lxc-checkconfig. Vous devriez avoir une sortie du genre :

$ sudo lxc-checkconfig 
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.x.x-x
--- 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 clone_children flag: 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
 
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Assurer vous d'avoir tout à « enabled ».

Pour l'installation d'un Conteneur, sous Debian Stable, nous allons utiliser le script lxc-create. Le répertoire de création des rootfs des LXC sont dans /var/lib/lxc/<lxc_name>.

Je vous conseille de suivre la page suivante pour l'installation des Lxc : http://www.guiguishow.info/2012/10/30/utiliser-lxc-sur-un-kimsufi/ notamment la partie sur les patchs à appliquer si un bug est rencontré avec lxc-create disant que le dossier de destination du conteneur éxiste déjà.

Configuration du réseau

Plusieurs techniques sont possibles. Voir, pour compléter le sujet, un billet de mon collègue Albin, sur le blog linuxembedded, les différentes configurations réseaux proposées par LXC. http://www.linuxembedded.fr/2013/07/configuration-reseau-de-lxc/

Je ne vais pas faire un plagia de l'internet, et je vous envois sur une page qui m'a grandement aidé (je remercie d'ailleurs l'auteur) pour la configuration réseau. Le liens en question : http://www.delloye.org/linux/lxc.html.

J'ai choisi la première méthode décrite pour la configuration du réseau (2.4.3. Configuration du réseau, 2.4.3.1. Mode NATé).

Ne pas oublier d'ajouter la route de sortie par default dans le conteneur avec :

route add default gw 192.168.10.1

Avant les règles de MASQUERADE sur la page précédente, je dois autoriser le forward (car je le bloque par default) entre eth0 et br0 afin que les vm puissent contacter eth0.

        iptables -A FORWARD -i br0 -o eth0 -j ACCEPT
        iptables -A FORWARD -i eth0 -o br0 -j ACCEPT
        iptables -A FORWARD -i eth0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT

J'applique la même politique iptables pour les ip failover qu'expliqué sur le site précédent. A savoir, les paquets entrant avec l'ip failover correspondant à la vm A, sont redirigé vers la vm A (-j DNAT). Les paquets sortant de la VM A sont réécrit avec l'adresse source de l'ip FailOver (-j SNAT). Ainsi, la vm posséde sa propre visibilité sur internet et peut proposer ses propres services (ssh, web, mail) grâce à l'ip failover.

Ce qui donne deux règles comme ci dessous :

        # Paquet entrant - Lxc X - Failover <IP_Failover> - Changement de destination vers ip locale LXC
        iptables -t nat -A PREROUTING -d <IP_Failover> -j DNAT --to-destination <IP_locale_LXC>
 
        # Paquet sortant - Réecriture de l'adresse source.
        iptables -t nat -A POSTROUTING -s <IP_locale_LXC> -o eth0 -j SNAT --to-source <IP_Failover>

Il faut affecter un nom de domaine à l'adresse ip Failover. Pour cela rien de plus simple si vous posséder une zone DNS, vous ajoutez un sous-domaine (vm1.toto.tld) en enregistrement A qui pointe sur votre ip failover.

Et n'oubliez pas de configurer le reverse DNS pour l'ip failover (sur vm1.toto.tld), cela se passe dans la console de gestion Online au niveau de l'état du serveur.

Récapitulatif des liens