Un des intérêts principaux de Docker et des conteneurs en général est de :
A partir d’une certaine échelle, il n’est plus question de gérer les serveurs et leurs conteneurs à la main.
Les nœuds d’un cluster sont les machines (serveurs physiques, machines virtuelles, etc.) qui font tourner vos applications (composées de conteneurs).
L’orchestration consiste à automatiser la création et la répartition des conteneurs à travers un cluster de serveurs. Cela peut permettre de :
Swarm est l'outil de clustering et d’orchestration natif de Docker (développé par Docker Inc.).
Il s’intègre très bien avec les autres commandes docker (on a même pas l’impression de faire du clustering).
Il permet de gérer de très grosses productions Docker.
Swarm utilise l’API standard du Docker Engine (sur le port 2376) et sa propre API de management Swarm (sur le port 2377).
Il a perdu un peu en popularité face à Kubernetes mais c’est très relatif (voir comparaison plus loin).
]
L’algorithme Raft : http://thesecretlivesofdata.com/raft/
Pas d'intelligent balancing dans Swarm
les services : la distribution d’un seul conteneur en plusieurs exemplaires
les stacks : la distribution (en plusieurs exemplaires) d’un ensemble de conteneurs (app multiconteneurs) décrits dans un fichier Docker Compose
version: "3"
services:
web:
image: username/repo
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
deploy
est lié à l’usage de Swarm
update_config
: pour pouvoir rollback si l’update failplacement
: pouvoir choisir le nœud sur lequel sera déployé le servicereplicas
: nombre d’exemplaires du conteneurresources
: contraintes d’utilisation de CPU ou de RAM sur le nœudswarm init
: Activer Swarm et devenir manager d’un cluster d’un seul nœud
swarm join
: Rejoindre un cluster Swarm en tant que nœud manager ou worker
service create
: Créer un service (= un conteneur en plusieurs exemplaires)
service inspect
: Infos sur un service
service ls
: Liste des services
service rm
: Supprimer un service
service scale
: Modifier le nombre de conteneurs qui fournissent un service
service ps
: Liste et état des conteneurs qui fournissent un service
service update
: Modifier la définition d’un service
docker stack deploy
: Déploie une stack (= fichier Docker compose) ou update une stack existante
docker stack ls
: Liste les stacks
docker stack ps
: Liste l’état du déploiement d’une stack
docker stack rm
: Supprimer une ou des stacks
docker stack services
: Liste les services qui composent une stack
docker node inspect
: Informations détaillées sur un nœud
docker node ls
: Liste les nœuds
docker node ps
: Liste les tâches en cours sur un nœud
docker node promote
: Transforme un nœud worker en manager
docker node demote
: Transforme un nœud manager en worker
Un load balancer : une sorte d'“aiguillage” de trafic réseau, typiquement HTTP(S) ou TCP.
Un aiguillage intelligent qui se renseigne sur plusieurs critères avant de choisir la direction.
Cas d’usage :
Haute disponibilité : on veut que notre service soit toujours disponible, même en cas de panne (partielle) ou de maintenance.
Donc on va dupliquer chaque partie de notre service et mettre les différentes instances derrière un load balancer.
Le load balancer va vérifier pour chaque backend s’il est disponible (healthcheck) avant de rediriger le trafic.
Répartition géographique : en fonction de la provenance des requêtes on va rediriger vers un datacenter adapté (+ ou - proche)
Loadbalancer intégré : Ingress
Permet de router automatiquement le trafic d’un service vers les nœuds qui l’hébergent et sont disponibles.
Pour héberger une production il suffit de rajouter un loadbalancer externe qui pointe vers un certain nombre de nœuds du cluster et le trafic sera routé automatiquement à partir de l’un des nœuds.
echo "This is a secret" | docker secret create my_secret_data
docker service create --name monservice --secret my_secret_data redis:alpine
=> monte le contenu secret dans /var/run/my_secret_data
Concrètement, docker-machine
permet de créer automatiquement des machines avec le Docker Engine et ssh configuré et de gérer les certificats TLS pour se connecter à l’API Docker des différents serveurs.
Il permet également de changer le contexte de la ligne de commande Docker pour basculer sur l’un ou l’autre serveur avec les variables d’environnement adéquates.
Il permet également de se connecter à une machine en ssh en une simple commande.
Exemple :
docker-machine create --driver digitalocean \
--digitalocean-ssh-key-fingerprint 41:d9:ad:ba:e0:32:73:58:4f:09:28:15:f2:1d:ae:5c \
--digitalocean-access-token "a94008870c9745febbb2bb84b01d16b6bf837b4e0ce9b516dbcaf4e7d5ff2d6" \
hote-digitalocean
Pour basculer eval $(docker env hote-digitalocean);
docker run -d nginx:latest
créé ensuite un conteneur sur le droplet digitalocean précédemment créé.
docker ps -a
affiche le conteneur en train de tourner à distance.
wget $(docker-machine ip hote-digitalocean)
va récupérer la page nginx.
Les pods Kubernetes servent à grouper des conteneurs en unités d’application (microservices ou non) fortement couplées (un peu comme les stacks Swarm)
Les services sont des groupes de pods exposés à l’extérieur
Les deployments sont une abstraction pour scaler ou mettre à jours des groupes de pods (un peu comme les tasks dans Swarm).
Une autre solution très à la mode depuis 4 ans. Un buzz word du DevOps en France :)
Une solution robuste, structurante et open source d’orchestration Docker.
Au cœur du consortium Cloud Native Computing Foundation très influent dans le monde de l’informatique.
Hébergeable de façon identique dans le cloud, on-premise ou en mixte.
Kubernetes a un flat network (un overlay de plus bas niveau que Swarm) : https://neuvector.com/network-security/kubernetes-networking/