Felsöka SNAT-portöverbelastning på Azure Kubernetes Service-noder
Den här artikeln hjälper dig att hitta och felsöka Azure Kubernetes Service-noder (AKS) som upplever SNAT-portöversättning (Source Network Address Translation).
Kommentar
- Om du vill felsöka SNAT-portöverbelastning på AKS-noder i ett AKS-kluster som kör Kubernetes-jobb utför du endast följande steg när jobben körs aktivt på AKS-noderna.
- Mer information om SNAT-portar och deras allokering per virtuell dator finns i Vad SNAT-portar är.
Steg 1: Leta upp noden som upplever SNAT-portöverbelastning
Hämta IP-adressen för AKS-noden som upplever aktiv SNAT-portöverbelastning från Azure Portal.
Det gör du genom att gå till ditt AKS-kluster i Azure Portal och välja Diagnostisera och lösa problem>Med anslutningsproblem>SNAT-anslutning och Portallokering. Fliken SNAT-anslutning och Portallokering visar den privata IP-adressen för AKS-noden som upplever SNAT-portöverbelastning.
Anslut till DITT AKS-kluster och använd nodens IP-adress för att hämta nodnamnet genom att köra följande
kubectl
kommando:kubectl get nodes -o wide | grep <node IP>
Steg 2: Leta upp Linux-podden som har höga utgående anslutningar
Kommentar
- Tcptracer är ett av BCC-verktygen (BPF Compiler Collection) som är förinstallerade på Linux-noder. Det gör att du kan spåra TCP-etablerade anslutningar (
connect()
,accept()
, ochclose()
). Du kan använda den för att hitta högutgående anslutningar från källans IP-adress och nätverksnamnområde (netns) för en podd. - Om du vill komma åt BCC-verktygen använder du endast kubectl node-shell.
- Alla följande kommandon i det här avsnittet körs som rotanvändare på en Linux-nod som har BCC-verktygen installerade.
Installera kubectl node-shell på den Linux-nod som upplever SNAT-portöverbelastning:
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
Använd SSH för att ansluta till noden som upplever SNAT-portöverbelastning och som används
tcptracer
för att spåra TCP-etablerade anslutningar:kubectl node-shell <node name> cd /usr/share/bcc/tools /usr/share/bcc/tools# python3 tcptracer -t4v
Här är ett exempel på kommandoutdata:
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
Skriv föregående kommandoutdata till en loggfil och sortera sedan utdata för att granska en lista med höga anslutningar:
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
Här är ett exempel på kommandoutdata:
Count SADDR NETNS 387 1.2.3.4 4026532785 8 11.22.33.44 4026532184 8 55.66.77.88 4026531992
Mappa IP-adressen med flest anslutningar från föregående utdata till en podd. Om det inte fungerar kan du fortsätta.
Observera värdet
SADDR
ellerNETNS
med flest anslutningar från föregående utdata och kör sedan följande lsns-kommando för att mappa det till en PID. Lsns är ett Linux-verktyg som listar namnområden och mappar namnområden till PID:er i Linux-processträdet.lsns -t net
Här är ett exempel på kommandoutdata:
NS TYPE NPROCS PID USER COMMAND 4026532785 net 3 19832 root bash
Mappa den tidigare PID:en till en containerprocess med hjälp av pstree. Pstree är ett Linux-verktyg som visar processer i ett trädformat för läsbarhet.
pstree -aps 19832
Här är ett exempel på kommandoutdata:
systemd,1 `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
Observera de första fem tecknen i containern
-id
i kommandoutdata. Den används i steg 7.Mappa det tidigare containervärdet
-id
till ett POD-ID med hjälp av crictl. Crictl tillhandahåller en CLI för CRI-kompatibla containerkörningar.crictl ps -a
Här är ett exempel på kommandoutdata:
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD 6b5xxxxb fbxxxxx1 6 hours ago Running ubuntu 0 2xxxxxxxxf nginx
Använd de första fem tecknen i det tidigare containervärdet
-id
för att matcha ett POD-ID.Hämta alla poddar som körs på noden och använd det tidigare POD-ID:t för att matcha podden som har höga utgående anslutningar från kommandoutdata:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
Steg 3: Hitta alla utgående nätverksanslutningar som görs av programmet
Kör till podden som identifieras ha höga utgående anslutningar i steg 2 med något av följande kommandon:
-
kubectl exec -it <pod name> -n <namespace> /bin/bash
-
kubectl exec -it <pod name> -n <namespace> /bin/sh
-
Installera kommandoradsverktyget netstat i podden genom att köra följande kommando. Netstat är endast ett verktyg för nätverksfelsökning för administratörer.
På Debian, Ubuntu eller Linux Mint
apt update apt install net-tools
På RHEL, CentOS, Fedora, AlmaLinux eller Rocky Linux
yum update yum install net-tools
På Gentoo Linux
emerge -a sys-apps/net-tools
På Alpine Linux
apk add net-tools
På Arch Linux
pacman -S net-tools
På OpenSUSE
zypper install net-tools
När netstat har installerats i podden kör du följande kommando:
netstat -ptn | grep -i established
Här är ett exempel på kommandoutdata:
tcp 0 0 10.x.x.x:xxxx 20.x.x.x:443 ESTABLISHED xxxxx3/telnet
I kommandoutdata är den lokala adressen poddens IP-adress och den externa adressen är den IP-adress som programmet ansluter till. De offentliga IP-anslutningarna i ESTABLISHED
tillståndet är de anslutningar som använder SNAT. Se till att du bara räknar anslutningarna i ESTABLISHED
tillståndet till offentliga IP-adresser och ignorera eventuella anslutningar i tillståndet ESTABLISHED
till privata IP-adresser.
Upprepa stegen i det här avsnittet för alla andra poddar som körs på noden. Den podd som har flest anslutningar i ESTABLISHED
tillståndet till offentliga IP-adresser är värd för programmet som orsakar SNAT-portöverbelastning på noden. Arbeta med programutvecklare för att finjustera programmet för bättre nätverksprestanda med hjälp av rekommendationerna i Designa anslutningseffektiva program. När du har implementerat rekommendationerna kontrollerar du att du ser mindre SNAT-portöverbelastning.
Kontakta oss för att få hjälp
Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.