149 lines
4.9 KiB
Markdown
149 lines
4.9 KiB
Markdown
|
\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 ?
|