Cloud : IaaS + Docker Swarm, Config et Secret sur Swarm, stop au volumes as Config
đŻ Objectif : DĂ©couvrez dans cette page, comment utiliser les configs services et les secrets services dans Docker Swarm Mode.
Introduction
L'anti-pattern volume as config
Pour déployer sur l'orchestrateur Docker Swarm, il est possible d'utiliser la syntaxe compose en emportant quelques éléments supplémentaires: Compose file version 3 reference | Docker Documentation
L'anti-pattern parle ici d'utiliser les volumes comme espace de stockage embarquant un fichier de configuration. Cependant, il est fortement déconseillé d'utiliser cette méthode.
Pourquoi est-ce un anti-pattern ?
Prenons un cas d'usage simple utilisant le service Nginx nécessitant un fichier de configuration.
Notre Swarm possĂšde 3 nĆuds, un manager et deux worker. Lors du dĂ©ploiement, le service est lancĂ© sur un nĆud alĂ©atoire et crĂ©er son volume. c'est Ă partir d'ici, que l'on va pouvoir modifier le fichier de configuration Nginx depuis l'extĂ©rieur.

Cette solution fonctionne, cependant, si le service Nginx vient Ă tomber, il peux ĂȘtre recrĂ©er alĂ©atoire sur une autre nĆud. Il est donc fort probable de se retrouver dans la situation suivante.

Solution
Pour solutionner cette situation, Swarm Mode a apporté une nouvelle fonctionnalité dans la structure des fichiers compose. Le champ "config".
Pour cela, reprenons le cas d'usage Nginx.
Voici notre fichier de configuration "site.conf"
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /run/secrets/site.crt;
ssl_certificate_key /run/secrets/site.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
On utilise ensuite la syntaxe compose pour déployer notre service sur le Swarm.
networks:
public:
driver: overlay
configs:
nginx_config:
file: ./site.conf
services:
web:
image: nginx
networks:
- public
ports:
- "80:80"
configs:
- source: nginx_config
target: /etc/nginx/conf.d/site.conf
La configuration créée va ĂȘtre stocker dans le noeud manager, puis lors du lancement du service, montĂ©e dans le container.

Dans le cas ou le service tombe et qu'il est remontĂ© dans un autre nĆud, il va accĂ©der Ă nouveau Ă sa configuration.

Si c'est le nĆud Manager qui tombe, l'ensemble du cluster tombe.
Dans le cas ou le Swarm possÚde plusieurs Managers, la configuration est stockée sur chacun d'entre eux pour un maximum de résilience.

Nous avons omis un dĂ©tail ici cependant. Pour ĂȘtre accessible en HTTPS, Nginx Ă besoin de deux fichier que l'on peux voir dans "site.conf", le certificat : "site.crt" et la clĂ© de chiffrement : "site.key".
En situation réelle : utilisation des Secrets services
En situation rĂ©el, ces fichiers sont des donnĂ©es sensibles et nĂ©cessitent d'ĂȘtre traitĂ©s diffĂ©remment. Pour cela, nous allons utiliser les "Secrets configuration".
networks:
public:
driver: overlay
configs:
nginx_config:
file: ./site.conf
secrets:
cert_secret:
file: ./site.crt
key_secret:
file: ./site.key
services:
web:
image: nginx
networks:
- public
ports:
- "80:80"
configs:
- source: nginx_config
target: /etc/nginx/conf.d/site.conf
secrets:
- cert_secret
- key_secret
Ici on créer deux secrets correspondant au certificat ainsi qu'a la clés que nous indiquons ensuite dans le service comme on peux le faire avec les networks.

đ A savoir : par dĂ©faut, les fichiers sont montĂ©s dans le container dans "/run/secrets/<secret_name>
" pour les secrets et dans "/<config_name>
" pour les configs. Il est possible de spécifier l'emplacement grùce a la balise "target".