Solución de problemas de agotamiento de puertos SNAT en nodos de Azure Kubernetes Service
Este artículo le ayuda a encontrar y solucionar problemas de nodos de Azure Kubernetes Service (AKS) que experimentan el agotamiento de puertos de traducción de direcciones de red de origen (SNAT).
Nota:
- Para solucionar problemas de agotamiento de puertos SNAT en nodos de AKS en un clúster de AKS que ejecuta trabajos de Kubernetes, realice los pasos siguientes solo cuando los trabajos se ejecutan activamente en los nodos de AKS.
- Para más información sobre los puertos SNAT y su asignación por máquina virtual, consulte ¿Qué son los puertos SNAT?
Paso 1: Buscar el nodo que experimenta el agotamiento de puertos SNAT
Obtenga la dirección IP del nodo de AKS que experimenta el agotamiento de puertos SNAT activos desde Azure Portal.
Para ello, vaya al clúster de AKS en Azure Portal y seleccione Diagnosticar y resolver problemas>de conectividad>problemas de conexión SNAT y asignación de puertos. La pestaña Conexión SNAT y Asignación de puertos muestra la dirección IP privada del nodo de AKS que experimenta agotamiento de puertos SNAT.
Conéctese al clúster de AKS y use la dirección IP del nodo para obtener el nombre del nodo mediante la ejecución del comando siguiente
kubectl
:kubectl get nodes -o wide | grep <node IP>
Paso 2: Busque el pod de Linux que tiene conexiones salientes elevadas
Nota:
- Tcptracer es una de las herramientas de recopilación de compilador (BCC) de BPF que están preinstaladas en nodos de Linux. Permite realizar un seguimiento de las conexiones establecidas por TCP (
connect()
,accept()
, yclose()
). Puede usarlo para buscar conexiones salientes altas desde la dirección IP de origen y el espacio de nombres de red (netns) de un pod. - Para acceder a las herramientas de BCC, use solo kubectl node-shell.
- Todos los comandos siguientes de esta sección se ejecutan como el usuario raíz en un nodo de Linux que tiene instaladas las herramientas BCC.
En el nodo de Linux que experimenta agotamiento de puertos SNAT, instale 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
Use SSH para conectarse al nodo que experimenta el agotamiento de puertos SNAT y usar
tcptracer
para realizar un seguimiento de las conexiones establecidas por TCP:kubectl node-shell <node name> cd /usr/share/bcc/tools /usr/share/bcc/tools# python3 tcptracer -t4v
He aquí un ejemplo de salida de comandos:
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
Escriba la salida del comando anterior en un archivo de registro y, a continuación, ordene la salida para revisar una lista de conexiones altas:
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
He aquí un ejemplo de salida de comandos:
Count SADDR NETNS 387 1.2.3.4 4026532785 8 11.22.33.44 4026532184 8 55.66.77.88 4026531992
Asigne la dirección IP con la mayoría de las conexiones de la salida anterior a un pod. Si no funciona, puede continuar.
Anote el
SADDR
valor oNETNS
con la mayoría de las conexiones de la salida anterior y, a continuación, ejecute el siguiente comando lsns para asignarlo a un PID. Lsns es una herramienta de Linux que enumera los espacios de nombres y asigna espacios de nombres a LOS PID en el árbol de procesos de Linux.lsns -t net
He aquí un ejemplo de salida de comandos:
NS TYPE NPROCS PID USER COMMAND 4026532785 net 3 19832 root bash
Asigne el PID anterior a un proceso contenedor mediante pstree. Pstree es una herramienta de Linux que enumera los procesos en un formato de árbol para mejorar la legibilidad.
pstree -aps 19832
He aquí un ejemplo de salida de comandos:
systemd,1 `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
Anote los cinco primeros caracteres del contenedor
-id
en la salida del comando. Se usará en el paso 7.Asigne el valor contenedor anterior
-id
a un id. de POD mediante crictl. Crictl proporciona una CLI para entornos de ejecución de contenedor compatibles con CRI.crictl ps -a
He aquí un ejemplo de salida de comandos:
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD 6b5xxxxb fbxxxxx1 6 hours ago Running ubuntu 0 2xxxxxxxxf nginx
Use los cinco primeros caracteres del valor contenedor anterior
-id
para que coincida con un id. de POD.Obtenga todos los pods que se ejecutan en el nodo y use el identificador de POD anterior para que coincida con el pod que tiene conexiones salientes altas desde la salida del comando:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
Paso 3: Buscar todas las conexiones de red salientes realizadas por la aplicación
Ejecute en el pod que se identifica como que tiene conexiones salientes elevadas en el paso 2 mediante uno de los siguientes comandos:
-
kubectl exec -it <pod name> -n <namespace> /bin/bash
-
kubectl exec -it <pod name> -n <namespace> /bin/sh
-
Ejecute el siguiente comando para instalar la herramienta de línea de comandos netstat en el pod. Netstat es una herramienta de solución de problemas de red solo para administradores.
En Debian, Ubuntu o Linux Mint
apt update apt install net-tools
En RHEL, CentOS, Fedora, AlmaLinux o Rocky Linux
yum update yum install net-tools
En Gentoo Linux
emerge -a sys-apps/net-tools
En Alpine Linux
apk add net-tools
En Arch Linux
pacman -S net-tools
En OpenSUSE
zypper install net-tools
Una vez instalado netstat en el pod, ejecute el siguiente comando:
netstat -ptn | grep -i established
He aquí un ejemplo de salida de comandos:
tcp 0 0 10.x.x.x:xxxx 20.x.x.x:443 ESTABLISHED xxxxx3/telnet
En la salida del comando, la dirección local es la dirección IP del pod y la dirección externa es la dirección IP a la que se conecta la aplicación. Las conexiones IP públicas en el ESTABLISHED
estado son las conexiones que usan SNAT. Asegúrese de contar solo las conexiones en el ESTABLISHED
estado a direcciones IP públicas y omitir las conexiones del ESTABLISHED
estado a direcciones IP privadas.
Repita los pasos de esta sección para todos los demás pods que se ejecutan en el nodo. El pod que tiene la mayoría de las conexiones del ESTABLISHED
estado a direcciones IP públicas hospeda la aplicación que provoca el agotamiento de puertos SNAT en el nodo. Trabaje con los desarrolladores de aplicaciones para optimizar la aplicación para mejorar el rendimiento de la red mediante las recomendaciones mencionadas en Diseño de aplicaciones eficientes para la conexión. Después de implementar las recomendaciones, compruebe que ve menos agotamiento de puertos SNAT.
Ponte en contacto con nosotros para obtener ayuda
Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.