Freigeben über


Problembehandlung bei SNAT-Portausschöpfung auf Azure Kubernetes-Dienstknoten

Dieser Artikel hilft Ihnen, Azure Kubernetes Service (AKS)-Knoten zu finden und zu beheben, die die Portierung von Quellnetzwerkadressenübersetzung (Source Network Address Translation, SNAT) aufweisen.

Notiz

  • Um die SNAT-Portausschöpfung auf AKS-Knoten in einem AKS-Cluster mit Kubernetes-Aufträgen zu beheben, führen Sie die folgenden Schritte nur aus, wenn die Aufträge aktiv auf den AKS-Knoten ausgeführt werden.
  • Weitere Informationen zu SNAT-Ports und deren Zuordnung pro virtuellen Computer finden Sie unter What SNAT ports are.

Schritt 1: Suchen des Knotens, der die SNAT-Portausschöpfung erlebt

  1. Rufen Sie die IP-Adresse des AKS-Knotens ab, der eine aktive SNAT-Portausschöpfung aus dem Azure-Portal.

    Navigieren Sie dazu im Azure-Portal zu Ihrem AKS-Cluster, und wählen Sie "Diagnose and Solve problems Connectivity Issues>>SNAT connection and Port Allocation" aus. Auf der Registerkarte "SNAT-Verbindung" und "Portzuordnung " wird die private IP-Adresse des AKS-Knotens angezeigt, der SNAT-Portausschöpfungen ermöglicht.

    Screenshot des Bereichs

    Screenshot des Bereichs

  2. Stellen Sie eine Verbindung mit Ihrem AKS-Cluster her, und verwenden Sie die KNOTEN-IP-Adresse, um den Knotennamen abzurufen, indem Sie den folgenden kubectl Befehl ausführen:

    kubectl get nodes -o wide | grep <node IP>
    

Schritt 2: Suchen des Linux-Pods mit hohen ausgehenden Verbindungen

