Partager via


Résoudre les problèmes d’épuisement des ports SNAT sur les nœuds Azure Kubernetes Service

Cet article vous aide à trouver et résoudre les problèmes de nœuds Azure Kubernetes Service (AKS) qui connaissent l’épuisement des ports SNAT (Source Network Address Translation).

Note

  • Pour résoudre les problèmes d’épuisement des ports SNAT sur les nœuds AKS dans un cluster AKS exécutant des travaux Kubernetes, effectuez les étapes suivantes uniquement lorsque les travaux s’exécutent activement sur les nœuds AKS.
  • Pour en savoir plus sur les ports SNAT et leur allocation par machine virtuelle, consultez Les ports SNAT.

Étape 1 : Localiser le nœud qui rencontre l’épuisement des ports SNAT

  1. Obtenez l’adresse IP du nœud AKS qui rencontre l’épuisement de port SNAT actif à partir de la Portail Azure.

    Pour ce faire, accédez à votre cluster AKS dans le Portail Azure, puis sélectionnez Diagnostiquer et résoudre les problèmes>>de connexion SNAT et d’allocation de port. L’onglet Connexion SNAT et Allocation de port affiche l’adresse IP privée du nœud AKS qui rencontre l’épuisement des ports SNAT.

    Capture d’écran du volet « Diagnostiquer et résoudre les problèmes ».

    Capture d’écran du volet « Problèmes de connectivité ».

  2. Connectez-vous à votre cluster AKS et utilisez l’adresse IP du nœud pour obtenir le nom du nœud en exécutant la commande suivante kubectl :

    kubectl get nodes -o wide | grep <node IP>
    

Étape 2 : Localiser le pod Linux disposant de connexions sortantes élevées

