Rozwiązywanie problemów z wyczerpaniem portów SNAT w węzłach usługi Azure Kubernetes Service
Ten artykuł ułatwia znajdowanie i rozwiązywanie problemów z węzłami usługi Azure Kubernetes Service (AKS), które doświadczają wyczerpania portów źródłowego tłumaczenia adresów sieciowych (SNAT).
Uwaga 16.
- Aby rozwiązać problemy z wyczerpaniem portów SNAT w węzłach usługi AKS w klastrze usługi AKS z uruchomionymi zadaniami Kubernetes, wykonaj następujące kroki tylko wtedy, gdy zadania są aktywnie uruchomione w węzłach usługi AKS.
- Aby dowiedzieć się więcej o portach SNAT i ich alokacji na maszynę wirtualną, zobacz Co to są porty SNAT.
Krok 1. Lokalizowanie węzła, który doświadcza wyczerpania portów SNAT
Uzyskaj adres IP węzła usługi AKS, który doświadcza aktywnego wyczerpania portów SNAT w witrynie Azure Portal.
W tym celu przejdź do klastra usługi AKS w witrynie Azure Portal i wybierz pozycję Diagnozowanie i rozwiązywanie problemów z>łącznością połączeń>SNAT i alokacji portów. Karta Połączenie SNAT i Alokacja portów zawiera prywatny adres IP węzła usługi AKS, który doświadcza wyczerpania portów SNAT.
Połącz się z klastrem usługi AKS i użyj adresu IP węzła, aby uzyskać nazwę węzła, uruchamiając następujące
kubectl
polecenie:kubectl get nodes -o wide | grep <node IP>
Krok 2. Lokalizowanie zasobnika systemu Linux z wysokimi połączeniami wychodzącym
Uwaga 16.
- Tcptracer to jedno z narzędzi kolekcji kompilatora BPF (BCC), które są wstępnie zainstalowane w węzłach systemu Linux. Umożliwia śledzenie nawiązanych połączeń TCP (
connect()
,accept()
iclose()
). Służy do znajdowania połączeń wychodzących o wysokim poziomie z źródłowego adresu IP i przestrzeni nazw sieci (netns) zasobnika. - Aby uzyskać dostęp do narzędzi BCC, użyj tylko powłoki węzła kubectl.
- Wszystkie poniższe polecenia w tej sekcji są uruchamiane jako użytkownik główny w węźle systemu Linux z zainstalowanymi narzędziami BCC.
W węźle systemu Linux, który doświadcza wyczerpania portów SNAT, zainstaluj narzędzie 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
Użyj protokołu SSH, aby nawiązać połączenie z węzłem, który doświadcza wyczerpania portów SNAT i używa
tcptracer
go do śledzenia nawiązanych połączeń TCP:kubectl node-shell <node name> cd /usr/share/bcc/tools /usr/share/bcc/tools# python3 tcptracer -t4v
Oto przykład danych wyjściowych polecenia:
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
Zapisz dane wyjściowe poprzedniego polecenia w pliku dziennika, a następnie posortuj dane wyjściowe, aby przejrzeć listę wysokich połączeń:
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
Oto przykład danych wyjściowych polecenia:
Count SADDR NETNS 387 1.2.3.4 4026532785 8 11.22.33.44 4026532184 8 55.66.77.88 4026531992
Zamapuj adres IP z największą pulą połączeń z poprzednich danych wyjściowych na zasobnik. Jeśli to nie zadziała, możesz kontynuować.
Zanotuj
SADDR
wartość lubNETNS
z największą liczbie połączeń z poprzednich danych wyjściowych, a następnie uruchom następujące polecenie lsns , aby zamapować je na piD. Lsns to narzędzie systemu Linux, które wyświetla listę przestrzeni nazw i mapuje przestrzenie nazw na identyfikatory PID w drzewie procesów systemu Linux.lsns -t net
Oto przykład danych wyjściowych polecenia:
NS TYPE NPROCS PID USER COMMAND 4026532785 net 3 19832 root bash
Zamapuj poprzedni identyfikator PID na proces kontenerowy przy użyciu narzędzia pstree. Pstree to narzędzie systemu Linux, które wyświetla listę procesów w formacie drzewa w celu zapewnienia czytelności.
pstree -aps 19832
Oto przykład danych wyjściowych polecenia:
systemd,1 `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
Zanotuj pięć pierwszych znaków kontenera
-id
w danych wyjściowych polecenia. Zostanie on użyty w kroku 7.Zamapuj poprzednią wartość kontenera
-id
na identyfikator zasobnika przy użyciu polecenia crictl. Crictl udostępnia interfejs wiersza polecenia dla środowisk uruchomieniowych kontenerów zgodnych z cri.crictl ps -a
Oto przykład danych wyjściowych polecenia:
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD 6b5xxxxb fbxxxxx1 6 hours ago Running ubuntu 0 2xxxxxxxxf nginx
Użyj pierwszych pięciu znaków poprzedniej wartości kontenera
-id
, aby dopasować identyfikator zasobnika.Pobierz wszystkie zasobniki uruchomione w węźle i użyj poprzedniego identyfikatora zasobnika, aby dopasować go do zasobnika, który ma wysokie połączenia wychodzące z danych wyjściowych polecenia:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
Krok 3. Znajdowanie wszystkich wychodzących połączeń sieciowych wykonanych przez aplikację
Wykonaj polecenie w zasobniku, który jest identyfikowany jako o wysokich połączeniach wychodzących w kroku 2 , używając jednego z następujących poleceń:
-
kubectl exec -it <pod name> -n <namespace> /bin/bash
-
kubectl exec -it <pod name> -n <namespace> /bin/sh
-
Zainstaluj narzędzie wiersza polecenia netstat w zasobniku, uruchamiając następujące polecenie. Netstat to narzędzie do rozwiązywania problemów z siecią tylko dla administratorów.
W systemie Debian, Ubuntu lub Linux Mint
apt update apt install net-tools
W systemach RHEL, CentOS, Fedora, AlmaLinux lub Rocky Linux
yum update yum install net-tools
W usłudze Gentoo Linux
emerge -a sys-apps/net-tools
W systemie Alpine Linux
apk add net-tools
W systemie Arch Linux
pacman -S net-tools
W witrynie OpenSUSE
zypper install net-tools
Po zainstalowaniu polecenia netstat w zasobniku uruchom następujące polecenie:
netstat -ptn | grep -i established
Oto przykład danych wyjściowych polecenia:
tcp 0 0 10.x.x.x:xxxx 20.x.x.x:443 ESTABLISHED xxxxx3/telnet
W danych wyjściowych polecenia adres lokalny to adres IP zasobnika, a obcy adres to adres IP, z którym łączy się aplikacja. Publiczne połączenia IP w ESTABLISHED
stanie to połączenia korzystające z protokołu SNAT. Upewnij się, że zliczasz tylko połączenia w ESTABLISHED
stanie z publicznymi adresami IP i ignorujesz wszystkie połączenia w ESTABLISHED
stanie z prywatnymi adresami IP.
Powtórz kroki opisane w tej sekcji dla wszystkich innych zasobników uruchomionych w węźle. Zasobnik, który ma najwięcej połączeń w ESTABLISHED
stanie z publicznymi adresami IP, hostuje aplikację, która powoduje wyczerpanie portów SNAT w węźle. We współpracy z deweloperami aplikacji dostosuj aplikację w celu zwiększenia wydajności sieci, korzystając z zaleceń wymienionych w temacie Projektowanie aplikacji wydajnych pod kątem połączenia. Po zaimplementowaniu zaleceń sprawdź, czy jest mniej wyczerpania portów SNAT.
Skontaktuj się z nami, aby uzyskać pomoc
Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.