Débogage des Problèmes de Réseau Kubernetes : Techniques Essentielles
Déboguez les problèmes de réseau Kubernetes concernant la connectivité des pods, les services, le DNS, les NetworkPolicies et le routage Ingress.
Débogage des Problèmes de Réseau Kubernetes : Techniques Essentielles
Les problèmes de réseau Kubernetes se manifestent généralement par des timeouts, des erreurs Connection refused, des échecs DNS, des endpoints de Service vides ou des réponses Ingress incorrectes. Pour les résoudre rapidement, tracez le chemin : pod source, pod destination, Service, DNS, NetworkPolicy, puis Ingress ou équilibreur de charge.
Ce guide vous propose une séquence pratique de vérifications et les commandes kubectl qui révèlent où le trafic s'arrête.
Comprendre les Fondamentaux du Réseau Kubernetes
Avant de plonger dans le débogage, il est important de saisir les concepts réseau de base dans Kubernetes :
- Réseau des Pods : Chaque pod reçoit sa propre adresse IP unique. Les pods au sein d'un même nœud peuvent communiquer directement. Les pods sur différents nœuds communiquent via un réseau virtuel (plugin CNI).
- Services : Les Services fournissent une adresse IP stable et un nom DNS pour un ensemble de pods. Ils agissent comme une couche d'abstraction, permettant à d'autres pods ou clients externes d'accéder aux backends d'application sans connaître les IP individuelles des pods.
- DNS : Le DNS Kubernetes (généralement CoreDNS) résout les noms de Service en IP de cluster, permettant la découverte de services.
- Network Policies : Ces ressources contrôlent le trafic des pods lorsque votre plugin CNI les applique. Un cluster sans support NetworkPolicy acceptera les objets mais peut ne pas appliquer les règles.
- Ingress : Les contrôleurs Ingress gèrent l'accès externe aux services au sein du cluster, généralement HTTP et HTTPS. Ils assurent le routage, l'équilibrage de charge et la terminaison SSL.
Problèmes Réseau Courants et Stratégies de Débogage
1. Échecs de Communication Pod-à-Pod
Lorsque les pods ne peuvent pas communiquer entre eux, même dans le même namespace, c'est un indicateur principal d'un problème réseau.
Symptômes :
- Erreurs d'application indiquant des timeouts ou des refus de connexion.
- Les commandes
curloupingd'un pod à un autre échouent.
Étapes de Débogage :
- Vérifier les IP des Pods : Assurez-vous que les pods source et destination ont des adresses IP valides. Utilisez
kubectl exec <nom-pod> -- ip addr. - Vérifier la Connectivité Réseau (dans le pod) : Depuis le pod source, essayez de pinguer l'adresse IP du pod destination. Si cela échoue, le problème peut venir du plugin CNI ou du réseau du nœud.
kubectl exec <nom-pod-source> -- ping <ip-pod-destination> - Inspecter les Network Policies : Les Network Policies sont une cause fréquente. Vérifiez si des politiques bloquent involontairement le trafic entre les pods.
Examinez les règleskubectl get networkpolicies -n <namespace>podSelectoretingress/egresspour comprendre quel trafic est autorisé ou refusé. Une fois qu'un pod est sélectionné par une politique d'ingress, seul le trafic entrant explicitement autorisé est permis. - Statut du Plugin CNI : Assurez-vous que votre plugin Container Network Interface (CNI) (par exemple, Calico, Flannel, Cilium) fonctionne correctement sur tous les nœuds. Vérifiez les logs des pods du daemonset CNI.
kubectl get pods -n kube-system -l k8s-app=<label-plugin-cni> kubectl logs <nom-pod-cni> -n kube-system
2. Problèmes de Découverte de Services
Lorsque les pods ne peuvent pas atteindre d'autres services par leurs noms DNS ou IP de cluster, cela indique un problème avec le DNS Kubernetes ou la configuration de l'objet Service.
Symptômes :
- Erreurs d'application comme
Name or service not known. - Les commandes
nslookupoudigdans un pod échouent à résoudre les noms de service.
Étapes de Débogage :
- Vérifier la Résolution DNS : Depuis un pod, testez la résolution DNS pour un service connu.
Si cela échoue, vérifiez les pods CoreDNS pour des erreurs.kubectl exec <nom-pod> -- nslookup <nom-service>.<namespace>.svc.cluster.localkubectl get pods -n kube-system -l k8s-app=kube-dns kubectl logs <nom-pod-coredns> -n kube-system - Vérifier l'Objet Service : Assurez-vous que l'objet Service est correctement configuré et a des endpoints pointant vers des pods sains.
La sortiekubectl get service <nom-service> -n <namespace> -o yaml kubectl get endpoints <nom-service> -n <namespace>endpointsdoit lister les adresses IP des pods soutenant le service. - Sondes de Préparation des Pods : Si les pods ne réussissent pas leurs sondes de préparation, ils ne seront pas ajoutés aux endpoints du Service. Vérifiez les configurations des sondes de préparation et les logs des pods pour des problèmes.
3. Problèmes de Contrôleur Ingress
L'accès externe à vos services est géré par les ressources Ingress et les contrôleurs Ingress. Les problèmes ici peuvent rendre votre application inaccessible depuis l'extérieur du cluster.
Symptômes :
- Erreurs
502 Bad Gateway,404 Not Foundou503 Service Unavailablelors de l'accès aux applications via leur URL externe. - Les logs du contrôleur Ingress montrent des erreurs liées aux services backend.
Étapes de Débogage :
- Vérifier les Pods du Contrôleur Ingress : Assurez-vous que les pods du contrôleur Ingress (par exemple, Nginx Ingress, Traefik) sont en cours d'exécution et sains.
kubectl get pods -l app.kubernetes.io/component=controller # Ajustez le label selon votre contrôleur Ingress kubectl logs <nom-pod-controleur-ingress> -n <namespace-ingress> - Vérifier la Ressource Ingress : Vérifiez la configuration de votre ressource
Ingress.
Assurez-vous que la sectionkubectl get ingress <nom-ingress> -n <namespace> -o yamlrulesmappe correctement les noms d'hôte et les chemins vers leservice.nameetservice.portappropriés. - Vérifier le Service et les Endpoints : Comme pour la découverte de services, assurez-vous que le service backend pointé par l'Ingress est correctement configuré et a des endpoints sains.
kubectl get service <nom-service-backend> -n <namespace> kubectl get endpoints <nom-service-backend> -n <namespace> - Pare-feu et Équilibreur de Charge : Si vous accédez depuis l'extérieur du cluster, assurez-vous que les pare-feu externes ou les équilibreurs de charge du fournisseur cloud sont correctement configurés pour transférer le trafic vers le service du contrôleur Ingress (souvent un service de type
LoadBalancer).
4. Application des Network Policies
Les Network Policies peuvent être puissantes mais aussi une source de problèmes de connectivité si mal configurées. Elles fonctionnent selon le principe du moindre privilège ; si une politique n'autorise pas explicitement le trafic, celui-ci est refusé.
Étapes de Débogage :
- Identifier les Politiques Appliquées : Déterminez quelles Network Policies affectent les pods en question.
kubectl get networkpolicy -n <namespace> - Inspecter les Sélecteurs de Politique : Examinez attentivement le
podSelectordans chaque NetworkPolicy pertinente. Ce sélecteur détermine à quels pods la politique s'applique. Si un pod est sélectionné par plusieurs politiques, le trafic autorisé est l'union de ces règles de politique, et non la règle unique la plus restrictive. - Examiner les Règles Ingress/Egress : Analysez les sections
ingressetegressde la Network Policy. Si vous essayez d'établir une connexion depuis le Pod A vers le Pod B, vous devez vous assurer :- Une Network Policy appliquée au Pod B autorise le trafic entrant depuis le Pod A (ou un sélecteur de label plus large incluant le Pod A).
- Une Network Policy appliquée au Pod A autorise le trafic sortant vers le Pod B (ou un sélecteur de label plus large incluant le Pod B).
- Tester avec une Politique Large Ouverte : Comme étape de dépannage temporaire, vous pouvez créer une Network Policy qui autorise tout le trafic vers et depuis des pods ou namespaces spécifiques pour voir si la connectivité est rétablie. Cela aide à isoler si le problème vient effectivement des Network Policies.
Attention : Cette politique# Exemple : Autoriser tout le trafic entrant et sortant pour les pods avec le label app=my-app apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-for-my-app namespace: default spec: podSelector: matchLabels: app: my-app policyTypes: - Ingress - Egress ingress: - {} egress: - {}allow-allne doit être utilisée que pour un débogage temporaire. Supprimez-la dès que vous avez terminé le test.
Outils et Commandes Essentiels
kubectl exec: Exécutez des commandes dans un pod (par exemple,ping,curl,nslookup).kubectl logs: Affichez les logs des pods, en particulier pour les composants du plan de contrôle et les plugins réseau.kubectl describe: Obtenez des informations détaillées sur les pods, services, ingress et network policies, qui révèlent souvent le statut et les événements.kubectl get: Listez les ressources et leur statut de base.tcpdump: Un analyseur de paquets en ligne de commande puissant. Vous pouvez l'exécuter dans un pod ou sur un nœud pour capturer le trafic réseau.# Exemple : Capturer le trafic sur l'interface eth0 dans un pod kubectl exec <nom-pod> -- tcpdump -i eth0 -nn port 80
À Retenir
Déboguez le réseau Kubernetes de l'intérieur vers l'extérieur. Prouvez d'abord la connectivité IP des pods, puis les endpoints de Service, puis le DNS, puis la NetworkPolicy, et enfin le comportement de l'Ingress ou de l'équilibreur de charge externe. Cet ordre vous évite de courir après un symptôme Ingress alors que le Service n'a pas d'endpoints prêts.