Note

  • Tcptracer est l’un des outils BPF Compiler Collection (BCC) préinstallés sur les nœuds Linux. Il vous permet de tracer les connexions établies par TCP (connect(), accept()et close()). Vous pouvez l’utiliser pour rechercher des connexions sortantes élevées à partir de l’adresse IP source et de l’espace de noms réseau (netns) d’un pod.
  • Pour accéder aux outils BCC, utilisez kubectl node-shell uniquement.
  • Toutes les commandes suivantes de cette section sont exécutées en tant qu’utilisateur racine sur un nœud Linux sur lequel les outils cci sont installés.
  1. Sur le nœud Linux qui rencontre l’épuisement des ports SNAT, installez kubectl node-shell :

    curl -LO https://github.com/kvaps/kubectl-node-shell/raw/master/kubectl-node_shell
    chmod +x ./kubectl-node_shell
    sudo mv ./kubectl-node_shell /usr/local/bin/kubectl-node_shell
    
  2. Utilisez SSH pour vous connecter au nœud qui rencontre l’épuisement des ports SNAT et utilisez-le tcptracer pour tracer les connexions établies par TCP :

    kubectl node-shell <node name>
    cd /usr/share/bcc/tools
    /usr/share/bcc/tools# python3 tcptracer -t4v
    

    Voici un exemple de sortie de commande :

    Tracing TCP established connections. Ctrl-C to end.
    TIME(ns)     TYPE         PID   COMM             IP SADDR            DADDR            SPORT  DPORT  NETNS
    0           connect      18627  curl             4  1.2.3.4           5.6.7.8          53746  80     4026532785
    3xxx9       close        18627  curl             4  1.2.3.4           5.6.7.8          53746  80     4026532785
    1xxxx4      connect      18629  curl             4  1.2.3.4           9.10.11.12       35686  80     4026532785
    2xxxx9      close        18629  curl             4  1.2.3.4           9.10.11.12       35686  80     4026532785
    4xxxx5      connect      18631  curl             4  1.2.3.4           9.10.11.12       35688  80     4026532785
    4xxxx8      close        18631  curl             4  1.2.3.4           9.10.11.12       35688  80     4026532785
    7xxxx3      connect      18633  curl             4  1.2.3.4           13.14.15.16      35690  80     4026532785
    9xxxx7      close        18633  curl             4  1.2.3.4           13.14.15.16      35690  80     4026532785
    
  3. Écrivez la sortie de la commande précédente dans un fichier journal, puis triez la sortie pour passer en revue une liste de connexions élevées :

    python3 tcptracer -t4v > log
    head -n +2 log | tail -n 1 | awk '{print "Count",$6,$10}'; awk '{print $6,$10}' log | sort | uniq -c | sort -nrk 1 | column -t
    

    Voici un exemple de sortie de commande :

    Count SADDR        NETNS
    387   1.2.3.4      4026532785
    8     11.22.33.44  4026532184
    8     55.66.77.88  4026531992
    
  4. Mappez l’adresse IP avec la plupart des connexions de la sortie précédente à un pod. S’il ne fonctionne pas, vous pouvez continuer.

  5. Notez la ou NETNS la SADDR valeur avec la plupart des connexions de la sortie précédente, puis exécutez la commande lsns suivante pour la mapper à un PID. Lsns est un outil Linux qui répertorie les espaces de noms et mappe les espaces de noms aux PID dans l’arborescence de processus Linux.

    lsns -t net
    

    Voici un exemple de sortie de commande :

    NS         TYPE NPROCS PID   USER  COMMAND
    4026532785 net  3      19832 root  bash
    
  6. Mappez le PID précédent à un processus conteneur à l’aide de pstree. Pstree est un outil Linux qui répertorie les processus dans un format d’arborescence pour la lisibilité.

    pstree -aps 19832
    

    Voici un exemple de sortie de commande :

    systemd,1
      `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
    

    Notez les cinq premiers caractères du conteneur dans -id la sortie de commande. Elle sera utilisée à l’étape 7.

  7. Mappez la valeur conteneur précédente -id à un ID POD à l’aide de crictl. Crictl fournit une interface CLI pour les runtimes de conteneur compatibles CRI.

    crictl ps -a
    

    Voici un exemple de sortie de commande :

    CONTAINER   IMAGE     CREATED      STATE     NAME    ATTEMPT    POD ID        POD
    6b5xxxxb    fbxxxxx1  6 hours ago  Running   ubuntu  0          2xxxxxxxxf    nginx
    

    Utilisez les cinq premiers caractères de la valeur conteneur précédente -id pour correspondre à un ID POD.

  8. Obtenez tous les pods en cours d’exécution sur le nœud et utilisez l’ID POD précédent pour faire correspondre le pod disposant de connexions sortantes élevées à partir de la sortie de commande :

    kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
    

Étape 3 : Rechercher toutes les connexions réseau sortantes effectuées par l’application

  1. Exécutez dans le pod identifié comme ayant des connexions sortantes élevées à l’étape 2 en utilisant l’une des commandes suivantes :

    • kubectl exec -it <pod name> -n <namespace> /bin/bash
      
    • kubectl exec -it <pod name> -n <namespace> /bin/sh
      
  2. Installez l’outil en ligne de commande netstat dans le pod en exécutant la commande suivante. Netstat est un outil de résolution des problèmes réseau pour les administrateurs uniquement.

    • Sur Debian, Ubuntu ou Linux Mint

      apt update
      apt install net-tools  
      
    • Sur RHEL, CentOS, Fedora, AlmaLinux ou Rocky Linux

      yum update
      yum install net-tools      
      
    • Sur Gentoo Linux

      emerge -a sys-apps/net-tools  
      
    • Sur Alpine Linux

      apk add net-tools    
      
    • Sur Arch Linux

      pacman -S net-tools
      
    • Sur OpenSUSE

      zypper install net-tools
      
  3. Une fois netstat installé dans le pod, exécutez la commande suivante :

    netstat -ptn | grep -i established
    

    Voici un exemple de sortie de commande :

    tcp        0      0 10.x.x.x:xxxx        20.x.x.x:443       ESTABLISHED xxxxx3/telnet
    

Dans la sortie de la commande, l’adresse locale est l’adresse IP du pod, et l’adresse étrangère est l’adresse IP à laquelle l’application se connecte. Les connexions IP publiques dans l’état ESTABLISHED sont les connexions qui utilisent SNAT. Vérifiez que vous comptez uniquement les connexions dans l’état ESTABLISHED aux adresses IP publiques et ignorez les connexions dans l’état ESTABLISHED aux adresses IP privées.

Répétez les étapes décrites dans cette section pour tous les autres pods s’exécutant sur le nœud. Le pod qui a le plus de connexions dans l’état ESTABLISHED aux adresses IP publiques héberge l’application qui provoque l’épuisement des ports SNAT sur le nœud. Collaborez avec vos développeurs d’applications pour paramétrer l’application pour améliorer les performances réseau à l’aide des recommandations mentionnées dans Concevoir des applications efficaces en matière de connexion. Après avoir implémenté les recommandations, vérifiez que vous voyez moins d’épuisement des ports SNAT.

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.