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
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.
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()
undclose()
) 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.
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
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
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
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.
Notieren Sie sich den
SADDR
WertNETNS
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
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.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.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
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
-
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
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.