Mettre en place du load balancing avec Caddy
Caddy est souvent utilisé comme reverse proxy HTTPS grâce à sa configuration simple et à la gestion automatique des certificats TLS.
Au delà de sa fonctionnalité de serveur web et Reverse Proxy, Caddy peut aussi faire du load balancing entre plusieurs backends.
Dans cet article, nous allons configurer Caddy pour répartir le trafic HTTP vers plusieurs serveurs web.
Objectif
Nous allons créer l’architecture suivante :
Client
|
v
caddy-lb.local
|
v
Caddy
|
+--> web-01
+--> web-02
+--> web-03Donc en interrogeant le nom local caddy-lb.local, il faut qu'un des 3 serveurs web redirige notre requête vers le serveur web Caddy.
Prérequis
Pour suivre cet article, il faut disposer de :
- Docker et Docker Compose
- Un accès
sudo - Un fichier
/etc/hostsmodifiable
Le projet
Voici les 2 fichiers qui composent notre projet :
.
├── Caddyfile
└── docker-compose.ymlLe fichier hosts
Commencez par éditer votre fichier /etc/hosts en ajoutant l'entrée suivante :
172.50.0.100 caddy-lb.localTestez la résolution DNS en exécutant la commande suivante :
ping caddy-lb.localRetour attendu :
$ ping caddy-lb.local
PING caddy-lb.local (172.50.0.100) 56(84) bytes of data.
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=2 ttl=64 time=0.136 ms
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=3 ttl=64 time=0.121 ms
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=4 ttl=64 time=0.090 msLe Docker Compose
Notre fichier docker-compose.yml va nous servir à :
- Déployer notre serveur web Caddy
- Déployer notre 3 backends qui font office de Load Balancers
- Un réseau Docker commun.
Créer le fichier comme suivant :
services:
caddy:
image: caddy:2
container_name: caddy-lb
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
networks:
caddy-net:
ipv4_address: 172.50.0.100
web-01:
image: traefik/whoami
container_name: web-01
restart: unless-stopped
hostname: web-01
networks:
caddy-net:
ipv4_address: 172.50.0.11
web-02:
image: traefik/whoami
container_name: web-02
restart: unless-stopped
hostname: web-02
networks:
caddy-net:
ipv4_address: 172.50.0.12
web-03:
image: traefik/whoami
container_name: web-03
restart: unless-stopped
hostname: web-03
networks:
caddy-net:
ipv4_address: 172.50.0.13
networks:
caddy-net:
driver: bridge
ipam:
config:
- subnet: 172.50.0.0/16
gateway: 172.50.0.1
volumes:
caddy_data:
caddy_config:L’image traefik/whoami est pratique pour les tests, car elle affiche le nom du conteneur qui répond.
Configurer Caddy
Créer le fichier :
http://caddy-lb.local {
reverse_proxy web-01:80 web-02:80 web-03:80
}Caddy va recevoir les requêtes sur caddy-lb.local, puis les répartir entre les trois conteneurs.
Le préfixe http:// est volontaire : comme caddy-lb.local est un domaine local, Let’s Encrypt ne pourra pas générer de certificat public.
Démarrer les conteneurs
Lancer la stack :
docker compose up -dVérifier l'état des conteneurs :
docker compose psRésultat attendu :
NAME IMAGE STATUS
caddy-lb caddy:2 Up
web-01 traefik/whoami Up
web-02 traefik/whoami Up
web-03 traefik/whoami UpTester le load balancing
Faire une première requête :
curl http://caddy-lb.localPuis lancer plusieurs requêtes :
for i in {1..10}; do curl -s http://caddy-lb.local | grep Hostname; doneExemple de résultat :
Hostname: web-01
Hostname: web-02
Hostname: web-03
Hostname: web-01
Hostname: web-02On voit ici que ce n'est pas systématiquement le même backend qui répond !
Choisir une stratégie de répartition
Par défaut, Caddy répartit les requêtes entre les backends disponibles. Vous pouvez forcer une stratégie avec lb_policy.
Exemple avec round_robin :
http://caddy-lb.local {
reverse_proxy web-01:80 web-02:80 web-03:80 {
lb_policy round_robin
}
}Et bien d'autres configurations possibles...
Conclusion
Nous avons déployé Caddy avec Docker Compose pour faire du load balancing entre plusieurs conteneurs web.
Cette configuration permet de :
- lancer rapidement un reverse proxy
- répartir le trafic entre plusieurs backends
- tester avec un domaine local
- ajouter des health checks
- passer facilement sur un vrai domaine avec HTTPS automatique.
etc...
Caddy est une solution simple, moderne et très pratique pour exposer plusieurs applications derrière un reverse proxy déployé via Docker.