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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Le modèle réseau Kubernetes
Section intitulée « Le modèle réseau Kubernetes »Les 4 problèmes de networking
Section intitulée « Les 4 problèmes de networking »Kubernetes doit résoudre 4 types de communication :
| Type | Description | Solution |
|---|---|---|
| Container-to-Container | Conteneurs dans le même Pod | localhost (127.0.0.1) |
| Pod-to-Pod | Pods dans le cluster | Réseau Pod (ce guide) |
| Pod-to-Service | Pod vers un Service | kube-proxy + DNS |
| External-to-Service | Trafic externe vers le cluster | Ingress, LoadBalancer |
Les garanties du modèle
Section intitulée « Les garanties du modèle »Kubernetes impose trois règles fondamentales :
- Chaque Pod reçoit sa propre adresse IP
- 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
- L’IP vue par un Pod est la même que celle vue par les autres Pods (pas de SNAT entre Pods)
Architecture réseau
Section intitulée « Architecture réseau »┌─────────────────────────────────────────────────────────────────────────┐│ 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 │ ││ └─────────────────────┘ ││ │└───────────────────────────────────────────────────────────────────────┘Allocation des adresses IP
Section intitulée « Allocation des adresses IP »CIDR du cluster
Section intitulée « CIDR du cluster »Le cluster définit une plage d’adresses IP réservée aux Pods via le Pod CIDR :
# Voir le CIDR du cluster (méthode kubeadm)kubectl cluster-info dump | grep -m 1 cluster-cidrConfiguration typique :
| Paramètre | Valeur exemple | Description |
|---|---|---|
--cluster-cidr | 10.244.0.0/16 | Plage totale pour les Pods |
--node-cidr-mask-size | /24 | Taille du sous-réseau par nœud |
CIDR par nœud
Section intitulée « CIDR par nœud »Chaque nœud reçoit un sous-réseau du CIDR cluster :
# Voir le CIDR alloué à chaque nœudkubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'master1 10.244.0.0/24worker1 10.244.1.0/24worker2 10.244.2.0/24Qui attribue les IPs ?
Section intitulée « Qui attribue les IPs ? »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 IPVoir l’IP d’un Pod
Section intitulée « Voir l’IP d’un Pod »# IP dans la descriptionkubectl get pod <name> -o wide
# IP via jsonpathkubectl get pod <name> -o jsonpath='{.status.podIP}'
# IPs de tous les Podskubectl get pods -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,IP:.status.podIPCommunication Pod-to-Pod
Section intitulée « Communication Pod-to-Pod »Sur le même nœud
Section intitulée « Sur le même nœud »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.
Entre nœuds différents
Section intitulée « Entre nœuds différents »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)
Les Pod CIDRs sont annoncés via BGP aux routeurs du réseau :
┌─────────────────┐ BGP ┌─────────────────┐│ Node 1 │────────────▶│ Routeur ││ 10.244.1.0/24 │ │ (connaît les │└─────────────────┘ │ routes Pod) │ └────────┬────────┘┌─────────────────┐ BGP ││ Node 2 │◀─────────────────────┘│ 10.244.2.0/24 │└─────────────────┘Le trafic Pod n’est pas encapsulé — meilleure performance mais nécessite une infrastructure BGP.
Utilisé par : Calico (mode BGP), Cilium (mode native routing)
Le paquet IP Pod est encapsulé dans un autre paquet IP :
┌─────────────────────────────────────────────────────────────────┐│ Outer IP: Src 192.168.1.10 → Dst 192.168.1.11 (Protocol 4) ││ ┌─────────────────────────────────────────────────────────────┐ ││ │ Inner IP: Src 10.244.1.5 → Dst 10.244.2.7 │ ││ └─────────────────────────────────────────────────────────────┘ │└─────────────────────────────────────────────────────────────────┘Plus simple que VXLAN, moins de métadonnées.
Utilisé par : Calico (mode IP-in-IP)
Le rôle de kube-proxy
Section intitulée « Le rôle de kube-proxy »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 normaleTester la connectivité Pod-to-Pod
Section intitulée « Tester la connectivité Pod-to-Pod »Test basique
Section intitulée « Test basique »-
Créez deux Pods de test
Fenêtre de terminal kubectl run test1 --image=busybox --command -- sleep infinitykubectl run test2 --image=busybox --command -- sleep infinity -
Récupérez les IPs
Fenêtre de terminal kubectl get pods -o wideNAME READY STATUS IP NODEtest1 1/1 Running 10.244.1.5 worker1test2 1/1 Running 10.244.2.8 worker2 -
Testez la connectivité
Fenêtre de terminal # Depuis test1, ping test2kubectl exec test1 -- ping -c 3 10.244.2.8 -
Nettoyez
Fenêtre de terminal kubectl delete pod test1 test2
Test avec wget/curl
Section intitulée « Test avec wget/curl »# Créer un serveur nginxkubectl run nginx --image=nginxkubectl expose pod nginx --port=80
# Tester depuis un autre Podkubectl run test --rm -it --image=busybox -- wget -qO- nginxDiagnostic avancé
Section intitulée « Diagnostic avancé »# Voir les interfaces réseau dans un Podkubectl exec <pod> -- ip addr
# Voir la table de routagekubectl exec <pod> -- ip route
# Voir les règles iptables du nœud (depuis le nœud)iptables -t nat -L -n -v | head -50Problèmes courants et solutions
Section intitulée « Problèmes courants et solutions »Le Pod ne peut pas ping un autre Pod
Section intitulée « Le Pod ne peut pas ping un autre Pod »Symptômes : ping timeout ou “Network unreachable”
Diagnostic :
# 1. Vérifier que le CNI est installékubectl get pods -n kube-system | grep -E 'calico|cilium|flannel'
# 2. Vérifier les logs CNIkubectl logs -n kube-system -l k8s-app=calico-node
# 3. Vérifier les routes sur le nœudip route | grep 10.244Solutions possibles :
- Installer un plugin CNI si absent
- Vérifier les Network Policies qui pourraient bloquer
- Redémarrer le DaemonSet CNI
Le Pod est en ContainerCreating
Section intitulée « Le Pod est en ContainerCreating »Cause fréquente : Erreur CNI lors de l’allocation IP
# Voir les événements du Podkubectl describe pod <name> | grep -A5 Events
# Vérifier les logs kubeletjournalctl -u kubelet | grep -i cniCommunication inter-nœuds KO
Section intitulée « Communication inter-nœuds KO »Vérifications :
# 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 Podip route get 10.244.2.1Commandes CKA essentielles
Section intitulée « Commandes CKA essentielles »# Voir l'IP d'un Podkubectl get pod <name> -o wide
# CIDR par nœudkubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
# Interfaces dans un Podkubectl exec <pod> -- ip addr
# Routes dans un Podkubectl 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 CNIls /etc/cni/net.d/kubectl get pods -n kube-system | grep -E 'calico|cilium|flannel|ovn'À retenir
Section intitulée « À retenir »- Chaque Pod a sa propre IP — pas de port mapping nécessaire
- Modèle réseau = contrat — Kubernetes définit les garanties, le CNI implémente
- Le CNI configure le réseau et attribue les IPs
- Pod CIDR divisé en sous-réseaux par nœud
- Overlay (VXLAN) ou native routing (BGP) pour le trafic inter-nœuds
- kube-proxy gère les Services, pas le routage Pod-to-Pod direct
- Les conteneurs d’un même Pod communiquent via localhost