Nous allons voir dans cert article comment créer un cluster de machines Docker et les administrer à partir d'un seul point.
Prérequis
Pour mettre en place un cluster Docker Swarm il nous faut dans un premier temps une machine avec Docker Machine installé. Reportez-vous à l'article sur docker-machine pour cela.
Je suppose aussi que vous avez les connaissances de base sur docker.
Je vais créer un cluster swarm à partir de mon Pc Bureautique et avec 3 machines :
- un swarm master : machine docker qui va gérer le cluster
- deux noeuds docker
Dans un prochain article nous parlerons de la mise en place d'un réseau commun entre les noeuds mais pour le moment chaque noeud sera indépendant.
Mise en place
Création d'un token
Le token va servir pour l'identification des noeuds dans le cluster. On verra aussi plus tard qu'il est possible de mettre en place des services de découverte pour automatiser l'inclusion de noeuds comme consul.
Pour créer le token :
# docker run --rm swarm create
a179bae09b0b9596ea536ad782bec650
Création du master
On utilise docker-machine et le drivers openstack :
# docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8" --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-master --swarm-discovery token://a179bae09b0b9596ea536ad782bec650 sw-master
Création des noeuds
On utilise docker-machine et le drivers openstack :
# docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8" --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-discovery token://a179bae09b0b9596ea536ad782bec650 swarm-node-01
# docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8" --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-discovery token://a179bae09b0b9596ea536ad782bec650 swarm-node-02
On se retrouve donc maintenant avec un cluster de 3 machines docker :
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
sw-master - openstack Running tcp://167.114.227.195:2376 sw-master (master) v1.11.1
swarm-node-01 - openstack Running tcp://167.114.227.208:2376 sw-master v1.11.1
swarm-node-02 - openstack Running tcp://167.114.227.233:2376 sw-master v1.11.1
Utiliser le cluster
On charge l'environnement du swarm-master
$ eval "$(docker-machine env --swarm sw-master)"
Pour obtenir des infos sur notre cluster :
$ docker info
Containers: 4
Images: 3
Server Version: swarm/1.2.1
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
sw-master: 167.114.227.195:2376
└ ID: TBZN:6NS7:NBHU:7HUW:CYHE:YSSZ:K3JC:B6KY:UL6Z:2UQ6:Z6NO:LV46
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.012 GiB
└ Labels: executiondriver=, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), provider=openstack, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-05T05:46:03Z
└ ServerVersion: 1.11.1
swarm-node-01: 167.114.227.208:2376
└ ID: 4YPR:KMTL:XH73:WJ5F:I4KR:MSZT:EBMG:SXTB:VH2A:A6D7:ROEH:4R7H
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.012 GiB
└ Labels: executiondriver=, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), provider=openstack, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-05T05:46:33Z
└ ServerVersion: 1.11.1
swarm-node-02: 167.114.227.233:2376
└ ID: YI57:CCDH:3UFH:43OD:L5C4:QVNS:XSTM:N3AO:BW3O:JVYD:XHIO:YWRB
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.012 GiB
└ Labels: executiondriver=, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), provider=openstack, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-05T05:46:04Z
└ ServerVersion: 1.11.1
Kernel Version: 3.16.0-4-amd64
Operating System: linux
CPUs: 3
Total Memory: 6.037 GiB
Name: 66c588e676a8
On voit donc la liste de nos noeuds, et le cumul des ressources CPU et RAM.
On déploie un conteneur :
$ docker run --name web01 --hostname web01 -d nginx
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91ad350c93c7 nginx "nginx -g 'daemon off" 15 seconds ago Up 14 seconds 80/tcp, 443/tcp swarm-node-01/web01
Et un second :
$ docker run --name web02 --hostname web02 -d nginx
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b43c76410135 nginx "nginx -g 'daemon off" 3 seconds ago Up 2 seconds 80/tcp, 443/tcp swarm-node-02/web02
91ad350c93c7 nginx "nginx -g 'daemon off" 45 seconds ago Up 44 seconds 80/tcp, 443/tcp swarm-node-01/web01
Swarm va répartir les conteneurs sur les serveurs du cluster.
Ce n'est qu'un début, pour consolider notre infrastructure il faudrait mettre de la redondance sur le master, et mettre en place des systèmes de failover entre les machines.