Udostępnij za pośrednictwem


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

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

    Zrzut ekranu przedstawiający okienko

    Zrzut ekranu przedstawiający okienko

  2. 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()i close()). 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.
  1. 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
    
  2. 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
    
  3. 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
    
  4. 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ć.

  5. Zanotuj SADDR wartość lub NETNS 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
    
  6. 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.

  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.

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

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