Thibault Coupin
Des outils pour déployer facilement un cluster swarm sur des VM sont dispo sur mon github : https://github.com/tcoupin/swarm-playground
§id:sommaire§;
§id:intro§;
Docker et docker-compose contrôle un seul daemon/machine.
§fragmentPour avoir plus de ressources, 2 possibilités :
§pelement: style=background:rgba(255,255,255,1)§;
Nouvelles contraintes :
Contrôler un ensemble de machines en faisant abstraction des machines, elles forment un tout, le cluster.
* non abordé ici
Docker Engine peut aussi être géré en mode cluster par d’autres solutions :
Un peu de lecture : Blog Octo.com : Docker en production : la bataille sanglante des orchestrateurs de conteneurs
§id:nodes§;
Juste un porte-conteneur…
Le réseau et les volumes doivent être disponibles sur l’ensemble des noeuds pour que les containers aient le même comportement quelque soit la machine où ils se trouvent.
Réseau : l’overlay network, macvlan… (voir Les réseaux)§fragment
Volume : Infinit, GlusterFS, NFS, HPE 3par, NetApp…(voir Les volumes)§fragment
Chaque noeud peut être associé à des labels.
Utile pour faire des placements de service en fonction :
Voir Service/Placement
§id:service§;
Une couche d’abstraction par rapport au container.
Un service est la définition de l’état désiré :
Les tasks permettent la réalisation du service
Ce sont les containers sur les noeuds
docker service create --name web -p 80:80 emilevauge/whoami
Travail du leader :
En plus de ces étapes, l’état du cluster est mis à jour sur l’ensemble des managers.
--bind/--mount |
gestion des volumes |
-p/--publish |
gestion des ouvertures réseau |
--replicas |
nombre d’instances |
--reserve-cpu/--reserve-memory |
besoin en CPU/RAM |
--health-* |
configurer le health-check applicatif |
--update-*/--rollback-* |
gestion des phases de mise à jour du service |
§pelement:style=font-size:80%;§;
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
hs40g5qxj3wy ui replicated 2/2 dockersamples/visualizer:latest *:8080->8080/tcp
$ docker service ps ui
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ticx39oiptf3 ui.1 dockersamples/visualizer:latest nodeAZ1N1 Running Running 8 minutes ago
l7m1coye9jfy ui.2 dockersamples/visualizer:latest nodeAZ2N1 Running Running 38 seconds ago
2 modes de déploiement :
replicated
: autant d’instances que demandé (par défaut)global
: une instance par noeud répondant aux contraintes de placement
docker service update ...
Quoi ?§fragment:1§;
Comment ?§fragment:1§;
docker service rollback ...§fragment:2§;
En cas de soucis, on revient dans l’état précédent avec un rollback.§fragment:3§;
Il y a aussi des règles de rollback, comme pour l’update.§fragment:3§;
§id:placement§;
Permet de restreindre la liste des machines où peut être déployé le service.
docker service create --constraint 'node.labels.arch == ARM' ...§fragment
node.id | Node ID | node.id==2ivku8v2gvtg4 |
node.hostname | Node hostname | node.hostname!=node-2 |
node.role | Node role | node.role==manager |
node.labels | user defined node labels | node.labels.security==high |
engine.labels | Docker Engine’s labels | engine.labels.operatingsystem==ubuntu 14.04 |
§pelement:style=font-size:80%;§;
Permet d’influer sur la méthode de répartition utilisée.
Une seule stratégie disponible : spread §fragment:1§;
docker service create --placement-pref 'spread=node.labels.datacenter' \§fragment:1§;
--placement-pref 'spread=node.labels.rack' ...
Ex : Répartir 12 instances sur les différents datacenters et racks.
§pelement:width=70%§;
Source : Documentation Docker
§id:stack§;
Docker monoposte | Docker en swarm |
---|---|
Container | Service |
docker-compose | Stack |
De services seulement !§fragment
Une stack n’est pas l’équivalent d’un docker-compose.yml. §fragment
Une stack est un ensemble de service. §fragment
Bien précisé qu’une stack est un objet docker et pas un fichier.
docker stack deploy ...
Nécessite un fichier de définition de stack :
config
et secret
pour les déclarerdeploy
pour un service :
§id:volumes§;
Une interface entre la logique des volumes de docker et le backend utilisé.
Stockage physique : /var/lib/docker/volumes/NOM_VOLUME/_data
Méthode | Action |
create/remove | mkdir, rmdir |
mount/unmount | pas grand chose |
path | retourne /var/lib/docker/volumes/NOM_VOLUME/_data |
capabilities | indique un scope local |
§pelement:width=20%§;
§id:network§;
§pelement:width=40%§;
Source: www.kaitoy.xyz
--link
pour le bridge par défaut
§pelement:width=40%§;
§pelement:width=40%§;
Lorsqu’un service est connecté à un réseau, il bénéficie du service DNS.
SERVICE |
VIP du service (voir LB juste après) |
tasks.SERVICE |
liste de toutes les ips des tasks |
# dig httpd
;; ANSWER SECTION:
httpd. 600 IN A 10.0.1.6
# dig tasks.httpd
;; ANSWER SECTION:
tasks.httpd. 600 IN A 10.0.1.8
tasks.httpd. 600 IN A 10.0.1.10
tasks.httpd. 600 IN A 10.0.1.11
tasks.httpd. 600 IN A 10.0.1.12
tasks.httpd. 600 IN A 10.0.1.9
tasks.httpd. 600 IN A 10.0.1.7
§pelement:width=40%§;
Source : docker.com
§pelement:width=40%§;
Source : docs.docker.com
§icon:arrow-left§; Retour sommaire
§id:configsecret§;
Comme une config +
Pour les données sensibles : mot de passe, clé SSL, certificat…
docker config create NOM FILE
ou
echo "ma config" | docker config create NOM -
docker config ls
docker config rm NOM
De même pour les secrets…
docker service create --config NAME IMAGE
# Sera accessible à /NAME
docker service create --config src=NAME,target=/path/to/file IMAGE
# Sera accessible à /path/to/file
Par défault un secret est accessible dans /run/secrets/NAME
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config
target: /redis_config
uid: '103'
gid: '103'
mode: 0440
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
version: "3.1"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- my_secret
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
version: "3.1"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- source: my_secret
target: redis_secret
uid: '103'
gid: '103'
mode: 0440
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true