P23 Application de gestion de conteneurs pour sites Web
Présentation générale du projet
L'objectif du projet est de créer une application web de gestion de conteneurs pour l’hébergement de sites web de manière simple. Cette application pourra notamment permettre à l'utilisateur de choisir un nom de domaine, préciser certaines caractéristiques du conteneur hébergeant le site web, modifier le code source du site, ainsi que lancer ou détruire le conteneur.
Cahier des charges
L'application web sera hébergée sur une machine virtuelle linux qui regroupera tous les conteneurs. Cette machine virtuelle consommera une adresse IPv4 routée qui devra être partagée entre les conteneurs. Les sites web doivent être accessibles en IPv4 et IPv6 et communiquer en HTTP et HTTPS. Aussi les ressources processeur de la machine physique devront être gérées avec le mécanisme des cgroups. Il faut donc prévoir l'architecture réseau permettant la connexion des conteneurs, un ou plusieurs modèle(s) de conteneur capable d'héberger un site web, ainsi que l'architecture le l’application web. Les conteneurs seront donc sur un réseau privé (10.1.1.0/24) et connectés à la machine hôte grâce à un pont et des interfaces ethernet virtuelles. Le serveur de la machine hôte sera configuré en reverse proxy afin de rediriger les requêtes vers les conteneurs adéquats.
Tableau de bord
- L'architecture système / réseau doit pouvoir permettre de gérer plusieurs conteneurs à la fois tout en ne consommant qu'une adresse ip publique, il faut donc mettre en place une machine virtuelle avec une interface ethernet statique pouvant accueillir les conteneurs. Pour cela l'interface ethernet sera montée sur un bridge sur lequel les conteneurs seront eux-mêmes connecté grâce à une lan virtuelle. Il faudra aussi probablement faire du NAT / PAT (Network Address Translation / Port Address Translation) pour permettre aux conteneurs de communiquer avec l'extérieur. Un système de fichiers cgroup sera créer et monté sur la machine virtuelle afin de gérer les espaces de nommages des conteneurs pour assurer l'isolation de chacun ainsi que de contrôler les ressources utilisés.
- Modèle de l’application web :
- page connexion / authentification permettant aux personnes habilitées d'accéder au site
- base de donnée contenant la liste des personnes pouvant créer un site, et leur(s) site(s) web associé(s)
- page administrateur permettant de vérifier l'état de tous les conteneurs
- possibilité de relancer un conteneur stoppé ou de supprimer un conteneur
- page utilisateur permettant de créer, gérer ou supprimer un conteneur
- l'onglet de création permettra de créer et lancer un conteneur
- choix à proposer lors de la création : type de serveur(s), présence ou non d'une base de donné, nom de domaine, langage utilisé
- l'onglet de gestion permettra de lancé / stoppé un conteneur, modifier le code source d'un site ou supprimer un conteneur
Architecture Système Réseau
Préparation de l'hôte
- Pour commencer, la machine virtuelle servant d'hôte sera installée sur le serveur cordouan.
Cette dernière est installée avec xen grâce à la commande :
xen-create-image --hostname=ima5-pfe --dir=/usr/local/xen --ip=193.48.57.186 --netmask=255.255.255.240 --gateway=193.48.57.177
Il faut ensuite modifier le fichier /etc/xen/ima5-pfe.cfg pour mettre la machine en réseau :
vif = [ 'mac=00:16:3E:95:9E:ED ,bridge=IMA5sc ]
On peut lancer la machine avec :
xl create /etc/xen/ima5-pfe.cfg
Puis y accéder par console avec :
xl console ima5-pfe
- Les paquetages suivants ont été installés :
apt-get install apache2 nginx bind9 debootstrap unshare ssh
Malheureusement, nginx ne s'installe pas correctement et apache2 sera utilisé pour mettre en place le reverse proxy
- La configuration réseau est rendue automatique au boot dans /etc/network/interfaces :
# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 static address 193.48.57.186 netmask 255.255.255.240 gateway 193.48.57.177 # Bridge for container auto br0 iface br0 inet static address 10.1.1.254 netmask 255.255.255.0 bridge_ports none bridge_stp off bridge_fd 0 # iptables rules to connect br0 and eth0 post-up iptables -I FORWARD -i br0 -o eth0 -j ACCEPT post-up iptables -I FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Le pont servira de gateway aux conteneurs qui seront reliés à ce dernier avec des paires ethernet virtuelles. Aucun conteneur n'étant connecté au boot, bridge_ports none indique qu'aucune interface n'est montée sur le pont au lancement. Les règles d'iptables servent à faire le lien entre le pont et l'interface ethernet de l'hôte.
Mise en place du serveur de nom (DNS)
- J'ai commencé par reserver un nom de domaine sur gandi.net : plille.space
- Il m'a ensuite fallu configuré le serveur DNS avec bind9
- J'ai créé la zone dans /etc/bind/named.conf.local :
zone "plille.space" { type master; file "/etc/bind/db.plille.space"; allow-transfert {217.70.177.40; }; };
217.70.177.40 est l'adresse d'un DNS de gandi qui servira de DNS secondaire
- Il faut aussi editer /etc/bind/named.conf.options :
options { directory "/var/cache/bind"; dnssec-validation auto; auth-xdomain no; listen-on-v6 { any; }; };
- Enfin le fichier de zone /etc/bind/db.plille.space et créé avec touch et édité :
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.plille.space. root.plille.space. ( 2017110901 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ; Negative Cache TTL ; plille.space. IN NS ns1.plille.space. plille.space. IN NS ns6.gandi.net. NS1 IN A 193.48.57.186 NS6 IN A 217.70.177.40 @ IN A 193.48.57.186 www IN A 193.48.57.186
- Puis bind9 est redémaré :
service bind9 restart
- Pour finir la configuration, il faut modifier les onglets "Gérer les glues records" et "Modifier les serveurs DNS" sur gandi.net, respectivement :
Nom du serveur : ns1.plille.space IP : 193.48.57.186
et
DNS1 : ns1.plille.space DNS2 : ns6.gandi.net
Mise en place du Reverse Proxy
Conteneur à la main et tests
Automatisation
A faire
- Les conteneurs ont une adresse IPv4 non routé, le système hôte dispose d'une adresse IPv4 routée ;
- Au niveau du système principal installer un reverse proxy (apache2 ou nginx) pour accèder aux sites des conteneurs ;
- Réaliser des scripts (shell) pour créer un conteneur, pour lancer un conteneur, pour arrêter un conteneur, pour détruire un conteneur et pour sauvegarder un conteneur ;
- Créer un conteneur c'est : créer le système de fichier racine (debbootstrap), ajouter les paquetages nécessaires, modifier l'annuaire des conteneurs (adresse IPv4, port SFTP, nom de domaine, ...?), mettre à jour le reverse proxy, mettre à jour les redirections de port (sftp sur le conteneur) ;
- Lancer un conteneur c'est : lancer un processus avec unshare, créer la connexion réseau, configurer le réseau, lancer la BdD, lancer le serveur Web ;
- Arrêter un contenur c'est : arrêter proprement les processus (la BdD), arrêter le unshare, peut être supprimer la paire Ethernet virtuelle, supprimer la redirection de port ;
- Détruire un conteneur c'est modifier l'annuaire des conteneurs (supprimer une "ligne"), supprimer le système de fichier racine ;
- Gérer les cgroups dans tous les scripts, partir sur UN modèle, a terme proposer plusieurs modèles ;
- Test technique : utiliser un fichier du système principale comme partition pour un conteneur plutôt que d'utiliser un sous-répertoire, donc plutôt que répertoire + chroot, essayer -m (namespace montage SF) et monter le fichier comme système de fichier racine ;
- DNS dynamique pour une gestion facile des noms de domaine ;
- Application : pas de gestion des utilisateurs passer par le LDAP de l'école (ou un LDAP de test) ;
- Application : utiliser la bibliothèque bootstrap.