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
- Per risolvere i problemi di esaurimento delle porte SNAT nei nodi del servizio Azure Kubernetes in un cluster del servizio Azure Kubernetes che esegue processi Kubernetes, seguire questa procedura solo quando i processi sono in esecuzione attivamente nei nodi del servizio Azure Kubernetes.
- Per altre informazioni sulle porte SNAT e sulla relativa allocazione per macchina virtuale, vedere Informazioni sulle porte SNAT.
Passaggio 1: Individuare il nodo in cui si verifica l'esaurimento delle porte SNAT
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.
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()
eclose()
). È 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.
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
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
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
Eseguire il mapping dell'indirizzo IP con la maggior parte delle connessioni dell'output precedente a un pod. Se non funziona, è possibile continuare.
Prendere nota del
SADDR
valore oNETNS
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
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.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.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
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
-
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
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.