IMA4 2016/2017 ECV1

De Wiki d'activités 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 create --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.

REX> Quel est le rapport entre mycontainer/newimage et le newbundle de la section suivante ?

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

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

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

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

debootstrap stretch newbundle/rootfs/

REX> Il reste à comparer les 250Mo de ce système de fichier avec un autre système de fichier racine d'une image docker de base.

[1]

On utilise docker pour créer des sytè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 fichier racine d'une image docker de base est donc plus petit qu'un fichier créé à partir de debootstrap stretch.

REX> Il faudrait quantifier "plus petit".

REX> Tous les paquetages Debian installé durant le debootstrap sont-ils utiles ? Etablir une liste des paquetages peut être inutiles.

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

> dpkg --get-selections

Lancement du conteneur

Pour lancer le conteneur en tâche de fond, je rajoute l'option -d lors du lancement. Sur le document que vous m'avez envoyé pour comprendre comment lancer un conteneur en tâche de fond, ils modifient l'état de "terminal" dans le fichier config.json pour le mettre à false. Est-ce que c'est nécessaire même avec l'option -d ?

REX> Oui, sinon même en tâche de fond, le conteneur va utiliser le terminal comme entrée et sortie.

Le lancement du conteneur et la vérification du bon lancement du conteneur se font par les commandes suivantes.

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


REX> Ce qui est indiqué ci-dessus est inexact. Sans l'option -d le lancement du conteneur reste en avant-plan.

REX> Décrivez un test complet permettant de lancer dans le même terminal plusieurs instances d'un conteneur. Précisez totalement les modifications apportées au fichier config.json. Comme tâche à effectuer dans le conteneur on peut imaginer une attente de quelques minutes.

Pour lancer dans le même terminal plusieurs instances d'un conteneur, il faut les rajouter dans le config.json plus précisément dans la partie args.

REX> Non, je parle de lancer plusieurs conteneurs, pas plusieurs processus dans le même conteneur.

POur lancer plusieurs conteneurs il suffit d executer les commandes suivantes (exemple 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 

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

REX> Oui, faites cet ajout dans le fichier de configuration (avec plutôt 5 minutes que 5 secondes) puis lancez plusieurs conteneurs en tâche de fond.

Pour que le conteneur affiche la liste des répertoires existants : on peut mettre dans args:["ls"].

REX> Oui, mais pour un conteneur en tâche de fond c'est inutile.

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
							

REX> Oui, c'est bien. Maintenant il faut mettre une adresse IP sur br0 et une adresse IP sur eth0. Ces deux adresses IP doivent être dans le même réseau IP. Faire un test pour "pinguer" l'adresse IP du br0 depuis le conteneur. Dans l'autre sens, faire une connexion ssh depuis panga sur le conteneur. Il faudra peut être modifier /etc/ssh/sshd_config comme dans le TP de virtualisation.

Pour mettre une adresse IP sur br0 et eth0, on modifie le fichier /etc/network/interfaces de la maniere suivante :

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
  bridge ports eth0
  address 172.26.79.105
  netmask 255.255.240.0
  gateway 172.26.79.254

auto eth0
iface br0 inet static
  address 172.26.79.105
  netmask 255.255.240.0
  gateway 172.26.79.254

On lance 6 conteneurs, puis on execute la commande suivant pour récuperer leur adresse ip (exemple mycontainerid)

runc exec mycontainerid ip a

on récupère l'adresse ip puis on peut pinguer le conteneur à partir de panga avec la commande

ping 127.0.0.1

Création des conteneurs de la maquette

REX> Créez 6 conteneurs avec des adresses IP distinctes dans le même réseau et un serveur Web fonctionnel. Créez 3 pages Web facilement identifiables que vous installerez sur les 3 paires de serveurs Web. Vérifiez 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é
Alimentation du Wiki En cours Sarah Zoubir nombreuses corrections de Xavier Redon
Création de l'image OCI d'un conteneur Toujours à préciser Sarah Zoubir
Création du système de fichier du conteneur A finaliser Aide de Xavier Redon
Lancement du conteneur en mode détaché Toujours à finaliser
Mise en réseau du conteneur A finaliser
Création des conteneurs de la maquette A réaliser