cloud:2017:tp_swarm2

Docker machine est un script qui permet de générer des machines virtuelles et d'installer docker automatiquement. Il est capable d'utiliser plusieurs hyperviseurs comme virtutalbox ou openstack mais aussi les fournisseurs de cloud publiques : AWS, Azure … Vous avez une documentation plus spécifique sur openstack ici

Certaines requêtes de docker machine utilisent un port inhabituel qui est filtré sur le réseau wifi. Vous devez donc utiliser les machines de l'université et télécharger le script par la commande :

curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > docker-machine \
&& chmod +x ./docker-machine

La commande docker-machine est assez simple car elle signale la plupart des options qui lui manque. La commande de création est documentée ici, les options relatives à //openstack// là. Vous devez savoir que :

  1. le driver est openstack
  2. l'url d'authentification est https://cloud-info.univ-lyon1.fr:5000/v3/
  3. le nom d'utilisateur et le mot de passe sont ceux qui vous permettent de vous connecter (voir la remarque plus loin)
  4. le tenant est le projet openstack où créer les machines Il faut donner son identifiant avec l'option openstack-tenant-id t lui donner la valeur fd8c7337154b4c8ea246c1bca973f9f0
  5. le nom de l'image à utiliser est celui d'une VM par défaut (car docker-machine s'occupera des configurations) : Ubuntu 16.04.3 LTS Xenial
  6. Attention il faut bien spécifier les options de proxy via l'option engine-env qui permet de spécifier une variable d'environnement1). Cela permettra de configurer le docker installé pour l'utilisation du proxy de l'université et s'utilise de cette manière :
docker-machine ... --engine-env HTTP_PROXY="http://adresse_de_votre_proxy:port" ... NOMDELAMACHINE

docker-machine sauvegarde ses informations dans le répertoire ~/.docker/machine/. Si à un moment docker-machine rm … ne fonctionne pas car openstack n'a pas créé la machine correspondante, il suffit d'effacer le répertoire ~/.docker/machine/machines/NOMDELAMACHINE.pour que docker-machine oublie cette denière.

<hi #ff7f27>Protection de votre mot de passe</hi>: attention, vous vous connectez au serveur openstack avec votre login et mot de passe de l'université. Pour éviter de laisser votre mot de passe en clair dans la ligne de commande, n'utilisez pas l'option openstack-password. Vous devez stocker votre mot de passe dans la variable d'environnement OS_PASSWORD. Pour cela copier/coller la commande :

export OS_PASSWORD=$(python3 -c "import getpass; pa=getpass.getpass('Mot de passe : '); print (pa)")
  • QI.1) En utilisant docker-machine, créez 2 machines qui serviront de nœuds de travail pour swarm. Appelez-les VOTRENOM-master, VOTRENOM-slave.

Vous pouvez ensuite voir les nœuds gérés par docker-machine via la commande docker-machine ls, en supprimer une par docker-machine rm

Pour exécuter des commandes docker sur ces machines il y a 3 méthodes :

  1. Vous pouvez utiliser les variables d'environnement docker fixées par la commande docker-machine env NOMMACHINE. Dans note TP c'est impossible car le logiciel docker n'est pas installé sur les ordinateur de l'université.
  2. Vous pouvez vous connecter sur les machines via la commande docker-machine ssh NOMMACHINE
  3. Vous pouvez exécuter les commande à distance via la commande docker-machine ssh NOMMACHINE COMMANDE. Par exemple
docker-machine ssh NOMMACHINE sudo docker ps
  • QI.2) Initialiser un cluster swarm dont le manager est votre machine principale et le nœud de travail est la machine slave.

Vous avez vu lors du TP précédant que le cluster swarm pouvait facilement lancer des dockers basés sur des images publiques. Mais pour le moment vous ne pouvez pas le faire avec des images construites via un dockerfile. Pour éviter cette limite, il faut installer un dépôt docker privé dans lequel vous placerez et téléchargez les images que vous avez généré. Vous trouverez la documentation ici

Attention, les registry que vous pouvez facilement utiliser sont des registry locaux c'est à dire que leur adresse est localhost. En effet, pour autoriser un registry distant, il faut gérer des certificats d'authentification SSL ce qui est hors du cadre du cours. Vous allez donc créer un unique docker registry qui répond à l'adresse localhost:5000 sur plusieurs machines virtuelle. Cela n'est possible que grâce au cluster swarm qui va s'occuper pour vous de la redirection des paquets.

  • Dans le cluster swarm, créer un service registry qui partage le port 5000 avec toutes les machines du cluster.
  • Sur quel nœud ce dernier est-il instancié ?
  • testez sa réponse à l'adresse localhost sur les 2 machines virtuelles.

Vous pouvez construire une image personnelle, par exemple le docker/php via ce Dockerfile. Pour l'utiliser via un service swarm vous devez :

  • construire l'image normalement
  • la “tagguer” correctement comme expliqué ici (le nom du tag doit commencer par celui du registry c'est à dire localhost:5000/
  • l'envoyer dans le registry

Vous pouvez ensuite :

  • lancer un service swarm basé sur cette image avec 3 réplicats;
  • tester qu'il est bien instancié sur plusieurs machines différentes;
  • tester qu'il répond avec une répartition de charge.

Pour automatiser vos déploiement, il est plus pratique d'utiliser un fichier yaml pour décrire votre application. Comme pour le premier TP avec docker-compose, vous allez maintenant utiliser docker stack.

Vous devez supprimer votre précédent service avec docker service rm.

Ecrivez votre fichier yaml pour lancer votre image localhost:5000/VOTRETAG avec 2 replicas.

Lancez le stack avec la commande docker stack up -c votre fichier

Lors de la mise en place d'application, il y a de nombreuses données sensibles comme les certificats ou les mots de passe. Pour ne pas les mettre en clair dans vos fichiers, docker propose la fonction secret.

Maintenant, vous allez créer un secret avec la commande docker secret. Puis modifier votre fichier yaml afin de lui indiquer qu'il peut accéder à ce secret externe.

Quand vous avez fini vous pouvez modifier le fichier afin d'afficher votre secret :

echo “mon secret :” . file_get_contents(“/var/run/secrets/nom de votre secret”,“r”);

Ne pas oublier de rebuild votre image et de recréer votre stack.


1)
donnez une valeur pour HTTP_PROXY et HTTPS_PROXY
  • cloud/2017/tp_swarm2.txt
  • Dernière modification : 2018/03/13 09:19
  • de jean-patrick.gelas