Modèle réseau et CNI
Le modèle réseau Kubernetes impose trois règles fondamentales : tout pod peut communiquer avec tout autre pod sans NAT, tout noeud peut communiquer avec tout pod sans NAT, l'IP vue par le pod est la même que celle vue de l'extérieur. L'implémentation de ces règles est déléguée au plugin CNI (Container Network Interface).
Le modèle réseau Kubernetes
Kubernetes définit trois espaces d'adressage distincts :
- Pod CIDR : plage d'IP pour les pods (ex. 10.244.0.0/16). Chaque pod reçoit une IP unique dans ce réseau.
- Service CIDR : plage d'IP virtuelles pour les Services (ex. 10.96.0.0/12). Ces IPs n'existent que dans iptables/ipvs.
- Node network : réseau physique des noeuds (votre réseau habituel).
La communication inter-pods traverse le CNI. La communication vers un Service traverse kube-proxy (ou le CNI en mode eBPF).
Container Network Interface (CNI)
CNI est une spécification et un ensemble de bibliothèques pour configurer les interfaces réseau dans les conteneurs. Kubernetes appelle le plugin CNI au démarrage et à l'arrêt de chaque pod. Chaque plugin CNI a sa propre approche :
Flannel
Simple et léger. Encapsulation VXLAN par défaut (overlay). Peu de fonctionnalités avancées. Idéal pour les clusters simples sans besoin de NetworkPolicies (Flannel seul ne supporte pas les NetworkPolicies).
Calico
Routage BGP natif (sans overlay possible) ou VXLAN. Supporte les NetworkPolicies Kubernetes et ses propres GlobalNetworkPolicies. Très utilisé en production, compatible avec la plupart des environnements. Bonne performance.
# Installer Calico (exemple avec Tigera Operator)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/custom-resources.yamlCilium
CNI nouvelle génération basé sur eBPF. Remplace complètement iptables/kube-proxy par des programmes eBPF dans le noyau. Observabilité réseau native (Hubble), NetworkPolicies L7 (HTTP, gRPC), chiffrement transparent (WireGuard). C'est le CNI recommandé pour les nouveaux clusters à partir de Kubernetes 1.29+.
# Installer Cilium avec Helm
helm install cilium cilium/cilium --version 1.16.5 --namespace kube-system --set kubeProxyReplacement=true # Remplace kube-proxy
# Statut
cilium status
cilium connectivity testDebugging réseau
# Pod de debug réseau
kubectl run netdebug --image=nicolaka/netshoot --rm -it -- bash
# Dans le pod : ping, curl, nslookup, traceroute, tcpdump...
# Vérifier les endpoints d'un Service
kubectl get endpoints mon-service
# Tester la connectivité entre pods
kubectl exec pod-a -- curl http://pod-b-service:8080/healthz
# Inspecter les règles iptables sur un noeud
iptables-save | grep mon-service