Aller au contenu principal

Réseaux Swarm


Objectifs du chapitre

  • Comprendre les réseaux overlay
  • Configurer le routing mesh
  • Créer des réseaux personnalisés
  • Isoler les applications

1 - Types de réseaux dans Swarm

Vue d'ensemble

┌─────────────────────────────────────────────────────────────┐
│ Docker Swarm Networks │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐ │
│ │ Ingress │ │ Overlay │ │ docker_gwbridge│ │
│ │ (built-in) │ │ (user-def) │ │ (built-in) │ │
│ │ │ │ │ │ │ │
│ │ Load balancer │ │ Service-to- │ │ NAT pour les │ │
│ │ externe │ │ service comm │ │ conteneurs │ │
│ └───────────────┘ └───────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Réseaux par défaut

RéseauTypeUsage
ingressOverlayRouting mesh pour les ports publiés
docker_gwbridgeBridgeCommunication externe des conteneurs
# Voir les réseaux Swarm
docker network ls --filter scope=swarm

2 - Réseau Overlay

Concept

Un réseau overlay permet la communication entre conteneurs sur différents nœuds physiques.

         Node 1                            Node 2
┌──────────────────────┐ ┌──────────────────────┐
│ ┌──────────────┐ │ │ ┌──────────────┐ │
│ │ Container A │ │ │ │ Container B │ │
│ │ 10.0.0.2 │ │ │ │ 10.0.0.3 │ │
│ └──────┬───────┘ │ │ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌──────▼───────────┴──────────┴──────────▼───────┐ │
│ │ Overlay Network (10.0.0.0/24) │ │
│ │ VXLAN │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │ │ │ │
└──────────┼───────────┘ └──────────┼───────────┘
│ │
┌──────▼─────────────────────────────────▼──────┐
│ Physical Network │
└────────────────────────────────────────────────┘

Créer un réseau overlay

# Réseau overlay simple
docker network create --driver overlay my-overlay

# Avec configuration personnalisée
docker network create --driver overlay \
--subnet 10.10.0.0/16 \
--gateway 10.10.0.1 \
my-network

# Réseau attachable (pour les conteneurs standalone)
docker network create --driver overlay --attachable my-attachable

# Réseau chiffré
docker network create --driver overlay --opt encrypted my-secure

Utiliser un réseau overlay

# Créer un service sur le réseau
docker service create --name web \
--network my-overlay \
nginx

# Ajouter un réseau à un service existant
docker service update --network-add my-overlay web

# Retirer un réseau
docker service update --network-rm my-overlay web

3 - Routing Mesh

Concept

Le routing mesh permet d'accéder à un service publié depuis n'importe quel nœud du cluster, même si le conteneur ne s'y trouve pas.

                    Client Request (port 80)


┌─────────────────────────────────────────────────────────────┐
│ ANY NODE IN SWARM │
│ (même sans conteneur) │
└─────────────────────────┬───────────────────────────────────┘
│ Ingress Network

┌─────────────────────────────────────────────────────────────┐
│ Internal Load Balancer │
│ (Round Robin) │
└────────────┬────────────────┬────────────────┬──────────────┘
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ web.1 │ │ web.2 │ │ web.3 │
│ Node 1 │ │ Node 2 │ │ Node 3 │
└─────────┘ └─────────┘ └─────────┘

Publier un port

# Publication avec routing mesh (par défaut)
docker service create --name web -p 80:80 nginx

# Mode ingress explicite
docker service create --name web \
-p mode=ingress,published=80,target=80 \
nginx

Mode host (bypass routing mesh)

# Publier directement sur le nœud
docker service create --name web \
-p mode=host,published=80,target=80 \
--mode global \
nginx
ModeDescriptionCas d'usage
ingressRouting mesh (LB interne)Applications web standard
hostDirect sur le nœudPerformance, sticky sessions

4 - Service Discovery

DNS interne

Swarm fournit un DNS interne pour la résolution des services :

# Créer deux services sur le même réseau
docker network create --driver overlay backend

docker service create --name api \
--network backend \
--replicas 3 \
myapi:latest

docker service create --name db \
--network backend \
postgres:15

# Dans le conteneur api, vous pouvez résoudre :
# - db → IP du service db
# - api → VIP du service api
# - tasks.api → IPs de toutes les tâches api

Virtual IP (VIP) vs DNS Round Robin

# Mode VIP (par défaut)
# Une seule IP virtuelle, load balancing transparent
docker service create --name web --network my-overlay nginx

# Mode DNS Round Robin
# DNS retourne toutes les IPs, le client choisit
docker service create --name web \
--network my-overlay \
--endpoint-mode dnsrr \
nginx
ModeDescriptionCas d'usage
vipIP virtuelle uniqueApplications standard
dnsrrDNS Round RobinLoad balancers externes, gRPC

