IMA4 2016/2017 ECV1 : Différence entre versions
(Page créée avec « == Contenu == *Sujet de l'épreuve complémentaire. *Le rapport du travail est disponible dans la page suivi du travail. == Avancé du projet == {| ... ») |
(Aucune différence)
|
Version du 17 juin 2017 à 16:58
Sommaire
Contenu
- Sujet de l'épreuve complémentaire.
- Le rapport du travail est disponible dans la page suivi du travail.
Avancé du 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 |
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
- 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.
- 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é (optionnew
). - 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 (utilitairebrctl
) de l'OS principal. - 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
. - 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
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 paquetagecgroupfs-mount
doit être installé. - Le chemin
PATH
n'était pas défini dans le fichier de configuration du conteneurconfig.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
.
A approfondir :
- Faire en sorte que le conteneur soit lancé en tâche de fond.
- Comment agir sur un conteneur en tâche de fond.
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.
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.