Archives par mot-clé : cluster

Un essaim de conteneurs piloté par une machine

Présentation des protagonistes

Docker : Est-il vraiment encore nécessaire de présenter Docker…? Docker est un moteur de containers gérant un catalogue d’images et des instances basées sur un système de fichier par couche.

Docker-machine : C’est un outil de déploiement de serveur docker. En lui fournissant les paramètres pour se connecter à un cloud provider, il est capable de démarrer un serveur qui intègrera docker. Docker-machine fournit ensuite une interface de management et connexion aux différents nœuds.

Swarm : C’est un orchestrateur de docker. Il se connecte à plusieurs serveurs docker pour les gérer de manière uniforme et répartir les containers à travers eux.

swarmDonc pour résumer la situation, nous avons un outil de déploiement (docker-machine) qui va nous permettre de déployer des serveurs chez un cloud provider (OVH) ou un orchestrateur (swarm) sera installé pour les contrôler en un seul point et déployer des containers (docker) dessus.

Ça me parait être un super programme !

Installation de docker-machine

Pour l’exemple, nous partirons d’un environnement Debian 8 en user root comme celui fournis sur un server cloud OVH.

On commence par installer docker. Comme seule la partie client nous intéresse ici, on le désactivera directement.

# apt-get update
# apt-get install unzip curl docker.io
# service docker stop
# echo manual | sudo tee /etc/init/docker.override
# curl -L https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip >machine.zip
# unzip machine.zip
# rm machine.zip 
# mv docker-machine* /usr/local/bin

That’s it !

Maintenant on va avoir besoin de charger dans l’environnement les variables habituelles nécessaire à la communication avec les API d’OpenStack, le fameux fichier openrc.sh. Vous devez avoir l’habitude, sinon rendez-vous ici.

Déploiement de Swarm

On va avoir besoin d’un token Swarm. Pour cela, on va simplement créer un nœud docker-machine, exécuter swarm et récupérer le token.

$ docker-machine create -d openstack \
--openstack-flavor-name="vps-ssd-1" \
--openstack-image-name="Ubuntu 14.04" \
--openstack-net-name="Ext-Net" \
--openstack-ssh-user="admin" \
swarm-token-generator

Notre premier déploiement grâce à docker-machine est fait, voici comment l’utiliser.

$ eval "$(docker-machine env swarm-token-generator)"

On est prêt pour lancer notre premier docker et par la même occasion récupérer le token.

$ docker run swarm create
1257e0f0bbb49dbdcd04b4c9beb2dab3

Noter bien cette chaine de caractère.

Notre serveur swarm-token-generator ne nous servira plus, vous pouvez le supprimer.

$ docker-machine rm --force swarm-token-generator

C’est parti pour le déploiement de swarm à proprement parlé. Commençons par le master.

$ docker-machine create -d openstack \
--openstack-flavor-name="vps-ssd-1" \
--openstack-image-name="Ubuntu 14.04" \
--openstack-net-name="Ext-Net" \
--openstack-ssh-user="admin" \
--swarm --swarm-master --swarm-discovery \
token://VOTRE_TOKEN docker-machine-swarm-master

Maintenant il ne reste plus qu’à déployer autant de nœud que nécessaire.

$ docker-machine create -d openstack \
--openstack-flavor-name="vps-ssd-1" \
--openstack-image-name="Ubuntu 14.04" \
--openstack-net-name="Ext-Net" \
--openstack-ssh-user="admin" \
--swarm --swarm-discovery \
token://VOTRE_TOKEN docker-machine-swarm-node01

Pour consulter la liste des nœuds déployés par docker-machine, vous pouvez utiliser « docker-machine ls ».

Docker jusqu’à plus soif

Avec notre cluster swarm, il est maintenant possible de gérer tous nos nœuds avec un seul point d’entré qui sera le swarm master. La répartition des containers sera faite par le master.

On va charger l’environnement et récupérer l’image docker ubuntu.

$ eval "$(docker-machine env --swarm docker-machine-swarm-master)"
$ docker pull ubuntu
docker-machine-swarm-node02: Pulling ubuntu:latest... : downloaded 
docker-machine-swarm-master: Pulling ubuntu:latest... : downloaded 
docker-machine-swarm-node01: Pulling ubuntu:latest... : downloade

Pour constater la bonne initialisation du cluster :

$ docker info
Containers: 4
Images: 6
Storage Driver:
  Role: primary
  Strategy: spread
  Filters: health, port, dependency, affinity, constraint
  Nodes: 3
 docker-machine-swarm-master: 158.69.94.60:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 2.004 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-44-generic, operatingsystem=Ubuntu 14.04.1 LTS, provider=openstack, storagedriver=aufs
 docker-machine-swarm-node01: 158.69.94.66:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 2.004 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-44-generic, operatingsystem=Ubuntu 14.04.1 LTS, provider=openstack, storagedriver=aufs
 docker-machine-swarm-node02: 158.69.94.68:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 2.004 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-44-generic, operatingsystem=Ubuntu 14.04.1 LTS, provider=openstack, storagedriver=aufs
Execution Driver:
Kernel Version:
Operating System:
CPUs: 3
Total Memory: 6.011 GiB
Name: 94d31dd697b1
ID:
Http Proxy:
Https Proxy:
No Proxy:

Il est temps de lancer des containers par dizaines.

$ for i in $(seq 1 200); do docker run -i -t -d ubuntu /bin/bash; done

Une fois terminé, je vous laisse faire un « docker ps » et apprécier.