virli/tutorial/1/lxc.md

149 lines
4.9 KiB
Markdown
Raw Normal View History

2015-10-07 01:45:39 +00:00
\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 ?
1. Quels sont les autres types de virtualisation réseau existants ? Expliquez
en chacun une phrase leurs particularités.
1. Dans quel langage InfluxDB a-t-il était écrit ? Quelle est la particularité
des binaires générés par ce langage ?
1. 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).
1. 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 ?