virli/tutorial/1/lxc.md
2015-10-07 03:45:39 +02:00

4.9 KiB

\newpage

Utiliser LXC

Le but de cette première partie est d'appréhender la virtualisation légère au travers d'un programme, lxc, qui va mettre en place pour nous un environnement distinct.

Lancer un conteneur

Avec le paquet LXC que vous avez installé, vous avez également récupéré un certain nombre de modèles de système (souvent installés dans le dossier /usr/share/lxc/templates/).

La méthode la plus simple pour lancer un conteneur LXC est d'utiliser l'un de ces modèles qui va installer tout un environnement pour vous. On utilise pour cela la commande lxc-create :

lxc-create --name toto_first --template ubuntu

Ce modèle va créer un dossier dans /var/lib/lxc/ portant le nom que vous avez précisé. Ce dossier va contenir la configuration LXC du conteneur (config), la table des partitions (fstab) s'il y a besoin de faire des montages particuliers et enfin le dossier rootfs contenant le système en lui-même.

Une fois l'installation terminée, on peut démarrer le conteneur :

lxc-start --name toto_first

LXC va appeler /sbin/init et démarrer tous les services que l'on peut s'attendre à trouver dans n'importe quelle machine virtuelle plus classique (la seule différence réside donc dans le fait que le noyau est partagé avec l'hôte).

Généralement on lance lxc-start avec l'option --daemon, car on ne s'attend pas à ce que la machine s'arrête lorsque l'on va quitter notre terminal. Dans ce cas, utiliser la commande lxc-console pour vous attacher à votre conteneur. À tout moment, vous pouvez vous détacher de la console (sans que cela n'affecte l'état du conteneur) en pressant les touches : ^A q.

Connectez-vous, lancez quelques commandes puis éteignez la machine avec sudo poweroff dans le conteneur. Vous pouvez aussi lancer la commande lxc-stop --name toto_first dans un autre terminal, depuis la machine hôte.

Le réseau

Le modèle ubuntu que vous avez utilisé initialise un fichier de configuration sans paramètres pour le réseau. Vous n'avez donc pas d'interface dans le conteneur pour le connecter au réseau.

Un excellent article détaillant les différents types de réseau est accessible à https://blog.flameeyes.eu/2010/09/linux-containers-and-networking.

N'ayant qu'une seule interface physique sur la machine et n'ayant pas accès à la configuration des VLAN de la pièce, il ne nous reste que deux méthodes pour obtenir du réseau dans nos conteneurs : Virtual Ethernet ou MACVLAN. Malheureusement, ces deux méthodes nécessitent de mettre en place un pont Ethernet sur votre machine :

Installation du pont réseau

Bridge interface

Port forwarding

Virtual Ethernet

Virtual Ethernet est la configuration la plus simple. On met en place un pont sur la machine hôte, puis on crée une interface veth par conteneur que l'on veut lancer. On n'oubliera pas d'ajouter ces interfaces au pont.

Voici un extrait de configuration correspondant au paramétrage d'une interface eth0 pour un conteneur donné :

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0

Cette technique a pour inconvénient de laisser au noyau le soin de router les paquets selon leur adresse IP, ce qui peut être lent et coûteux étant donné que la carte est placé en mode de promiscuité.

MACVLAN

Ici, le noyau va orienter les paquets en fonction de leur adresse MAC de destination.

lxc.network.type = macvlan
lxc.network.macvlan.mode = bridge
lxc.network.flags = up
lxc.network.link = br0

Utilisation du conteneur

Redémarrage du conteneur

Installation de InFluxDB et Graphana

Test de l'installation

Rendu

Configuration du conteneur

En plus des modifications que vous avez effectuées durant le TP, modifiez la configuration du conteneur afin qu'il ne puisse pas utiliser plus que 256 MB de RAM et 512 MB de swap.

Limitez ensuite les capabilities(7) de ce conteneur afin qu'il s'exécute avec le strict minimum de droits, nécessaire au bon fonctionnement des programmes installés.

Rendez le fichier config de ce premier conteneur. N'hésitez pas à laisser des commentaires justifiant vos éventuels choix.

Questions

  1. Quel type de virtualisation réseau avez-vous utilisé ? pourquoi ?

  2. Quels sont les autres types de virtualisation réseau existants ? Expliquez en chacun une phrase leurs particularités.

  3. Dans quel langage InfluxDB a-t-il était écrit ? Quelle est la particularité des binaires générés par ce langage ?

  4. Quels sont les avantages et les inconvénients associés au linkage statique et au linkage dynamique ? (pas forcément que dans le cadre de la virtualisation légère).

  5. J'ai utilisé la méthode Virtual Ethernet pour relier mes conteneurs à Internet, via un PAT (br0). Quelle(s) règle(s) iptables devrais-je écrire sur mon hôte afin de permettre l'accès à InfluxDB depuis une autre machine ?