Dela via


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

  1. 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.

    Skärmbild av fönstret Diagnostisera och lösa problem.

    Skärmbild av fönstret Anslutningsproblem.

  2. 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(), och close()). 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.
  1. 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
    
  2. 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
    
  3. 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
    
  4. Mappa IP-adressen med flest anslutningar från föregående utdata till en podd. Om det inte fungerar kan du fortsätta.

  5. Observera värdet SADDR eller NETNS 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
    
  6. 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.

  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.

  8. 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

  1. 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
      
  2. 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
      
  3. 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.