1. Introduction à la gestion dynamique
Traditionnellement, modifier la structure des backends nécessitait un reload du fichier de configuration. La Runtime API permet désormais d'effectuer ces changements en mémoire.Attention : L'ajout et la suppression dynamique de backends et serveurs via la Runtime API nécessite HAProxy 2.8 ou une version supérieure.
Configuration de base
Pour utiliser ces commandes, votre instance HAProxy doit exposer une socket d'administration avec un niveau admin :
global
stats socket /run/haproxy/admin.sock user haproxy group haproxy mode 660 level admin
2. Lexique des commandes clés
Pour manipuler l'infrastructure à chaud, il est essentiel de comprendre le rôle de chaque verbe de la Runtime API.
add (backend / server)
La commande add permet de créer un nouvel objet (backend ou serveur) en mémoire. Un backend peut être créé ex nihilo ou en héritant des paramètres d'une section defaults existante (indispensable pour les timeouts).
enable (server / health)
Par défaut, un serveur ajouté dynamiquement est en mode maintenance (maint). enable server le rend opérationnel. enable health active spécifiquement les tests de santé (health checks) pour ce serveur.
publish (backend)
C'est une étape de validation. Tant qu'un backend n'est pas publié, il est invisible pour les frontends, même s'il existe en mémoire. Cela permet de configurer entièrement un pool avant de l'exposer au trafic.
map (add / show / del)
Les Maps sont des tables de correspondance (ex: URL -> Backend) stockées en mémoire. add map ajoute une règle de routage, del map la supprime, et show map permet de déboguer le contenu de la table sans recharger HAProxy.
3. Ajouter un backend et un serveur
Voici le workflow pour créer un nouveau pool de serveurs et le rendre disponible.
Création et activation
Le processus se décompose en 4 étapes clés : l'ajout du backend, l'ajout du serveur, l'activation de la santé et la publication.
# 1. Ajouter le backend en héritant d'une section defaults
echo "add backend test-backend from mydefaults mode http" | socat stdio unix-connect:/run/haproxy/admin.sock
# 2. Ajouter un serveur au backend
echo "add server test-backend/server1 127.0.0.1:3000 check" | socat stdio unix-connect:/run/haproxy/admin.sock
# 3. Activer le serveur et ses health checks
echo "enable server test-backend/server1" | socat stdio unix-connect:/run/haproxy/admin.sock
echo "enable health test-backend/server1" | socat stdio unix-connect:/run/haproxy/admin.sock
# 4. Publier le backend pour le rendre utilisable par les frontends
echo "publish backend test-backend" | socat stdio unix-connect:/run/haproxy/admin.sock
Routage dynamique via Map files
Pour diriger du trafic vers ce nouveau backend sans modifier le frontend, utilisez les fichiers de mapping en mémoire :
# Associer le chemin /test au nouveau backend
echo "add map virt@paths.map /test test-backend" | socat stdio unix-connect:/run/haproxy/admin.sock4. Supprimer un backend proprement
La suppression nécessite de respecter un ordre précis pour ne pas rompre les connexions en cours.
Procédure de retrait
Il est impératif de passer le serveur en maintenance et d'attendre qu'il soit 'removable' avant la suppression physique.
# 1. Passer le serveur en maintenance
echo "set server test-backend/server1 state maint" | socat stdio unix-connect:/run/haproxy/admin.sock
# 2. Attendre et supprimer le serveur
echo "wait 2s srv-removable test-backend/server1; del server test-backend/server1" | socat stdio unix-connect:/run/haproxy/admin.sock
# 3. Dé-publier et supprimer le backend
echo "unpublish backend test-backend" | socat stdio unix-connect:/run/haproxy/admin.sock
echo "wait 2s be-removable test-backend; del backend test-backend" | socat stdio unix-connect:/run/haproxy/admin.sock
5. Points d'attention importants
Quelques règles de comportement du moteur HAProxy à connaître.
Publication et Force Switch
Un backend référencé par un use_backend sera ignoré s'il n'est pas publié. Pour forcer l'utilisation même s'il est 'unpublished', utilisez la directive force-be-switch.
Gestion de la mémoire
Pour permettre l'ajout dynamique, HAProxy conserve les sections defaults en mémoire. Si vous n'utilisez pas de backends dynamiques, vous pouvez libérer cette mémoire avec la directive globale suivante :
global
tune.defaults.purge on
Conclusion
Vers une automatisation totale
Cette approche est idéale pour coupler HAProxy à des outils comme Consul ou des contrôleurs personnalisés, permettant de scaler votre infrastructure sans jamais générer de micro-coupures liées aux rechargements de processus.