Résoudre les problèmes de mise en réseau du Cloud distribué de Google

Cette page explique comment résoudre les problèmes de mise en réseau avec Google Distributed Cloud. Vous trouverez des informations et des conseils de dépannage d'ordre général, ainsi que des outils suggérés. Des informations de dépannage DNS et certains problèmes courants pour Calico, Seesaw et MetalLB sont également inclus.

Si vous avez besoin d'aide supplémentaire, contactez l'assistance Cloud Customer Care.

Résoudre les problèmes de connectivité réseau

La mise en réseau GKE Enterprise repose sur votre infrastructure réseau physique. Par exemple, Seesaw ou MetalLB repose sur le respect d'un ARP gratuit par vos commutateurs, l'équilibrage de charge groupé avec Border Gateway Protocol (BGP) repose sur vos routeurs, et tous les nœuds doivent être en mesure de communiquer entre eux. Lorsque vous rencontrez un problème de mise en réseau dans vos clusters GKE, vous devez déterminer s'il se trouve dans les composants GKE Enterprise ou dans votre propre infrastructure.

Commencez par déterminer l'étendue du problème, puis essayez d'identifier les composants concernés. Le champ d'application d'un problème peut relever d'une catégorie parmi trois : l'objet (d'où), la cible (vers quoi) et la couche réseau.

Le champ d'application de l'objet peut être l'un des suivants:

  • Tous les nœuds (ou pods hostNetwork) du cluster.
  • Tous les pods du cluster.
  • Tous les pods d'un seul nœud ou d'un ensemble de nœuds.
  • Tous les pods du même déploiement ou DaemonSet.
  • Client extérieur au cluster

Le champ d'application de la cible peut être un ou plusieurs des éléments suivants:

  • Toutes les autres adresses IP de pods du même cluster.
  • Toutes les autres adresses IP de pod du même nœud.
  • VIP du service ClusterIP du même cluster
  • Adresse IP virtuelle du service LoadBalancer du même cluster.
  • Équilibreur de charge de couche 7 d'entrée (Istio).
  • Les autres nœuds du même cluster.
  • Nom DNS interne (par exemple, *.svc.cluster.local).
  • Nom DNS externe (par exemple, google.com).
  • Entités extérieures au cluster.
  • Entités sur Internet.

La couche réseau peut correspondre à un ou plusieurs des éléments suivants:

  • Problèmes de couche de liaison de niveau 2, tels que le système voisin, ARP ou NDP
  • Problèmes de routage des adresses IP de couche 3.
  • Problèmes de point de terminaison TCP ou UDP de couche 4.
  • Problèmes HTTP ou HTTPS de couche 7.
  • Problèmes de résolution DNS.

Comprendre la portée d'un problème permet d'identifier les composants impliqués et la couche à laquelle le problème se produit. Il est important de collecter des informations en cas de problème, car certains problèmes sont temporaires. Par conséquent, les instantanés après la récupération du système n'incluent pas suffisamment d'informations pour l'analyse de l'origine du problème.

Problèmes d'entrée

Si l'objet est un client extérieur au cluster et qu'il n'a pas pu se connecter à un service LoadBalancer, il s'agit d'un problème de connectivité Nord-Sud. Le schéma suivant montre que dans un exemple fonctionnel le trafic entrant traverse la pile de gauche à droite, et le trafic de retour traverse la pile de droite à gauche. Seesaw est différent dans la mesure où le trafic de retour ignore l'équilibreur de charge et retourne directement au client:

Le trafic entrant passe de l'utilisateur à l'infrastructure physique, via un équilibreur de charge, à anetd/kube-proxy, puis au backend. Avec Seesaw, le trafic de sortie ignore l'équilibreur de charge.

En cas de problème avec ce flux de trafic, utilisez l'organigramme de dépannage suivant pour identifier l'origine du problème:

Corrigez les problèmes d'entrée réseau en examinant chaque étape par laquelle un paquet circule dans votre environnement. Vérifiez si les actions et la connectivité appropriées existent tout au long du processus.

Dans cet organigramme, les conseils de dépannage suivants vous permettent de déterminer l'origine du problème:

  • Le paquet quitte-t-il le client ? Si ce n'est pas le cas, vous rencontrez probablement un problème d'infrastructure réseau.
  • Utilisez-vous l'équilibreur de charge Seesaw ? Si tel est le cas, le paquet arrive-t-il au nœud Seesaw et l'ARP est-il ensuite envoyé correctement ? Si ce n'est pas le cas, vous rencontrez probablement un problème d'infrastructure réseau.
  • Utilisez-vous MetalLB ? Si oui, le paquet arrive-t-il au nœud LB et l'ARP est-il ensuite envoyé correctement ? Si ce n'est pas le cas, vous rencontrez probablement un problème d'infrastructure réseau.
  • Utilisez-vous F5 BIG-IP et, dans l'affirmative, avez-vous vérifié s'il existe des problèmes F5 ?
  • La traduction d'adresse réseau (NAT) est-elle correctement effectuée ? Si ce n'est pas le cas, vous rencontrez probablement un problème lié à kube-proxy/Dataplane V2.
  • Le paquet arrive-t-il sur le nœud de calcul ? Si ce n'est pas le cas, vous rencontrez probablement un problème entre pods Calico/Dataplane v2.
  • Le paquet arrive-t-il au pod ? Si ce n'est pas le cas, vous rencontrez probablement un problème de transfert local Calico/Dataplane v2.

Les sections suivantes décrivent la procédure à suivre pour résoudre les problèmes à chaque étape afin de déterminer si le trafic circule correctement.

Le paquet quitte-t-il le client ?

Vérifiez si le paquet quitte correctement le client et passe par le routeur configuré dans votre infrastructure réseau physique.

  1. Utilisez tcpdump pour vérifier le paquet lorsqu'il quitte le client pour le service de destination:

    tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
    

    Si vous ne voyez aucun trafic sortant, il s'agit de la source du problème.

Le paquet arrive-t-il sur un nœud Seesaw ?

Si vous utilisez Seesaw comme équilibreur de charge, recherchez le nœud maître, puis connectez-vous au nœud à l'aide de SSH.

  1. Utilisez tcpdump pour vérifier si les paquets attendus sont arrivés au nœud Seesaw :

    tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
    

    Si vous ne voyez aucun trafic entrant, c'est la source du problème.

Le paquet arrive-t-il sur un nœud LoadBalancer ?

Si vous utilisez MetalLB comme équilibreur de charge :

  1. Consultez le journal metallb-controller pour déterminer le nœud d'équilibreur de charge qui sert l'adresse VIP du service :

    kubectl -n kube-system logs -l app=metallb --all-containers=true | grep SERVICE_VIP
    
  2. Connectez-vous au nœud à l'aide de SSH.

  3. Pour un nœud MetalLB, utilisez tcpdump pour examiner le trafic:

    tcpdump -ni any host SERVICE_VIP and port SERVICE_PORT
    

    Pour ManualLB, le trafic peut atterrir sur n'importe quel nœud. En fonction de la configuration de l'équilibreur de charge, vous pouvez choisir un ou plusieurs nœuds. Utilisez tcpdump pour examiner le trafic :

    tcpdump -ni any host NODE_IP and port NODE_PORT
    

    La commande est différente entre les types d'équilibreurs de charge, car MetalLB et Seesaw n'effectuent pas de NAT avant de transférer le paquet aux nœuds.

    Si aucun trafic n'est visible dans un nœud, c'est la source du problème.

Existe-t-il un problème avec F5 BIG-IP ?

Pour résoudre les problèmes liés à F5 BIG-IP, consultez l'une des sections suivantes F5 Service ne reçoit pas de trafic.

L'ARP est-il correctement envoyé ?

Le nœud d'équilibrage de charge de MetalLB ou Seesaw s'appuie sur l'ARP pour annoncer l'adresse IP virtuelle de service. Si la réponse ARP est correctement envoyée, mais que le trafic n'entre pas, cela indique un problème dans votre infrastructure de mise en réseau physique. L'une des causes courantes de ce problème est que certaines fonctionnalités avancées d'apprentissage de plan de données ignorent la réponse ARP dans les solutions de réseau défini par logiciel (SDN, Software-Defined Network).

  1. Utilisez tcpdump pour détecter les réponses ARP:

    tcpdump -ni any arp
    

    Essayez de localiser le message annonçant l'adresse IP virtuelle avec laquelle vous rencontrez des problèmes.

    • Pour Seesaw, des messages ARP gratuits sont envoyés pour toutes les adresses IP virtuelles. Les messages ARP pour chaque adresse IP virtuelle doivent s'afficher toutes les 10 secondes.

    • Pour MetalLB, il n'envoie pas de protocole ARP gratuit. La fréquence à laquelle vous voyez une réponse dépend du moment où un autre appareil, tel qu'un commutateur ToR (Top of Rack) ou un commutateur virtuel, envoie une requête ARP.

La NAT est-elle mise en œuvre ?

Dataplane v2/kube-proxy effectue une traduction d'adresse réseau de destination (NAT de destination ou DNAT) pour traduire l'adresse IP virtuelle de destination en adresse IP de pod de backend. Si vous savez quel nœud est le backend pour l'équilibreur de charge, connectez-vous au nœud à l'aide de SSH.

  1. Utilisez tcpdump pour vérifier si l'adresse IP virtuelle de service est correctement traduite:

    tcpdump -ni any host BACKEND_POD_IP and port CONTAINER_PORT
    
  2. Pour Dataplane v2, vous pouvez également vous connecter aux pods anetd et utiliser les outils de débogage Cilium intégrés:

    cilium monitor --type=drop
    

Pour en savoir plus, consultez l'une des sections suivantes sur les problèmes liés à Dataplane v2/Cilium.

Le paquet arrive-t-il sur un nœud de calcul ?

Sur les nœuds de calcul, le paquet arrive sur l'interface externe, puis est envoyé aux pods.

  1. Vérifiez si le paquet arrive à l'interface externe, généralement appelée eth0 ou ens192, à l'aide de tcpdump :

    tcpdump -ni any host BACKEND_POD_IP and port CONTAINER_PORT
    

Comme les backends Service normaux contiennent plusieurs pods sur différents nœuds, il peut être difficile de déterminer le nœud responsable du problème. Une solution de contournement courante consiste à capturer le problème suffisamment longtemps pour qu'un paquet arrive à terme, ou à limiter le nombre de backends à un.

Si le paquet n'arrive jamais sur le nœud de travail, cela indique un problème d'infrastructure réseau. Consultez l'équipe chargée de l'infrastructure de mise en réseau pour savoir pourquoi le paquet est supprimé entre les nœuds LoadBalancer et les nœuds de calcul. Voici quelques problèmes courants:

  • Vérifiez vos journaux de réseau défini par logiciel (SDN). Le SDN peut parfois supprimer des paquets pour diverses raisons, telles que la segmentation, une somme de contrôle incorrecte ou l'anti-spoofing.
  • Des règles de pare-feu qui filtrent les paquets dont la destination est l'adresse IP et le port du pod de backend

Si le paquet arrive à l'interface externe ou à l'interface de tunnel du nœud, il doit être transféré au pod de destination. Si le pod est un pod de mise en réseau hôte, cette étape n'est pas nécessaire, car le pod partage l'espace de noms réseau avec le nœud. Sinon, un transfert de paquets supplémentaire est requis.

Chaque pod possède des paires d'interface Ethernet virtuelles, qui fonctionnent comme des pipelines. Un paquet envoyé à une extrémité de l'interface est reçu de l'autre extrémité de l'interface. L'une des interfaces est déplacée vers l'espace de noms réseau du pod et renommée eth0. L'autre interface est conservée dans l'espace de noms de l'hôte. Différents CNI ont un schéma différent. Pour Dataplane v2, l'interface est normalement nommée lxcxxxx. Les noms comportent des numéros d'interface consécutifs, tels que lxc17 et lxc18. Vous pouvez vérifier si le paquet arrive au pod à l'aide de tcpdump ou spécifier l'interface :

tcpdump -ni lcxxxx host BACKEND_POD_IP and port CONTAINER_PORT

Si le paquet arrive au nœud, mais ne parvient pas à atteindre le pod, vérifiez la table de routage comme suit:

ip route

Normalement, chaque pod doit disposer d'une entrée de routage qui redirige l'adresse IP du pod vers l'interface lxc. Si l'entrée est manquante, cela signifie généralement que le chemin de données CNI comporte une erreur. Pour déterminer la cause première, consultez les journaux du DaemonSet CNI.

Problèmes de sortie

Si le trafic peut entrer dans un pod, vous pouvez rencontrer un problème avec le trafic sortant du pod. Les schémas suivants montrent que, dans un exemple fonctionnel, le trafic entrant transite par la pile de gauche à droite:

Le trafic sortant passe du pod à l'interface externe de l'hôte, puis à l'infrastructure physique, puis au service externe.

  1. Pour vérifier que le paquet sortant est correctement masquée comme adresse IP du nœud, vérifiez le service externe (couche 4).

    L'adresse IP source du paquet doit être mappée de l'adresse IP du pod vers l'adresse IP du nœud avec la traduction d'adresse réseau source (NAT source ou SNAT). Dans Dataplane v2, ce processus est réalisé par ebpf chargé sur une interface externe. Calico utilise des règles iptables.

    Utilisez tcpdump pour vérifier si l'adresse IP source est correctement traduite de l'adresse IP du pod vers l'adresse IP du nœud :

    tcpdump -ni EXTERNAL_INTERFACE host EXTERNAL_IP and port EXTERNAL_PORT
    

    Si tcpdump indique que les paquets sont correctement masqués, mais que le service distant ne répond pas, vérifiez la connexion au service externe dans votre infrastructure.

  2. Si les paquets sortants sont correctement masqués pour l'adresse IP du nœud, vérifiez la connectivité de l'hôte externe (couche 3) à l'aide de tcpdump:

    tcpdump -ni EXTERNAL_INTERFACE host EXTERNAL_IP and icmp
    

    En même temps que l'exécution de tcpdump, effectuez une requête ping à partir de l'un des pods :

    kubectl exec POD_NAME ping EXTERNAL_IP
    

    Si vous ne voyez pas de réponses ping, vérifiez la connexion au service externe dans votre infrastructure.

Problèmes au sein du cluster

Pour les problèmes de connectivité entre pods, essayez de limiter le problème aux nœuds. Souvent, un groupe de nœuds ne peut pas communiquer avec un autre groupe de nœuds.

  1. Dans Dataplane v2, vérifiez la connectivité des nœuds du nœud actuel à tous les autres nœuds du même cluster. Dans le pod anetd, vérifiez l'état de santé :

    cilium status --all-health
    

    Google Distributed Cloud utilise le mode de routage direct. Vous devriez voir une entrée de route par nœud du cluster, comme illustré dans l'exemple suivant :

    # <pod-cidr> via <node-ip> dev <external-interface>
    192.168.1.0/24 via 21.0.208.188 dev ens192
    192.168.2.0/24 via 21.0.208.133 dev ens192
    

    Si une route attendue est manquante pour un nœud, la connexion est perdue pour ce nœud.

Problèmes de couche réseau

L'identification de la couche réseau dans laquelle le problème de connectivité se produit est une étape importante. Un message d'erreur tel que "Un problème de connectivité d'une source vers une destination" n'est pas suffisamment informatif pour aider à résoudre le problème, qui peut être une erreur d'application, un problème de routage ou de DNS. Comprendre à quel niveau le problème se produit permet de corriger le bon composant.

Souvent, les messages d'erreur indiquent directement la couche à laquelle le problème se produit. Les exemples suivants peuvent vous aider à résoudre les questions sur la couche réseau:

  • Les erreurs HTTP indiquent qu'il s'agit d'un problème de couche 7.
    • Les codes HTTP 40x, 50x ou les erreurs de handshake TLS signifient que tout fonctionne normalement au niveau de la couche 4.
  • Les erreurs "Connexion réinitialisée par l'homologue" indiquent qu'il s'agit d'un problème de couche 4.
    • Souvent, le socket distant ne peut pas être d'accord avec l'état actuel d'une connexion et envoie donc un paquet RESET. Ce comportement peut être une erreur dans le suivi des connexions ou la NAT.
  • Les erreurs "Aucune route vers l'hôte" et Délai avant expiration de la connexion indiquent généralement un problème de couche 3 ou de couche 2.
    • Ces erreurs indiquent que le paquet ne peut pas être correctement acheminé vers la destination.

Outils de dépannage utiles

Les DaemonSets liés au réseau s'exécutent sur vos nœuds et peuvent être la cause de problèmes de connectivité. Toutefois, une mauvaise configuration de vos nœuds, de commutateurs ToR, de routeurs centraux ou de pare-feu peut également entraîner des problèmes. Vous pouvez utiliser les outils suivants pour déterminer le champ d'application ou la couche du problème et déterminer s'il s'agit d'un problème avec vos nœuds GKE Enterprise ou votre infrastructure physique.

Ping

Ping fonctionne au niveau de la couche 3 (couche IP) et vérifie l'itinéraire entre une source et une destination. Si le ping n'atteint pas une destination, cela signifie souvent que le problème se situe au niveau de la couche 3.

Cependant, toutes les adresses IP ne peuvent pas être pinguées. Par exemple, certaines adresses IP virtuelles d'équilibreur de charge ne peuvent pas être pinguées s'il s'agit d'un équilibreur de charge de couche 4 pur. Par exemple, l'adresse IP virtuelle peut ne pas renvoyer de réponse ping au service ClusterIP. Au niveau de la couche 4, ce service ne renvoie une réponse ping que lorsque vous spécifiez un numéro de port, tel que VIP:port.

Les équilibreurs de charge BGPLB, MetalLB et Seesaw dans Google Distributed Cloud fonctionnent tous au niveau de la couche 3. Vous pouvez utiliser la commande ping pour vérifier la connectivité. Bien que F5 soit différent, il est également compatible avec ICMP. Vous pouvez utiliser la commande ping pour vérifier la connectivité à l'adresse IP virtuelle F5.

Recherche ARP

La recherche ARP est semblable au ping, sauf qu'elle fonctionne au niveau de la couche 2. Les problèmes de couches 2 et 3 ont souvent des messages d'erreur similaires en provenance des applications. La recherche ARP et ping peuvent aider à différencier le problème. Par exemple, si la source et la destination se trouvent dans le même sous-réseau, mais que vous ne pouvez pas effectuer une recherche ARP sur la destination, il s'agit d'un problème de couche 2.

Si la commande arping <ip> réussit, l'adresse MAC de la destination est renvoyée. Au niveau de la couche 2, cette adresse indique souvent un problème d'infrastructure physique. Il s'agit d'une erreur de configuration du commutateur virtuel.

La recherche ARP peut également détecter les conflits d'adresses IP. Un conflit d'adresses IP se produit lorsque deux machines sont configurées pour utiliser la même adresse IP sur le même sous-réseau ou qu'une adresse IP virtuelle est utilisée par une autre machine physique. Les conflits d'adresses IP peuvent entraîner des problèmes intermittents difficiles à résoudre. Si arping <ip> renvoie plusieurs entrées d'adresses MAC, cela indique qu'il existe un conflit d'adresses IP.

Après avoir obtenu l'adresse MAC via la recherche ARP, vous pouvez utiliser https://maclookup.app/ pour rechercher le fabricant de l'adresse MAC. Chaque fabricant possède un préfixe MAC. Vous pouvez donc utiliser ces informations pour déterminer quel appareil tente d'utiliser la même adresse IP. Par exemple, VMware est propriétaire du bloc 00:50:56. Une adresse MAC 00:50:56:xx:yy:zz est donc une VM dans votre environnement vSphere.

iproute2

La CLI ip pour iproute2 comporte de nombreuses sous-commandes utiles, telles que:

  • ip r : imprime la table de routage.
  • ip n : affiche la table des voisins pour le mappage des adresses IP vers les adresses MAC.
  • ip a: imprime toutes les interfaces de la machine

Une route manquante ou une entrée manquante dans la table voisine peut entraîner des problèmes de connectivité du nœud. Anetd et Calico gèrent tous deux la table de routage et la table des voisins. Une mauvaise configuration dans ces tables peut entraîner des problèmes de connectivité.

Cilium/Hubble CLI pour Dataplane v2

Chaque pod anetd possède plusieurs outils de débogage utiles pour les problèmes de connectivité:

  • cilium monitor --type=drop
    • Imprimez le journal de chaque paquet abandonné par anetd/Cilium.
  • hubble observe
    • Imprimez tous les paquets passant par la pile ebpf d'anetd.
  • cilium status --all-health
    • Affiche l'état de Cilium, y compris l'état de la connectivité nœud à nœud. Chaque pod anetd vérifie l'état de tous les autres nœuds du cluster et peut aider à déterminer les problèmes de connectivité nœud à nœud.

Iptables

Les iptables sont utilisés dans de nombreux composants et sous-systèmes Kubernetes. kube-proxy utilise des iptables pour mettre en œuvre la résolution de service. Calico utilise des iptables pour implémenter la règle de réseau

  1. Pour résoudre les problèmes de réseau au niveau des iptables, utilisez la commande suivante:

    iptables -L -v | grep DROP
    

    Examinez les règles de suppression, et vérifiez le nombre de paquets et d'octets pour voir s'ils augmentent au fil du temps.

Tcpdump

tcpdump est un outil puissant de capture de paquets qui génère de nombreuses données de trafic réseau. Il est courant d'exécuter tcpdump à la fois à partir de la source et de la destination. Si un paquet est capturé lorsqu'il quitte le nœud source, mais n'est jamais capturé sur le nœud de destination, cela signifie qu'un élément entre les deux supprime le paquet. Ce comportement indique généralement qu'un élément de votre infrastructure physique supprime le paquet par erreur.

Dépannage de DNS

Les problèmes de résolution DNS appartiennent à deux catégories principales:

  • Les pods standards, qui utilisent les serveurs DNS intégrés au cluster.
  • Pods ou nœuds du réseau hôte, qui n'utilisent pas de serveurs DNS au sein du cluster

Les sections suivantes fournissent des informations sur l'architecture DNS des clusters, ainsi que des conseils utiles avant de commencer à résoudre les problèmes liés à l'une de ces catégories.

Architecture du DNS d'un cluster

Un service DNS de cluster résout les requêtes DNS pour les pods du cluster. CoreDNS fournit ce service pour les versions 1.9.0 et ultérieures de Google Distributed Cloud.

Chaque cluster possède au moins deux pods coredns et un autoscaler chargé de mettre à l'échelle le nombre de pods DNS par rapport à la taille du cluster. Un service nommé kube-dns permet également d'équilibrer la charge des requêtes entre tous les pods coredns du backend.

Le DNS en amont de la plupart des pods est configuré sur l'adresse IP du service kube-dns, et les pods envoient des requêtes DNS à l'un des pods coredns. Les requêtes DNS peuvent être regroupées dans l'une des destinations suivantes:

  • Si la requête concerne un domaine cluster.local, il s'agit d'un nom DNS du cluster qui fait référence à un service ou à un pod du cluster.
    • CoreDNS surveille api-server pour tous les services et pods du cluster, et répond aux requêtes pour les domaines cluster.local valides.
  • Si la requête ne concerne pas un domaine cluster.local, il s'agit d'un domaine externe.
    • CoreDNS transmet la requête au ou aux serveurs de noms en amont. Par défaut, CoreDNS utilise les serveurs de noms en amont configurés sur le nœud sur lequel il s'exécute.

Pour en savoir plus, consultez la présentation du fonctionnement et de la configuration du DNS dans Kubernetes.

Conseils de dépannage DNS

Pour résoudre les problèmes de DNS, vous pouvez utiliser les outils dig et nslookup. Ces outils vous permettent d'envoyer des requêtes DNS pour vérifier si la résolution DNS fonctionne correctement. Les exemples suivants vous montrent comment utiliser dig et nslookup pour vérifier les problèmes de résolution DNS.

  • Utilisez dig ou nslookup pour envoyer une requête pour google.com:

    dig google.com
    nslookup google.com
    
  • Utilisez dig pour envoyer une requête pour kubernetes.default.svc.cluster.local au serveur 192.168.0.10:

    dig @192.168.0.10 kubernetes.default.svc.cluster.local
    
  • Vous pouvez également utiliser nslookup pour effectuer la même résolution DNS que la commande dig précédente:

    nslookup kubernetes.default.svc.cluster.local 192.168.0.10
    

    Examinez le résultat des commandes "dig" ou "nslookup". Si vous recevez une réponse incorrecte ou si vous n'obtenez aucune réponse, cela indique un problème de résolution DNS.

Pods réguliers

La première étape pour déboguer un problème DNS consiste à déterminer si les requêtes parviennent aux pods coredns ou non. Souvent, un problème de connectivité de cluster général apparaît comme des problèmes DNS, car une requête DNS est le premier type de trafic envoyé par une charge de travail.

Consultez les messages d'erreur de vos applications. Des erreurs telles que io timeout ou similaires indiquent qu'il n'y a pas de réponse et un problème général de connectivité réseau.

Les messages d'erreur qui incluent un code d'erreur DNS tel que NXDOMAIN ou SERVFAIL indiquent qu'il existe une connectivité au serveur DNS du cluster, mais que le serveur n'a pas pu résoudre le nom de domaine :

  • Les erreurs NXDOMAIN indiquent que le serveur DNS signale que le domaine n'existe pas. Vérifiez que le nom de domaine que votre application demande est valide.
  • Les erreurs SERVFAIL ou REFUSED indiquent que le serveur DNS a renvoyé une réponse, mais qu'il n'a pas pu résoudre le domaine ou confirmer qu'il n'existe pas. Pour en savoir plus, consultez les journaux des pods coredns.

Vous pouvez trouver l'adresse IP du service kube-dns à l'aide de la commande suivante:

kubectl -n kube-system get svc kube-dns

À partir d'un pod où le DNS ne fonctionne pas, essayez d'envoyer une requête DNS à cette adresse IP à l'aide de dig ou nslookup, comme indiqué dans une section précédente:

  • Si ces requêtes ne fonctionnent pas, essayez d'envoyer des requêtes à l'adresse IP de chaque pod coredns.
  • Si certains pods fonctionnent, mais pas d'autres, vérifiez s'il existe des modèles perceptibles. Par exemple, la résolution DNS fonctionne pour les pods situés sur le même nœud que le pod coredns, mais pas sur tous les nœuds. Ce comportement peut indiquer un problème de connectivité au sein du cluster.

Si CoreDNS ne peut pas résoudre les noms de domaine externes, consultez la section suivante pour résoudre les problèmes liés aux pods du réseau hôte. CoreDNS se comporte comme un pod du réseau hôte et utilise les serveurs DNS en amont du nœud pour la résolution des noms.

Pods ou nœuds du réseau hôte

Les pods et les nœuds du réseau hôte utilisent les serveurs de noms configurés sur le nœud pour la résolution DNS, et non le service DNS du cluster. Selon le système d'exploitation, ce serveur de noms est configuré dans /etc/resolv.conf ou /run/systemd/resolve/resolv.conf. Cette configuration signifie qu'ils ne peuvent pas résoudre les noms de domaine cluster.local.

Si vous rencontrez des problèmes avec la résolution de noms du réseau hôte, suivez les étapes de dépannage décrites dans les sections précédentes pour vérifier si le DNS fonctionne correctement pour vos serveurs de noms en amont.

Problèmes réseau courants

Les sections suivantes décrivent certains problèmes de réseau courants que vous pouvez rencontrer. Pour résoudre votre problème, suivez les instructions de dépannage appropriées. Si vous avez besoin d'une aide supplémentaire, contactez Cloud Customer Care.

Calico

Erreur courante : calico/node is not ready: BIRD is not ready: BGP not established

Cette erreur d'état "non prêt" dans Kubernetes signifie généralement qu'un pair particulier est inaccessible dans le cluster. Vérifiez que la connectivité BGP entre les deux pairs est autorisée dans votre environnement.

Cette erreur peut également se produire si des ressources de nœud inactives sont configurées pour le maillage nœud à nœud. Pour résoudre ce problème, mettez hors service les nœuds obsolètes.

Dataplane v2 / Cilium

Erreur courante : [PUT /endpoint/{id}][429] putEndpointIdTooManyRequests

Cette erreur signifie que l'événement de création de pod a été refusé par l'agent Cilium en raison d'une limite de débit. Pour chaque nœud, Cilium a une limite de quatre requêtes simultanées au point de terminaison PUT. Ce comportement est normal en cas de rafale de requêtes sur un nœud. L'agent Cilium doit rattraper les requêtes retardées.

Dans GKE Enterprise 1.14 et versions ultérieures, la limite de débit s'ajuste automatiquement en fonction de la capacité du nœud. Le limiteur de débit peut converger vers un nombre plus raisonnable, avec des limites de débit plus élevées pour les nœuds plus puissants.

Erreur courante : Ebpf map size is full

Dataplane v2 stocke l'état dans une carte eBFP. L'état inclut les règles de service, de suivi des connexions, d'identité du pod et de règle de réseau. Si une carte est saturée, l'agent ne peut pas insérer d'entrées, ce qui crée un écart entre le plan de contrôle et le plan de données. Par exemple, la carte de service est limitée à 64 000 entrées.

  1. Pour vérifier les entrées de map eBFP et leur taille actuelle, utilisez bpftool. L'exemple suivant vérifie les mappages de l'équilibreur de charge:

    bpftool map dump pinned \
    /sys/fs/bpf/tc/globals/cilium_lb4_services_v2 | tail -n -1
    
    bpftool map dump pinned \ /sys/fs/bpf/tc/globals/cilium_lb4_backends_v2 | tail -n -1
    
  2. Si elles approchent de la limite de 64 000, nettoyez-les. L'exemple suivant nettoie les mappages de l'équilibreur de charge:

    bpftool map dump pinned /sys/fs/bpf/tc/globals/cilium_lb4_services_v2 | \
        awk '{ print "0x"$2, "0x"$3, "0x"$4, "0x"$5, "0x"$6, "0x"$7, "0x"$8, "0x"$9, "0x"$10, "0x"$11, "0x"$12, "0x"$13}' | \
        head -n -1 | \
        xargs -L 1 bpftool map delete pinned /sys/fs/bpf/tc/globals/cilium_lb4_services_v2 key
    
    bpftool map dump pinned /sys/fs/bpf/tc/globals/cilium_lb4_backends_v2 | \
        awk '{ print "0x"$2, "0x"$3, "0x"$4, "0x"$5 }' | \
        head -n -1 | \
        xargs -L 1 bpftool map delete pinned /sys/fs/bpf/tc/globals/cilium_lb4_backends_v2 key
    
  3. Pour réinitialiser l'état dans la carte eBFP, redémarrez anetd.

Nœud non prêt en raison d'erreurs NetworkPluginNotReady

Si le pod CNI ne s'exécute pas sur le nœud, une erreur semblable à celle-ci peut s'afficher :

  "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

Le nœud peut également être dans un état non prêt, avec une erreur semblable à l'exemple suivant:

  "Network plugin not installed"

Lorsqu'un nœud est initialisé, kubelet attend que plusieurs événements se produisent avant de le marquer comme Ready. L'un des événements vérifiés par kubelet est que le plug-in CNI (Container Network Interface) est installé. Le plug-in CNI doit être installé par anetd ou Calico à l'aide d'un conteneur d'initialisation pour installer à la fois le binaire CNI et la configuration CNI dans les répertoires hôtes requis.

Pour résoudre ce problème, vérifiez pourquoi ces pods ne s'exécutent pas sur le nœud. En général, l'erreur n'est pas due à des problèmes de réseau. Ces pods s'exécutent sur le réseau hôte. Il n'y a donc aucune dépendance réseau.

  1. Vérifiez l'état du pod anetd ou calico-node. Consultez les étapes de dépannage suivantes pour déterminer la cause du problème:

    • Si le pod est à l'état Crashlooping, vérifiez les journaux pour savoir pourquoi le pod ne peut pas s'exécuter correctement.
    • Si le pod est à l'état Pending, utilisez kubectl describe et examinez les événements du pod. Par exemple, il se peut qu'il manque une ressource telle qu'un volume au pod.
    • Si le pod est à l'état Running, vérifiez les journaux et la configuration. Certaines mises en œuvre CNI offrent des options permettant de désactiver l'installation de CNI, comme dans Cilium.
    • Il existe une option de configuration dans anetd appelée custom-cni-conf. Si ce paramètre est configuré sur true, anetd n'installera pas le binaire CNI.

Nœud NON PRÊT en raison d'entrées ARP obsolètes

Il peut arriver que des entrées ARP obsolètes dans les nœuds du plan de contrôle du cluster d'administrateur entraînent une incohérence au niveau des adresses MAC. Ce problème d'adresse peut entraîner des délais avant expiration de la connexion aux adresses IP virtuelles du plan de contrôle des clusters d'utilisateurs gérés. Les délais avant expiration de la connexion peuvent entraîner le marquage des entrées ARP obsolètes du nœud comme NOT READY. Les nœuds marqués comme NOT READY peuvent bloquer les installations et les mises à niveau de clusters.

Dans ce cas, le journal kubelet du nœud contenant des entrées ARP obsolètes contient une erreur de type délai d'expiration de la session TLS handshake, comme celle-ci :

failed to get API group resources: unable to retrieve the complete list of server APIs: v1: Get "https://128.160.252.101:443/api/v1": net/http: TLS handshake timeout

Pour vérifier et résoudre le problème, procédez comme suit :

  1. Utilisez SSH pour vous connecter au nœud du plan de contrôle du cluster d'utilisateur.

  2. Vérifiez l'adresse MAC de l'interface à laquelle l'adresse VIP est associée :

    ip a | grep DEVICE_NAME: -A 6
    

    Remplacez DEVICE_NAME par le nom de l'appareil réseau pour le nœud du plan de contrôle.

  3. Utilisez SSH pour vous connecter à un nœud du plan de contrôle d'un cluster d'administrateur.

  4. Vérifiez le cache ARP du plan de contrôle du cluster d'administrateur pour l'adresse IP virtuelle du plan de contrôle du cluster d'utilisateur :

    ip n | grep VIP_ADDRESS
    

    Remplacez VIP_ADDRESS par l'adresse IP de l'adresse IP virtuelle du plan de contrôle du cluster d'utilisateur (controlPlaneVIP).

    Si les deux commandes ip renvoient une adresse MAC différente, vous êtes concerné par ce problème.

  5. Pour résoudre le problème, videz le cache ARP sur le nœud de plan de contrôle du cluster d'administrateur :

    ip n flush all
    

F5 Service ne reçoit pas de trafic

Si aucun trafic n'est transmis au service F5, suivez les étapes de dépannage suivantes:

  1. Vérifiez que chaque partition de F5 BIG-IP est configurée dans un cluster, qu'il s'agisse d'un cluster d'administrateur ou d'un cluster d'utilisateur. Si une partition est partagée par plusieurs clusters différents, vous subissez des interruptions de connexion intermittentes. Ce comportement est dû au fait que deux clusters tentent de prendre le contrôle de la même partition et de supprimer les services d'autres clusters.

  2. Vérifiez que les deux pods suivants sont en cours d'exécution. Tous les pods non exécutés indiquent une erreur:

    Load-balancer-f5
    K8s-bigip-ctlr-deployment-577d57985d-vk9wj
    

    La ressource Load-balancer-f5 appartenant à GKE Enterprise, et crée des ConfigMaps pour chaque service de type LoadBalancer. Le ConfigMap est finalement utilisé par le contrôleur bigip.

  3. Assurez-vous que le ConfigMap existe pour chaque port de chaque service. Par exemple, avec les ports suivants:

    Kube-server-443-tcp     2   31h
    Kube-server-8132-tcp        2   31h
    

    Le service kube-server doit ressembler à l'exemple suivant :

    Kube-server LoadBalancer  10.96.232.96  21.1.7.16   443:30095/TCP,8132:32424/TCP  31h
    

    La section de données du ConfigMap doit contenir le VIP et le port d'interface, comme illustré dans l'exemple suivant :

    data: '{"virtualServer":{"backend":{"serviceName":"kube-apiserver","servicePort":443,"healthMonitors":[{"protocol":"tcp","interval":5,"timeout":16}]},"frontend":{"virtualAddress":{"bindAddr":"21.1.7.16","port":443},"partition":"herc-b5bead08c95b-admin","balance":"ratio-member","mode":"tcp"}}}'
      schema: f5schemadb://bigip-virtual-server_v0.1.7.json
    
  4. Vérifiez les journaux et les métriques de votre instance BIG-IP. Si le ConfigMap est correctement configuré, mais que l'instance BIG-IP ne respecte pas la configuration, il peut s'agir d'un problème de F5. Pour les problèmes survenant dans l'instance BIG-IP, contactez l'assistance F5 pour diagnostiquer et résoudre les problèmes.

Étape suivante

Si vous avez besoin d'une aide supplémentaire, contactez Cloud Customer Care.