Compartir a través de


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

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

    Captura de pantalla del panel

    Captura de pantalla del panel

  2. 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(), y close()). 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.
  1. 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
    
  2. 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
    
  3. 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
    
  4. Asigne la dirección IP con la mayoría de las conexiones de la salida anterior a un pod. Si no funciona, puede continuar.

  5. Anote el SADDR valor o NETNS 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
    
  6. 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.

  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.

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

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