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
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.
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()
etclose()
). 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.
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
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
É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
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.
Notez la ou
NETNS
laSADDR
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
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.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.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
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
-
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
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.