Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Pod Networking — Communication réseau entre Pods

17 min de lecture

Kubernetes définit un modèle réseau où chaque Pod possède sa propre IP et peut joindre les autres Pods du cluster directement, sans avoir à publier de ports comme avec Docker. L’implémentation concrète dépend du plugin CNI, mais le modèle garantit une communication transparente entre Pods. Contrairement à Docker où les conteneurs partagent l’IP de l’hôte et utilisent le port mapping, Kubernetes crée un réseau “plat” où chaque Pod est un citoyen de première classe.

Ce guide couvre le domaine Services & Networking (20%) de la certification CKA.

  • Le modèle réseau Kubernetes et ses garanties
  • Comment un Pod obtient son adresse IP
  • La communication Pod-to-Pod sur le même nœud et entre nœuds
  • Le rôle du CNI et du kube-proxy
  • Les commandes de diagnostic réseau

Kubernetes doit résoudre 4 types de communication :

TypeDescriptionSolution
Container-to-ContainerConteneurs dans le même Podlocalhost (127.0.0.1)
Pod-to-PodPods dans le clusterRéseau Pod (ce guide)
Pod-to-ServicePod vers un Servicekube-proxy + DNS
External-to-ServiceTrafic externe vers le clusterIngress, LoadBalancer

Kubernetes impose trois règles fondamentales :

  1. Chaque Pod reçoit sa propre adresse IP
  2. Les Pods peuvent communiquer entre eux sans port mapping, quel que soit le nœud — l’IP vue par le Pod source correspond à l’IP réelle du Pod destination
  3. L’IP vue par un Pod est la même que celle vue par les autres Pods (pas de SNAT entre Pods)
┌─────────────────────────────────────────────────────────────────────────┐
│ Cluster Kubernetes │
│ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Node 1 │ │ Node 2 │ │
│ │ IP: 192.168.1.10 │ │ IP: 192.168.1.11 │ │
│ │ │ │ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Pod A │ │ Pod B │ │ │ │ Pod C │ │ Pod D │ │ │
│ │ │10.244. │ │10.244. │ │ │ │10.244. │ │10.244. │ │ │
│ │ │ 1.5 │ │ 1.12 │ │ │ │ 2.7 │ │ 2.19 │ │ │
│ │ └────┬────┘ └────┬────┘ │ │ └────┬────┘ └────┬────┘ │ │
│ │ │ │ │ │ │ │ │ │
│ │ └─────┬─────┘ │ │ └─────┬─────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌──────┴──────┐ │ │ ┌──────┴──────┐ │ │
│ │ │ CNI bridge │ │ │ │ CNI bridge │ │ │
│ │ │ ou fabric │ │ │ │ ou fabric │ │ │
│ │ └──────┬──────┘ │ │ └──────┬──────┘ │ │
│ │ │ │ │ │ │ │
│ └─────────────┼──────────────┘ └─────────────┼──────────────┘ │
│ │ │ │
│ └──────────────┬───────────────────┘ │
│ │ │
│ ┌──────────┴──────────┐ │
│ │ Réseau physique │ │
│ │ ou overlay │ │
│ └─────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────┘

Le cluster définit une plage d’adresses IP réservée aux Pods via le Pod CIDR :

Fenêtre de terminal
# Voir le CIDR du cluster (méthode kubeadm)
kubectl cluster-info dump | grep -m 1 cluster-cidr

Configuration typique :

ParamètreValeur exempleDescription
--cluster-cidr10.244.0.0/16Plage totale pour les Pods
--node-cidr-mask-size/24Taille du sous-réseau par nœud

Chaque nœud reçoit un sous-réseau du CIDR cluster :

Fenêtre de terminal
# Voir le CIDR alloué à chaque nœud
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
master1 10.244.0.0/24
worker1 10.244.1.0/24
worker2 10.244.2.0/24

Le plugin CNI est responsable de l’allocation IP via son composant IPAM :

Pod créé
kubelet appelle le runtime (CRI)
Runtime crée le namespace réseau
Runtime appelle le plugin CNI
CNI IPAM alloue une IP du CIDR du nœud
CNI configure l'interface veth + routes
Pod prêt avec son IP
Fenêtre de terminal
# IP dans la description
kubectl get pod <name> -o wide
# IP via jsonpath
kubectl get pod <name> -o jsonpath='{.status.podIP}'
# IPs de tous les Pods
kubectl get pods -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,IP:.status.podIP

Quand deux Pods sont sur le même nœud, ils communiquent via un bridge virtuel :

┌─────────────────────────────────────────────────┐
│ Node │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Pod A │ │ Pod B │ │
│ │ 10.244. │ │ 10.244. │ │
│ │ 1.5 │ │ 1.12 │ │
│ └────┬─────┘ └────┬─────┘ │
│ │ veth │ veth │
│ │ │ │
│ └───────────┬─────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ CNI bridge │ (interface gérée │
│ │ ou fabric │ par le plugin) │
│ └─────────────┘ │
│ │
└──────────────────────────────────────────────────┘