Notiz

  • Tcptracer ist eines der BPF Compiler Collection (BCC)-Tools , die auf Linux-Knoten vorinstalliert sind. Es ermöglicht Ihnen, hergestellte TCP-Verbindungen (connect(), accept()und close()) nachzuverfolgen. Sie können es verwenden, um hohe ausgehende Verbindungen aus der Quell-IP-Adresse und dem Netzwerknamespace (Netns) eines Pods zu finden.
  • Verwenden Sie nur kubectl node-shell, um auf die BCC-Tools zuzugreifen.
  • Alle folgenden Befehle in diesem Abschnitt werden als Stammbenutzer auf einem Linux-Knoten ausgeführt, auf dem die BCC-Tools installiert sind.
  1. Installieren Sie auf dem Linux-Knoten, der die SNAT-Portausschöpfung erlebt, 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. Verwenden Sie SSH, um eine Verbindung mit dem Knoten herzustellen, der SNAT-Portausschöpfung und zum Nachverfolgen von tcp eingerichteten Verbindungen verwendet tcptracer :

    kubectl node-shell <node name>
    cd /usr/share/bcc/tools
    /usr/share/bcc/tools# python3 tcptracer -t4v
    

    Beispiel für eine Befehlsausgabe:

    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. Schreiben Sie die vorherige Befehlsausgabe in eine Protokolldatei, und sortieren Sie dann die Ausgabe, um eine Liste mit hohen Verbindungen zu überprüfen:

    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
    

    Beispiel für eine Befehlsausgabe:

    Count SADDR        NETNS
    387   1.2.3.4      4026532785
    8     11.22.33.44  4026532184
    8     55.66.77.88  4026531992
    
  4. Ordnen Sie die IP-Adresse mit den meisten Verbindungen aus der vorherigen Ausgabe einem Pod zu. Wenn dies nicht funktioniert, können Sie den Vorgang fortsetzen.

  5. Notieren Sie sich den SADDR Wert NETNS mit den meisten Verbindungen aus der vorherigen Ausgabe, und führen Sie dann den folgenden lsns-Befehl aus, um ihn einer PID zuzuordnen. Lsns ist ein Linux-Tool, das Namespaces auflistet und Namespaces PIDs in der Linux-Prozessstruktur zuordnet.

    lsns -t net
    

    Beispiel für eine Befehlsausgabe:

    NS         TYPE NPROCS PID   USER  COMMAND
    4026532785 net  3      19832 root  bash
    
  6. Ordnen Sie die vorherige PID einem containerierten Prozess mithilfe von Pstree zu. Pstree ist ein Linux-Tool, das Prozesse in einem Strukturformat zur Lesbarkeit auflistet.

    pstree -aps 19832
    

    Beispiel für eine Befehlsausgabe:

    systemd,1
      `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
    

    Beachten Sie die ersten fünf Zeichen des Containers -id in der Befehlsausgabe. Sie wird in Schritt 7 verwendet.

  7. Ordnen Sie den vorherigen containerd-Wert -id einer POD-ID mithilfe von Crictl zu. Crictl stellt eine CLI für CRI-kompatible Containerlaufzeiten bereit.

    crictl ps -a
    

    Beispiel für eine Befehlsausgabe:

    CONTAINER   IMAGE     CREATED      STATE     NAME    ATTEMPT    POD ID        POD
    6b5xxxxb    fbxxxxx1  6 hours ago  Running   ubuntu  0          2xxxxxxxxf    nginx
    

    Verwenden Sie die ersten fünf Zeichen des vorherigen Containerwerts -id , um einer POD-ID zu entsprechen.

  8. Rufen Sie alle pods ab, die auf dem Knoten ausgeführt werden, und verwenden Sie die vorherige POD-ID, um dem Pod mit hohen ausgehenden Verbindungen aus der Befehlsausgabe zu entsprechen:

    kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
    

Schritt 3: Ermitteln aller ausgehenden Netzwerkverbindungen, die von der Anwendung hergestellt werden

  1. Führen Sie den Pod aus, der als hohe ausgehende Verbindungen in Schritt 2 identifiziert wird, indem Sie einen der folgenden Befehle verwenden:

    • kubectl exec -it <pod name> -n <namespace> /bin/bash
      
    • kubectl exec -it <pod name> -n <namespace> /bin/sh
      
  2. Installieren Sie das Befehlszeilentool netstat im Pod, indem Sie den folgenden Befehl ausführen. Netstat ist ein Tool zur Netzwerkproblembehandlung nur für Administratoren.

    • Unter Debian, Ubuntu oder Linux Mint

      apt update
      apt install net-tools  
      
    • Auf RHEL, CentOS, Fedora, AlmaLinux oder Rocky Linux

      yum update
      yum install net-tools      
      
    • Unter Gentoo Linux

      emerge -a sys-apps/net-tools  
      
    • Auf Alpine Linux

      apk add net-tools    
      
    • Auf Arch Linux

      pacman -S net-tools
      
    • Bei OpenSUSE

      zypper install net-tools
      
  3. Nachdem netstat im Pod installiert wurde, führen Sie den folgenden Befehl aus:

    netstat -ptn | grep -i established
    

    Beispiel für eine Befehlsausgabe:

    tcp        0      0 10.x.x.x:xxxx        20.x.x.x:443       ESTABLISHED xxxxx3/telnet
    

In der Befehlsausgabe ist die lokale Adresse die IP-Adresse des Pods, und die Fremdadresse ist die IP-Adresse, mit der die Anwendung eine Verbindung herstellt. Die öffentlichen IP-Verbindungen im ESTABLISHED Zustand sind die Verbindungen, die SNAT verwenden. Stellen Sie sicher, dass Sie nur die Verbindungen im ESTABLISHED Zustand mit öffentlichen IP-Adressen zählen und alle Verbindungen im ESTABLISHED Zustand mit privaten IP-Adressen ignorieren.

Wiederholen Sie die Schritte in diesem Abschnitt für alle anderen Pods, die auf dem Knoten ausgeführt werden. Der Pod mit den meisten Verbindungen im ESTABLISHED Zustand mit öffentlichen IP-Adressen hostet die Anwendung, die die SNAT-Portausschöpfung auf dem Knoten verursacht. Arbeiten Sie mit Ihren Anwendungsentwicklern zusammen, um die Anwendung auf eine verbesserte Netzwerkleistung zu optimieren, indem Sie die empfehlungen verwenden, die in "Entwurfsverbindungseffiziente Anwendungen" erwähnt werden. Überprüfen Sie nach der Implementierung der Empfehlungen, dass weniger SNAT-Portauslastung zu sehen ist.

Kontaktieren Sie uns für Hilfe

Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.