IMA4 2016/2017 ECV1

De Wiki de Projets IMA

Cahier des charges

Cette section défini les modalités de l'épreuve complémentaire de virtualisation

Méthode

Le module étant principalement un TP de 20 heures, l'épreuve complémentaire repose donc sur la capacité de configurer un système sur une machine. Un PC portable a été fourni avec les paquetages nécessaires pour mener à bien le travail. Ce PC portable comporte également un Wiki permettant de faire rapport de l'avancée du travail.

Objectif

L'objectif est de réaliser un système de ferme de serveur Web accessible via un mandataire inverse réalisant de plus un équilibre de charge. Ce travail correspond à ce qui était demandé dans le premier tier du TP "virtualisation". Comme il est difficile de transformer un PC portable d'entrée de gamme en serveur de virtualisation, les serveurs Web seront implantés dans des conteneurs. Le mandataire inverse sera implanté dans l'OS du PC portable.

Étapes

  1. Il est d'abord demandé de mettre en oeuvre le WIki de type mediawiki sur le PC : recopier le sujet et préparer la structure pour rendre compte du travail, la sécurisation HTTPS n'est pas nécessaire vu que le wiki ne sera accédé qu'en local.
  2. La gestion des conteneurs se fera en utilisant la technologie runC. IL faut donc commencer par créer un système de fichier racine pour les conteneurs. L'utilitaire umoci sera utilisé (option new).
  3. Les conteneurs doivent être accessibles en réseau. Il faudra utiliser ip nets pour créer des interfaces virtuelles dans les conteneurs dont les pairs se trouveront dans un commutateur virtuel (utilitaire brctl) de l'OS principal.
  4. Il faudra explorer des solutions pour ajouter aux systèmes de fichier racines créés précédement le nécessaire pour faire tourner le serveur Web apache2.
  5. il ne reste plus qu'à configurer le serveur DNS local à l'OS principal pour donner un nom aux différents sites Web (partons sur 3 serveurs Web distincts redondés d'un facteur 2). Il est alors possible de configurer l'apache2 de l'OS principal pour agir comme mandataire inverse et équilibreur de charge.

Indications

Au cours du projet des indications supplémentaires ont été données à l'élève pour que le travail puisse avancer. Ces indications sont décrites ci-dessous.

Installation de mediawiki

Il faudra certainement modifier les droits sur la base de données. Pour cela, lancer les commandes suivantes en tant qu'administrateur :

# service mysql stop
# mysqld_safe --skip-grant-tables &
# mysql -u root
> GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY 'glopglop';
> FLUSH PRIVILEGES;
> QUIT ;
# fg
^C
# service mysql start

Création d'un système de fichiers

Les commandes umoci init et umoci new ne font que créer un conteneur avec un système de fichier vide. Il faut trouver une méthode pour obtenir un système de fichiers fonctionnel.

Une solution consiste à utiliser l'utilitaire debootstrap qui permet d'installer une distribution Debian à partir d'une distribution déjà installée. Les étapes sont les suivantes :

  • Installer le paquetage par apt-get install debootstrap (déjà effectué sur le PC portable).
  • Lancer l'utilitaire pour créer un système de fichier racine :
debootstrap stretch newbundle/rootfs/  http://debian.polytech-lille.fr/debian/ 

Cette solution fonctionne mais le système de fichier créé pèse 250Mo. Comparer par rapport à un autre système de fichier racine d'une image docker de base. Voir s'il est possible de réduire la taille de ce système de fichiers.

A noter :

  • La distribution Debian du PC ne comportait pas le paquetage systemd, dans ce cas le paquetage cgroupfs-mount doit être installé.
  • Le chemin PATH n'était pas défini dans le fichier de configuration du conteneur config.json, le shell ne pouvait donc pas être lancé au démarrage du conteneur.
  • Lors de la création de l'image, un fichier de configuration est fabriqué, ce n'est donc pas la peine d'en générer un autre par la commande runc spec. Par contre il faut préciser le chemin du répertoire de l'image au lancement du conteneur : runc create -b newbundle nomduconteneur.

Réseau pour le conteneur

Pour la configuration du réseau dans le conteneur. Il faut d'abord créer une interface virtuelle :

panga# ip link add vifc1 type veth peer name eth0@c1
panga# ip link set eth0@c1 netns /proc/<PID c1>/ns/net name eth0

Le PID du conteneur se trouve avec runc list.

Il reste ensuite à mettre vifc1 dans le bridge des conteneurs. Ne pas oublier de configurer une adresse IP sur le bridge pour que panga accède à ses conteneurs.

Compte-rendu du travail réalisé

Création de la structure du conteneur

Détailler les étapes de la création de l'image OCI avec la commande umoci.

root@Panga:~/mycontainer# umoci init --layout newimage
root@Panga:~/mycontainer# umoci new --image newimage:newtag

umoci init permet de créer une image OCI sans tag ou blobs à l'intérieur. Ensuite, unmoci new permet de créer une image OCI avec un tag que l'on pourra modifier comme on le souhaite par la suite.

On utilisant la commande suivante, on génère un dossier newbundle, qui contient le bon fichier config.json de l'image OCI de nom newimage.

root@Panga:~/mycontainer# umoci unpack --image newimage:newtag newbundle

Création du système de fichier racine pour les conteneurs

Dans mon répertoire mycontainer, je lance l'utilitaire debootstrap pour créer un système de fichier racine :

root@Panga:~/mycontainer# debootstrap stretch newbundle/rootfs/

Il a été demandé de comparer les 250Mo de ce système de fichiers avec un autre système de fichier racine d'une image docker de base.

On utilise docker pour créer des systèmes de fichiers racine de taille minimale. Docker n'a pas besoin de tous les packages dont a besoin debootstrap, ou du moins il les supprime après avoir fini avec. Un système de fichiers racine d'une image docker de base est donc plus petit qu'un fichier créé à partir de notre commande. Voir le script utilisé par docker : [1].

Note de l'encadrant : vous n'avez pas répondu à la question.

Il a été demandé si tous les paquetages Debian installés durant le debootstrap étaient utiles et d'établir une liste des paquetages inutiles.

Pour afficher les paquets installés, je lance dans mon conteneur la commande :

# dpkg --get-selections

Note de l'encadrant : vous n'avez pas répondu à la question même si la réponse précédente apporte des éléments.

Lancement du conteneur

Pour lancer le conteneur en tâche de fond, je rajoute l'option -d lors du lancement et je modifie l'état de "terminal" dans le fichier config.json pour le mettre à false.

root@Panga:~# runc start -d -b  newbundle/ mycontainerid

Pour lancer plusieurs conteneurs, il suffit d'exécuter les commandes suivantes (exemple pour 6 conteneurs) :

root@Panga:~# runc start -d -b newbundle/ mycontainerid1 
root@Panga:~# runc start -d -b newbundle/ mycontainerid2 
root@Panga:~# runc start -d -b newbundle/ mycontainerid3 
root@Panga:~# runc start -d -b newbundle/ mycontainerid4 
root@Panga:~# runc start -d -b newbundle/ mycontainerid5 
root@Panga:~# runc start -d -b newbundle/ mycontainerid6

Note de l'encadrant : sauf configuration particulière ce n'est pas vraiment conseillé de démarrer 6 conteneurs avec le même système de fichiers.

Pour une attente de quelques minutes par exemple, on peut rajouter dans config.json la directive args:["sleep","300"] le conteneur attendra donc 5 minutes.

Mise en réseau du conteneur

root@Panga:~# runc list
ID              PID         STATUS      BUNDLE                        CREATED
mycontainerid   3537        running     /root/mycontainer/newbundle   2017-04-06T07:03:09.150496187Z

Je récupère le PID de mon conteneur : 3537.

root@Panga:~# ip link add vifc1 type veth peer name eth0@c1
root@Panga:~# ip link set eth0@c1 netns /proc/3537/ns/net name eth0

Je crée mon bridge br0.

root@Panga:~# brctl addbr br0

J'ajoute vifc1 et eth0 dans le bridge.

root@Panga:~# brctl addif br0 eth0
root@Panga:~# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.5cb90180a7a6	no		eth0
							

Note de l'encadrant : il faut activer vifc1 et l'ajouter au commutateur virtuel.

Pour mettre une adresse IP sur br0, on modifie le fichier /etc/network/interfaces de la manière suivante :

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
  up ip link set dev eth0 up
auto br0
iface br0 inet static
  bridge ports eth0
  address 172.26.79.105
  netmask 255.255.240.0
  gateway 172.26.79.254

Note de l'encadrant : le fichier ci-dessus a été corrigé vous n'aviez pas tapé la bonne configuration pour l'interface Ethernet alors que sur le portable la configuration était correcte.

On lance 6 conteneurs, puis on exécute la commande suivante pour récuperer leur adresse IP.

runc exec mycontainerid ip a

On peut alors pinguer le conteneur à partir de panga avec la commande :

ping 127.0.0.1

Note de l'encadrant : vous avez écrit une grosse bétise, l'adresse IP 127.0.0.1 est l'adresse de bouclage de panga.

Pour ne pas frustrer les lecteurs, voici les commandes à exécuter pour réaliser la fin de la configuration réseau.

Pour configurer une adresse IPv4 sur l'interface eth0 d'un conteneur, il faut utiliser, par exemple, la commande

ip address add dev eth0 172.26.79.120/20

Pour des raisons de sécurité, la modification d'une interface réseau est interdite par défaut dans un conteneur lancé par runc. Taper la commande directement dans le conteneur va donc échouer. De même la commande lancée comme suit échouera :

 runc exec mycontainerid ip address add dev eth0 172.26.79.120/20

Il est facile de contourner ce blocage avec la commande nsenter :

 nsenter -t 3537 -n ip address add dev eth0 172.26.79.120/20
 nsenter -t 3537 -n ip route add default gw 172.26.79.254

Dans cet exemple 3537 est le PID du conteneur.

Création des conteneurs de la maquette

Il est demandé de créer 6 conteneurs avec des adresses IP distinctes dans le même réseau et un serveur Web fonctionnel. Il faut aussi créer 3 pages Web facilement identifiables à installer sur les 3 paires de serveurs Web. Enfin, il faut vérifier avec le navigateur du PC portable que les 6 pages Web sont accessibles.

Je n'ai malheureusement pas pu arriver jusqu'à cette étape car ces dernières semaines étaient remplies de partiels et de projets à rendre. J'ai fait du mieux quue je pouvais afin de pouvoir réussir cette épreuve. Je pars en stage à partir du 8 mai et ne peut donc pas continuer à travailler dessus. J'espère vous avoir convaincu.

Bilan du projet

Le tableau ci-dessous résume le travail effectué par l'élève sur le projet.

Tâche Etat Commentaire
Configuration et installation du Wiki Effectué Sarah Zoubir
Alimentation du Wiki Effectué Sarah Zoubir très nombreuses corrections de Xavier Redon (fautes d'orthographe et de formatage)
Création de l'image OCI d'un conteneur Finalisé Sarah Zoubir après plusieurs demandes
Création du système de fichier du conteneur Finalisé Aide massive de l'encadrant
Lancement du conteneur en mode détaché Finalisé Aide massive de l'encadrant
Mise en réseau du conteneur Non terminé Malgré de nombreuses indications de l'encadrant
Création des conteneurs de la maquette Non réalisé Pas suffisament de travail sur le projet pour arriver à cette étape