Delen via


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

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

    Schermopname van het deelvenster Problemen vaststellen en oplossen.

    Schermopname van het deelvenster Connectiviteitsproblemen.

  2. 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()en close()). 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.
  1. 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
    
  2. 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
    
  3. 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
    
  4. Wijs het IP-adres toe met de meeste verbindingen van de vorige uitvoer naar een pod. Als dit niet werkt, kunt u doorgaan.

  5. Noteer de SADDR of NETNS 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
    
  6. 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.

  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.

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

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