Problemen met SNAT-poortuitputting op Azure Kubernetes Service-knooppunten oplossen
Dit artikel helpt u bij het vinden en oplossen van problemen met AKS-knooppunten (Azure Kubernetes Service) die te maken hebben met SNAT-poortuitputting (Source Network Address Translation).
Notitie
- Als u problemen met SNAT-poortuitputting op AKS-knooppunten in een AKS-cluster met Kubernetes-taken wilt oplossen, moet u de volgende stappen alleen uitvoeren wanneer de taken actief worden uitgevoerd op de AKS-knooppunten.
- Zie wat SNAT-poorten zijn voor meer informatie over SNAT-poorten en hun toewijzing per virtuele machine.
Stap 1: Zoek het knooppunt dat SNAT-poortuitputting ondervindt
Haal het IP-adres op van het AKS-knooppunt dat te maken heeft met actieve SNAT-poortuitputting vanuit Azure Portal.
Hiervoor gaat u naar uw AKS-cluster in Azure Portal en selecteert u Connectiviteitsproblemen>met>de SNAT-verbinding en poorttoewijzing vaststellen en oplossen. Op het tabblad SNAT-verbinding en poorttoewijzing wordt het privé-IP-adres van het AKS-knooppunt weergegeven dat te maken heeft met uitputting van de SNAT-poort.
Maak verbinding met uw AKS-cluster en gebruik het IP-adres van het knooppunt om de naam van het knooppunt op te halen door de volgende
kubectl
opdracht uit te voeren:kubectl get nodes -o wide | grep <node IP>
Stap 2: zoek de Linux-pod met hoge uitgaande verbindingen
Notitie
- Tcptracer is een van de BCC-hulpprogramma's (BPF Compiler Collection) die vooraf zijn geïnstalleerd op Linux-knooppunten. Hiermee kunt u tot stand gebrachte TCP-verbindingen traceren (
connect()
,accept()
enclose()
). U kunt deze gebruiken om hoge uitgaande verbindingen te vinden vanuit het IP-bronadres en de netwerknaamruimte (netns) van een pod. - Gebruik alleen kubectl node-shell om toegang te krijgen tot de BCC-hulpprogramma's.
- Alle volgende opdrachten in deze sectie worden uitgevoerd als hoofdgebruiker op een Linux-knooppunt waarop de BCC-hulpprogramma's zijn geïnstalleerd.
Installeer op het Linux-knooppunt dat SNAT-poortuitputting ondervindt 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
Gebruik SSH om verbinding te maken met het knooppunt dat SNAT-poortuitputting ondervindt en gebruikt
tcptracer
om tot stand gebrachte TCP-verbindingen te traceren:kubectl node-shell <node name> cd /usr/share/bcc/tools /usr/share/bcc/tools# python3 tcptracer -t4v
Hier volgt een voorbeeld van de uitvoer van een opdracht:
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
Schrijf de vorige opdrachtuitvoer naar een logboekbestand en sorteer vervolgens de uitvoer om een lijst met hoge verbindingen te controleren:
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
Hier volgt een voorbeeld van de uitvoer van een opdracht:
Count SADDR NETNS 387 1.2.3.4 4026532785 8 11.22.33.44 4026532184 8 55.66.77.88 4026531992
Wijs het IP-adres toe met de meeste verbindingen van de vorige uitvoer naar een pod. Als dit niet werkt, kunt u doorgaan.
Noteer de
SADDR
ofNETNS
waarde met de meeste verbindingen uit de vorige uitvoer en voer vervolgens de volgende lsns-opdracht uit om deze toe te wijzen aan een PID. Lsns is een Linux-hulpprogramma waarin naamruimten worden vermeld en naamruimten worden toegewezen aan PID's in de Linux-processtructuur.lsns -t net
Hier volgt een voorbeeld van de uitvoer van een opdracht:
NS TYPE NPROCS PID USER COMMAND 4026532785 net 3 19832 root bash
Wijs de vorige PID toe aan een containerproces met behulp van pstree. Pstree is een Linux-hulpprogramma dat processen in een structuurindeling vermeldt voor leesbaarheid.
pstree -aps 19832
Hier volgt een voorbeeld van de uitvoer van een opdracht:
systemd,1 `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
Noteer de eerste vijf tekens van de container in
-id
de opdrachtuitvoer. Deze wordt gebruikt in stap 7.Wijs de vorige containerwaarde
-id
toe aan een POD-id met behulp van crictl. Crictl biedt een CLI voor CRI-compatibele containerruntimes.crictl ps -a
Hier volgt een voorbeeld van de uitvoer van een opdracht:
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD 6b5xxxxb fbxxxxx1 6 hours ago Running ubuntu 0 2xxxxxxxxf nginx
Gebruik de eerste vijf tekens van de vorige containerwaarde
-id
om overeen te komen met een POD-id.Haal alle pods op het knooppunt op en gebruik de vorige POD-id om overeen te komen met de pod met hoge uitgaande verbindingen vanuit de opdrachtuitvoer:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
Stap 3: Alle uitgaande netwerkverbindingen zoeken die door de toepassing zijn gemaakt
Voer een van de volgende opdrachten uit in de pod die is geïdentificeerd als een groot aantal uitgaande verbindingen in stap 2 :
-
kubectl exec -it <pod name> -n <namespace> /bin/bash
-
kubectl exec -it <pod name> -n <namespace> /bin/sh
-
Installeer het opdrachtregelprogramma netstat in de pod door de volgende opdracht uit te voeren. Netstat is alleen een hulpprogramma voor netwerkproblemen voor beheerders.
Op Debian, Ubuntu of Linux Mint
apt update apt install net-tools
Op RHEL, CentOS, Fedora, AlmaLinux of Rocky Linux
yum update yum install net-tools
Op Gentoo Linux
emerge -a sys-apps/net-tools
In Alpine Linux
apk add net-tools
On Arch Linux
pacman -S net-tools
Op OpenSUSE
zypper install net-tools
Nadat netstat is geïnstalleerd in de pod, voert u de volgende opdracht uit:
netstat -ptn | grep -i established
Hier volgt een voorbeeld van de uitvoer van een opdracht:
tcp 0 0 10.x.x.x:xxxx 20.x.x.x:443 ESTABLISHED xxxxx3/telnet
In de uitvoer van de opdracht is het lokale adres het IP-adres van de pod en het refererende adres is het IP-adres waarmee de toepassing verbinding maakt. De openbare IP-verbindingen in de ESTABLISHED
status zijn de verbindingen die gebruikmaken van SNAT. Zorg ervoor dat u alleen de verbindingen in de ESTABLISHED
status met openbare IP-adressen telt en eventuele verbindingen met ESTABLISHED
privé-IP-adressen negeert.
Herhaal de stappen in deze sectie voor alle andere pods die op het knooppunt worden uitgevoerd. De pod met de meeste verbindingen in de ESTABLISHED
status met openbare IP-adressen fungeert als host voor de toepassing die SNAT-poortuitputting op het knooppunt veroorzaakt. Werk samen met uw toepassingsontwikkelaars om de toepassing af te stemmen op verbeterde netwerkprestaties met behulp van de aanbevelingen die worden genoemd in verbindingsefficiënte toepassingen ontwerpen. Controleer na het implementeren van de aanbevelingen of u minder SNAT-poortuitputting ziet.
Contacteer ons voor hulp
Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.