5 - Réseaux multi-services

Architecture micro-services

# Exemple avec isolation réseau
services:
# Frontend - accessible depuis l'extérieur
nginx:
networks:
- frontend
ports:
- "80:80"

# API - connecte frontend et backend
api:
networks:
- frontend
- backend

# Database - uniquement backend
db:
networks:
- backend

networks:
frontend:
driver: overlay
backend:
driver: overlay
internal: true # Pas d'accès externe
           Internet


┌──────────────────────────────────────────────────────┐
│ Frontend Network │
│ ┌─────────┐ ┌─────────┐ │
│ │ nginx │──────────────│ api │ │
│ └─────────┘ └────┬────┘ │
└────────────────────────────────┼─────────────────────┘

┌────────────────────────────────┼─────────────────────┐
│ Backend Network (internal) │
│ ┌───▼────┐ │
│ │ api │ │
│ └────┬───┘ │
│ │ │
│ ┌────▼───┐ │
│ │ db │ │
│ └────────┘ │
└──────────────────────────────────────────────────────┘

6 - Réseaux chiffrés

Activer le chiffrement

# Créer un réseau chiffré
docker network create --driver overlay \
--opt encrypted \
secure-network

# Le trafic entre nœuds est chiffré via IPsec

Quand utiliser le chiffrement

SituationChiffrement
Réseau de confiance (datacenter privé)Optionnel
Multi-cloudRecommandé
Données sensiblesObligatoire
Conformité (PCI-DSS, HIPAA)Obligatoire
Performance

Le chiffrement ajoute une latence (~10%). Testez avant d'activer en production.


7 - Configuration réseau avancée

Options de création

docker network create --driver overlay \
--subnet 10.20.0.0/16 \
--ip-range 10.20.10.0/24 \
--gateway 10.20.0.1 \
--opt com.docker.network.driver.mtu=1450 \
--opt encrypted \
my-network

Attacher des conteneurs standalone

# Créer un réseau attachable
docker network create --driver overlay --attachable debug-net

# Attacher un conteneur standalone
docker run -it --network debug-net alpine sh

Alias réseau

# Créer un service avec alias
docker service create --name db \
--network my-overlay \
--network-alias database \
--network-alias postgres \
postgres:15

# Les autres services peuvent utiliser :
# - db
# - database
# - postgres

8 - Dépannage réseau

Outils de diagnostic

# Conteneur de debug
docker run -it --network my-overlay nicolaka/netshoot

# Dans le conteneur
ping service-name
nslookup service-name
curl http://service-name:port
traceroute service-name

Vérifier la connectivité

# Tester depuis un service
docker service create --name debug \
--network my-overlay \
--mode global \
nicolaka/netshoot sleep infinity

# Exécuter des commandes
docker exec -it $(docker ps -q -f name=debug) ping api

Problèmes courants

ProblèmeCause probableSolution
Timeout réseauPorts firewall fermésOuvrir 4789/udp, 7946
DNS ne résout pasServices sur différents réseauxConnecter au même overlay
Pas de connectivitéMTU incorrectVérifier MTU (1450 pour VXLAN)

Vérifier les réseaux

# Inspecter un réseau
docker network inspect my-overlay

# Voir les conteneurs connectés
docker network inspect my-overlay --format '{{range .Containers}}{{.Name}} {{end}}'

# Voir les services sur un réseau
docker network inspect my-overlay --format '{{json .Services}}'

9 - Load Balancing externe

Avec un reverse proxy

# Traefik comme load balancer
version: "3.9"
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker.swarmMode=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik-public
deploy:
placement:
constraints:
- node.role == manager

web:
image: nginx
networks:
- traefik-public
deploy:
replicas: 3
labels:
- "traefik.enable=true"
- "traefik.http.routers.web.rule=Host(`example.com`)"

networks:
traefik-public:
driver: overlay

Résumé

ConceptDescription
OverlayRéseau multi-nœuds (VXLAN)
IngressRouting mesh pour les ports publiés
VIPIP virtuelle pour load balancing
DNSRRDNS Round Robin
EncryptedTrafic chiffré (IPsec)
Points clés
  • Les réseaux overlay permettent la communication inter-nœuds
  • Le routing mesh distribue le trafic automatiquement
  • Utilisez des réseaux séparés pour l'isolation
  • Activez le chiffrement pour les données sensibles

Exercices pratiques

  1. Créez un réseau overlay et déployez deux services qui communiquent
  2. Testez le routing mesh en accédant à un service depuis différents nœuds
  3. Configurez un réseau interne pour une base de données
  4. Debuggez la connectivité avec netshoot

← Services et Tasks | Stacks et déploiement →