Condividi tramite


Risolvere i problemi di esaurimento delle porte SNAT nei nodi servizio Azure Kubernetes

Questo articolo illustra come trovare e risolvere i problemi relativi ai nodi servizio Azure Kubernetes del servizio Azure Kubernetes che riscontrano l'esaurimento delle porte SNAT (Source Network Address Translation).

Note

Passaggio 1: Individuare il nodo in cui si verifica l'esaurimento delle porte SNAT

  1. Ottenere l'indirizzo IP del nodo del servizio Azure Kubernetes che sperimenta l'esaurimento delle porte SNAT attive dal portale di Azure.

    A tale scopo, passare al cluster del servizio Azure Kubernetes nel portale di Azure e selezionare Diagnostica e risoluzione dei problemi>di connettività Problemi>di connettività Connessione SNAT e Allocazione porte. Nella scheda SNAT connection and Port Allocation (Allocazione porte e connessione SNAT) viene visualizzato l'indirizzo IP privato del nodo servizio Azure Kubernetes che presenta l'esaurimento delle porte SNAT.

    Screenshot del riquadro

    Screenshot del riquadro

  2. Connettersi al cluster del servizio Azure Kubernetes e usare l'indirizzo IP del nodo per ottenere il nome del nodo eseguendo il comando seguente kubectl :

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

Passaggio 2: Individuare il pod Linux con connessioni in uscita elevate

Note

  • Tcptracer è uno degli strumenti BPF Compiler Collection (BCC) preinstallati nei nodi Linux. Consente di tracciare le connessioni TCP stabilite (connect(), accept()e close()). È possibile usarlo per trovare connessioni in uscita elevate dall'indirizzo IP di origine e dallo spazio dei nomi di rete (netns) di un pod.
  • Per accedere agli strumenti BCC, usare solo kubectl node-shell.
  • Tutti i comandi seguenti in questa sezione vengono eseguiti come utente radice in un nodo Linux in cui sono installati gli strumenti BCC.
  1. Nel nodo Linux in cui si verifica l'esaurimento delle porte SNAT installare 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. Usare SSH per connettersi al nodo che riscontra l'esaurimento delle porte SNAT e usare tcptracer per tracciare le connessioni stabilite da TCP:

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

    Ecco un esempio di output del comando:

    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. Scrivere l'output del comando precedente in un file di log e quindi ordinare l'output per esaminare un elenco di connessioni elevate:

    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
    

    Ecco un esempio di output del comando:

    Count SADDR        NETNS
    387   1.2.3.4      4026532785
    8     11.22.33.44  4026532184
    8     55.66.77.88  4026531992
    
  4. Eseguire il mapping dell'indirizzo IP con la maggior parte delle connessioni dell'output precedente a un pod. Se non funziona, è possibile continuare.

  5. Prendere nota del SADDR valore o NETNS con la maggior parte delle connessioni dell'output precedente e quindi eseguire il comando lsns seguente per eseguirne il mapping a un PID. Lsns è uno strumento Linux che elenca gli spazi dei nomi e esegue il mapping degli spazi dei nomi ai PID nell'albero dei processi Linux.

    lsns -t net
    

    Ecco un esempio di output del comando:

    NS         TYPE NPROCS PID   USER  COMMAND
    4026532785 net  3      19832 root  bash
    
  6. Eseguire il mapping del PID precedente a un processo in contenitori usando pstree. Pstree è uno strumento Linux che elenca i processi in un formato albero per la leggibilità.

    pstree -aps 19832
    

    Ecco un esempio di output del comando:

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

    Si notino i primi cinque caratteri del contenitore -id nell'output del comando. Verrà usato nel passaggio 7.

  7. Eseguire il mapping del valore contenitore -id precedente a un ID POD usando crictl. Crictl fornisce un'interfaccia della riga di comando per i runtime di contenitori compatibili con CRI.

    crictl ps -a
    

    Ecco un esempio di output del comando:

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

    Usare i primi cinque caratteri del valore contenitore -id precedente per trovare una corrispondenza con un ID POD.

  8. Ottenere tutti i pod in esecuzione nel nodo e usare l'ID POD precedente per trovare la corrispondenza con il pod con connessioni in uscita elevate dall'output del comando:

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

Passaggio 3: Trovare tutte le connessioni di rete in uscita effettuate dall'applicazione

  1. Eseguire nel pod identificato come avere connessioni in uscita elevate nel passaggio 2 usando uno dei comandi seguenti:

    • kubectl exec -it <pod name> -n <namespace> /bin/bash
      
    • kubectl exec -it <pod name> -n <namespace> /bin/sh
      
  2. Installare lo strumento da riga di comando netstat nel pod eseguendo il comando seguente. Netstat è uno strumento di risoluzione dei problemi di rete solo per gli amministratori.

    • In Debian, Ubuntu o Linux Mint

      apt update
      apt install net-tools  
      
    • In RHEL, CentOS, Fedora, AlmaLinux o Rocky Linux

      yum update
      yum install net-tools      
      
    • In Gentoo Linux

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

      apk add net-tools    
      
    • In Arch Linux

      pacman -S net-tools
      
    • In OpenSUSE

      zypper install net-tools
      
  3. Dopo aver installato netstat nel pod, eseguire il comando seguente:

    netstat -ptn | grep -i established
    

    Ecco un esempio di output del comando:

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

Nell'output del comando l'indirizzo locale è l'indirizzo IP del pod e l'indirizzo esterno è l'indirizzo IP a cui si connette l'applicazione. Le connessioni IP pubbliche nello ESTABLISHED stato sono le connessioni che usano SNAT. Assicurarsi di contare solo le connessioni nello ESTABLISHED stato agli indirizzi IP pubblici e ignorare le connessioni nello ESTABLISHED stato agli indirizzi IP privati.

Ripetere i passaggi descritti in questa sezione per tutti gli altri pod in esecuzione nel nodo. Il pod con la maggior parte delle connessioni nello ESTABLISHED stato agli indirizzi IP pubblici ospita l'applicazione che causa l'esaurimento delle porte SNAT nel nodo. Collaborare con gli sviluppatori di applicazioni per ottimizzare l'applicazione per migliorare le prestazioni di rete usando le raccomandazioni indicate in Progettare applicazioni efficienti per la connessione. Dopo aver implementato le raccomandazioni, verificare che venga visualizzato un minor esaurimento delle porte SNAT.

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.