Le paquet reste local au nœud — aucun trafic ne sort sur le réseau physique.

Quand les Pods sont sur des nœuds différents, le trafic doit traverser le réseau :

Le CNI encapsule le paquet Pod dans un paquet UDP :

┌─────────────────────────────────────────────────────────────────┐
│ Paquet original │
│ Src: 10.244.1.5 (Pod A) → Dst: 10.244.2.7 (Pod C) │
└─────────────────────────────────────────────────────────────────┘
▼ Encapsulation VXLAN
┌─────────────────────────────────────────────────────────────────┐
│ Outer IP: Src 192.168.1.10 → Dst 192.168.1.11 │
│ UDP Port 4789 (VXLAN) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Inner: Src 10.244.1.5 → Dst 10.244.2.7 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

Utilisé par : Flannel (mode vxlan), Calico (mode VXLAN), Cilium (mode overlay)

kube-proxy ne gère pas la communication Pod-to-Pod directe. Son rôle est de :

  • Implémenter les Services (ClusterIP, NodePort, LoadBalancer)
  • Configurer les règles iptables ou IPVS pour router vers les Pods backend
Pod A veut contacter Service "nginx" (ClusterIP 10.96.1.100)
iptables/IPVS (kube-proxy)
NAT vers un Pod backend (10.244.2.15)
Communication Pod-to-Pod normale
  1. Créez deux Pods de test

    Fenêtre de terminal
    kubectl run test1 --image=busybox --command -- sleep infinity
    kubectl run test2 --image=busybox --command -- sleep infinity
  2. Récupérez les IPs

    Fenêtre de terminal
    kubectl get pods -o wide
    NAME READY STATUS IP NODE
    test1 1/1 Running 10.244.1.5 worker1
    test2 1/1 Running 10.244.2.8 worker2
  3. Testez la connectivité

    Fenêtre de terminal
    # Depuis test1, ping test2
    kubectl exec test1 -- ping -c 3 10.244.2.8
  4. Nettoyez

    Fenêtre de terminal
    kubectl delete pod test1 test2
Fenêtre de terminal
# Créer un serveur nginx
kubectl run nginx --image=nginx
kubectl expose pod nginx --port=80
# Tester depuis un autre Pod
kubectl run test --rm -it --image=busybox -- wget -qO- nginx
Fenêtre de terminal
# Voir les interfaces réseau dans un Pod
kubectl exec <pod> -- ip addr
# Voir la table de routage
kubectl exec <pod> -- ip route
# Voir les règles iptables du nœud (depuis le nœud)
iptables -t nat -L -n -v | head -50

Symptômes : ping timeout ou “Network unreachable”

Diagnostic :

Fenêtre de terminal
# 1. Vérifier que le CNI est installé
kubectl get pods -n kube-system | grep -E 'calico|cilium|flannel'
# 2. Vérifier les logs CNI
kubectl logs -n kube-system -l k8s-app=calico-node
# 3. Vérifier les routes sur le nœud
ip route | grep 10.244

Solutions possibles :

  • Installer un plugin CNI si absent
  • Vérifier les Network Policies qui pourraient bloquer
  • Redémarrer le DaemonSet CNI

Cause fréquente : Erreur CNI lors de l’allocation IP

Fenêtre de terminal
# Voir les événements du Pod
kubectl describe pod <name> | grep -A5 Events
# Vérifier les logs kubelet
journalctl -u kubelet | grep -i cni

Vérifications :

Fenêtre de terminal
# Les nœuds se voient-ils ?
kubectl get nodes
# Le CIDR est-il correctement alloué ?
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
# Route vers l'autre sous-réseau Pod
ip route get 10.244.2.1
Fenêtre de terminal
# Voir l'IP d'un Pod
kubectl get pod <name> -o wide
# CIDR par nœud
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
# Interfaces dans un Pod
kubectl exec <pod> -- ip addr
# Routes dans un Pod
kubectl exec <pod> -- ip route
# Test de connectivité
kubectl exec <pod1> -- ping -c 2 <pod2-ip>
# DNS test (Pod-to-Service)
kubectl exec <pod> -- nslookup kubernetes.default
# Vérifier le CNI
ls /etc/cni/net.d/
kubectl get pods -n kube-system | grep -E 'calico|cilium|flannel|ovn'
  1. Chaque Pod a sa propre IP — pas de port mapping nécessaire
  2. Modèle réseau = contrat — Kubernetes définit les garanties, le CNI implémente
  3. Le CNI configure le réseau et attribue les IPs
  4. Pod CIDR divisé en sous-réseaux par nœud
  5. Overlay (VXLAN) ou native routing (BGP) pour le trafic inter-nœuds
  6. kube-proxy gère les Services, pas le routage Pod-to-Pod direct
  7. Les conteneurs d’un même Pod communiquent via localhost

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn