Volver al blog

Cómo solucionar problemas e inspeccionar las redes de Kubernetes

Cómo solucionar problemas e inspeccionar las redes de Kubernetes

Kubernetes es una herramienta de código abierto que es crucial en la orquestación de contenedores. Kubernetes ayuda a orquestar y gestionar clústeres a escala en varios entornos de nube o incluso en servidores locales. Un clúster es un conjunto de hosts destinados a ejecutar aplicaciones y servicios en contenedores. Un clúster necesita un mínimo de dos nodos para funcionar – un nodo maestro y un nodo de trabajo. Puede escalar su infraestructura de Kubernetes agregando más nodos de trabajo. Un nodo maestro y sus nodos de trabajo deben poder comunicarse a través de una red para que la infraestructura funcione. Para obtener una descripción general de las características más importantes de Kubernetes, siga nuestro tutorial sobre Conociendo Kubernetes.

En este tutorial, le mostraremos varias herramientas y técnicas para ayudar con la inspección y resolución de problemas de red en Kubernetes.

Requisitos previos

  • Para seguir este tutorial, debe tener un clúster de Kubernetes. Tenemos un tutorial que explica Cómo instalar y usar Kubernetes en Ubuntu 20.04 que puede guiarlo a través de la configuración de un clúster básico para la demostración.

  • También debe tener kubectl instalado localmente. Dependiendo de su entorno local, siga los documentos oficiales sobre la instalación de herramientas de Kubernetes. El kubectl debe estar configurado para conectarse a su clúster. Explicaremos esto más adelante en la sección de abajo.

Ejecutaremos varios comandos tanto localmente como en el nodo de Kubernetes. ¡Comencemos!

Configuración de kubectl local para conectarse a un clúster remoto de Kubernetes

Comencemos instalando kubectl. Nuestro entorno local ejecuta Ubuntu, siga este enlace si está ejecutando un entorno local diferente. Para instalar las herramientas kubectl en un entorno local Ubuntu/Debian con el gestor de paquetes apt, ejecute los siguientes comandos para actualizar el repositorio apt e instalar los paquetes necesarios:

A continuación, ejecute el siguiente comando para descargar la clave de firma pública de Google Cloud:

Luego, agregue el repositorio apt de Kubernetes:

Después de eso, actualice el índice apt e instale kubectl con el siguiente comando:

Luego, verifique que kubectl esté instalado comprobando la versión con el siguiente comando:

Aquí está la salida si acaba de instalar kubectl localmente:

kubectl version

En la captura de pantalla anterior, kubectl está intentando conectarse al clúster local de Kubernetes. Sin embargo, está fallando porque aún no tenemos un clúster de Kubernetes ejecutándose en nuestra máquina local.

Para conectarse al clúster remoto de Kubernetes, primero descargará las credenciales de Kubernetes del clúster remoto. Aquí hay un comando para copiar las credenciales desde el nodo maestro:

Reemplace las partes resaltadas con su usuario ssh y la IP pública del nodo maestro. Una vez que las credenciales hayan terminado de descargarse, cópielas en su directorio de inicio:

Eso es todo. Su kubectl local debería poder conectarse y emitir comandos en su clúster remoto de Kubernetes. Para confirmar que su kubectl local está conectado al clúster remoto, verifique nuevamente con el comando de versión:

Aquí está la salida, que muestra una conexión exitosa:

kubectl version json

Opcionalmente, puede ejecutar el get nodes de la siguiente manera:

kubectl get nodes

Obtener la IP de clúster de un Pod

Puede obtener la IP de clúster de un Pod ejecutando el comando kubectl get pod en su máquina local. Para listar más información, como el nodo que aloja el pod y la IP de clúster del pod, añada la bandera -o wide al comando:

Aquí está la salida de nuestro clúster de Kubernetes. En el tutorial de requisitos previos habíamos realizado un despliegue de servidor web Nginx, como puede ver:

kubectl get pod -o wide

La columna IP muestra la dirección IP interna de los pods individuales. Si el pod que está buscando no aparece en la lista, podría estar en un espacio de nombres diferente. Puede ejecutar el siguiente comando para listar los pods en todos los espacios de nombres:

Obtener la dirección IP de un Servicio

También puede obtener la dirección IP de un Servicio en su clúster. Al añadir la bandera --all-namespaces , obtendrá todos los servicios que se ejecutan en el clúster:

La salida del comando anterior es la siguiente. La IP del Servicio está en la columna cluster-ip :

kubectl get svc

Obtener y acceder a los espacios de nombres de red de los Pods

Cada pod de Kubernetes tiene un espacio de nombres de red asignado. Los espacios de nombres de red, también conocidos como netns, son bibliotecas de red nativas en Linux que proporcionan aislamiento entre dispositivos de red.

Para comprobar la resolución de DNS o la conectividad de red general, puede ejecutar comandos dentro del espacio de nombres de red de un pod. Para lograr esto, comience buscando el ID de proceso de uno de los contenedores de un pod. Puede hacerlo fácilmente en Docker utilizando comandos específicos de Docker. El primer comando enumera los contenedores que se ejecutan en un nodo. Inicie sesión en uno de sus nodos de trabajo y ejecute el siguiente comando:

docker ps

En la salida, nos interesa la columna de ID de contenedor o de nombres (Names). Observe el contenedor Nginx que desplegamos en el tutorial de requisitos previos Cómo instalar y usar Kubernetes en Ubuntu 20.04.

A continuación, copie el ID o el nombre del contenedor, ya que lo utilizaremos en el siguiente comando para buscar el ID de proceso:

Reemplace la parte resaltada con el valor que copió del comando anterior. A continuación se muestra la salida que obtuvimos, que es el ID de proceso:

docker inspect

Ahora que tenemos un ID de proceso, podemos usarlo para ejecutar el comando nsenter dentro del espacio de nombres de red del proceso:

Reemplace la parte resaltada con el ID de proceso que obtuvo en el comando anterior. Luego, en lugar de ip addr, puede colocar cualquier comando que desee ejecutar dentro del espacio de nombres de red del pod. También puede ejecutarlo con sudo en caso de que obtenga un error de permiso denegado.

El comando nsenter le permite ejecutar una gama más amplia de comandos disponibles en un nodo, a diferencia de usar docker exec que solo lo limita a los comandos instalados dentro del contenedor.

Recuperar la interfaz Ethernet virtual de un Pod

Un espacio de nombres de red en un pod se comunica con el netns raíz del nodo a través de una tubería ethernet virtual. En el lado del nodo, esta tubería aparece como un dispositivo cuyo nombre comienza con veth y termina en un identificador único, como veth742f721 o veth90. Mientras que dentro del pod, la tubería se identifica como eth0.

Es posible que desee saber qué dispositivo veth está emparejado con qué pod. Puede comenzar enumerando todos los dispositivos de red en el nodo, luego enumerar todos los dispositivos en la red del pod. Para identificar qué dispositivo veth está emparejado con un pod en particular, puede correlacionar los números de dispositivo entre las dos listas.

Use el comando nsenter para ejecutar el comando ip addr en el espacio de nombres de red del pod. Necesitará conocer uno de los ID de proceso del contenedor. Para ello, consulte la sección anterior sobre Obtener y acceder a los espacios de nombres de red de los Pods.

A continuación, ejecute el siguiente comando en la terminal de su nodo de trabajo, reemplazando la parte resaltada de manera adecuada:

El comando muestra una lista de las interfaces del pod:

nsenter ip addr

Observe los if7 caracteres después de eth0@ en la salida anterior. Esto significa que el del podeth0 está emparejado con la séptima interfaz del nodo. A continuación, enumere las interfaces dentro del espacio de nombres predeterminado del nodo ejecutando el comando ip addr :

El comando enumera las interfaces como se muestra a continuación:

Kubernetes Networking ip addr

En la salida, la séptima interfaz es veth254b50e6@if3  – el canal de ethernet virtual emparejado con el pod contra el que estamos realizando la prueba.

Revisión de las reglas de Iptables

Puede ejecutar el comando iptables-save para enumerar todas las iptables en un nodo:

La salida del comando puede ser larga, por lo que puede guardarla en un archivo para su posterior inspección:

También puede usar less para paginar la salida:

Dado que solo nos interesan las reglas NAT de Kubernetes, añada la bandera -L para especificar el objetivo correcto:

Aquí está la salida:

Kubernetes Networking iptables

Inspección de los detalles de IPVS

Kube-proxy es un proxy de red que se ejecuta en cada nodo de su clúster de Kubernetes. Se puede utilizar para configurar IPVS para que gestione la traducción de las IP virtuales de los servicios a las IP de los pods. Para enumerar la tabla de traducción de IP, puede utilizar el comando ipvsadm . Primero, debe instalarlo en su nodo:

Ahora puede ejecutar el siguiente comando:

Para mostrar una única IP de servicio, añada la bandera -t , especificando la dirección IP deseada:

Consulta del DNS del clúster

Hay algunas formas que puede seguir para depurar la resolución DNS de su clúster. La documentación oficial describe una forma que consiste en implementar un contenedor de depuración con todas las herramientas necesarias y luego usar kubectl para ejecutar nslookup.

Opcionalmente, puede consultar el DNS utilizando los comandos dig y nsenter desde el propio nodo. Primero, tendrá que instalar dig en su nodo maestro. Para Ubuntu, instálelo con el comando apt :

Kubernetes Networking install dnsutils

Vuelva a la terminal en su máquina local y ejecute el comando a continuación para encontrar la IP del clúster del servicio kube-dns :

El comando muestra:

get kube dns service

La columna cluster-ip contiene el valor que necesitamos. Ahora podemos usar nsenter para ejecutar dig en el espacio de nombres del contenedor. Sin embargo, necesitará el ID de proceso del contenedor para acceder a su espacio de nombres. Consulte la sección Obtención y acceso a los espacios de nombres de red de los pods anterior para obtener orientación.

Once you have the container-id, ejecute el siguiente comando en su nodo maestro:

El comando dig toma la IP del servicio DNS del clúster ( @10.96.0.10) y busca el nombre de dominio completo del servicio service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

Para obtener información sobre cómo encontrar nombres de servicios y espacios de nombres, consulte la sección Obtención de la dirección IP de un servicio.

Revisión del seguimiento de conexiones de Conntrack

Puede usar el comando conntrack  para ver todas las conexiones de las que se está realizando un seguimiento actualmente:

Muestra algo similar a la captura de pantalla:

Kubernetes Networking conntrac -l

Añada la bandera -E  para vigilar continuamente las conexiones entrantes:

Para ver las conexiones rastreadas a una dirección de destino particular, añada la bandera -d  y especifique la dirección de destino:

A veces, la tabla de seguimiento de conexiones se llena, lo que provoca que se descarten las nuevas conexiones. Esto causa problemas que impiden que sus nodos establezcan conexiones confiables. Si esto sucede, verá mensajes como el siguiente en los registros de su sistema, en la ubicación /var/log/syslog:

Existe una configuración del sistema para el número máximo de conexiones a rastrear. Utilice el siguiente comando para listar su valor actual:

Muestra:

conntrack max

Puede modificar el valor utilizando la opción -w parámetro:

Es posible que desee modificar su archivo /etc/sysctl.conf para hacer que el valor sea permanente y garantizar que persista a través de los reinicios. Abra el archivo con nano:

A continuación, modifique el valor si la línea existe o añada la línea al final del archivo, especificando el nuevo valor:

Conclusión

Al implementar múltiples servicios en contenedores, se beneficiará enormemente de Kubernetes, ya que le brinda un punto de gestión centralizado. Para garantizar que haya conectividad entre los diversos pods de Kubernetes, le mostramos algunos comandos de inspección de red que puede utilizar para solucionar cualquier problema en su infraestructura de Kubernetes.

Para obtener más información sobre Kubernetes, sus ventajas, la configuración y la implementación de aplicaciones en Kubernetes, eche un vistazo a nuestros diversos tutoriales de Kubernetes.

¡Feliz computación!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev es diseñador creativo en CloudSigma, centrado en una identidad empresarial coherente mediante el uso de canales de marketing tradicionales e innovadores. Es experto en fusionar la visión artística con el marketing estratégico para crear narrativas de marca impactantes.

Comentarios

Aún no hay comentarios. Sea el primero.