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:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
A continuación, ejecute el siguiente comando para descargar la clave de firma pública de Google Cloud:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Luego, agregue el repositorio apt de Kubernetes:
|
1 |
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
Después de eso, actualice el índice apt e instale kubectl con el siguiente comando:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Luego, verifique que kubectl esté instalado comprobando la versión con el siguiente comando:
|
1 |
kubectl version |
Aquí está la salida si acaba de instalar kubectl localmente:

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:
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
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:
|
1 |
cp -r .kube $HOME/ |
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:
|
1 |
kubectl version --output='json' |
Aquí está la salida, que muestra una conexión exitosa:

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

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:
|
1 |
kubectl get pod -o wide |
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:

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:
|
1 |
kubectl get pod -o wide --all-namespaces |
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:
|
1 |
kubectl get service --all-namespaces |
La salida del comando anterior es la siguiente. La IP del Servicio está en la columna cluster-ip :

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:
|
1 |
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:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-o-name |
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:

Ahora que tenemos un ID de proceso, podemos usarlo para ejecutar el comando nsenter dentro del espacio de nombres de red del proceso:
|
1 |
sudo nsenter -t container-pid -n ip addr |
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:
|
1 |
sudo nsenter -t container-pid -n ip addr |
El comando muestra una lista de las interfaces del pod:

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 :
|
1 |
ip addr |
El comando enumera las interfaces como se muestra a continuación:

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:
|
1 |
iptables-save |
La salida del comando puede ser larga, por lo que puede guardarla en un archivo para su posterior inspección:
|
1 |
iptables-save > iptables.txt |
También puede usar less para paginar la salida:
|
1 |
iptables-save | less |
Dado que solo nos interesan las reglas NAT de Kubernetes, añada la bandera -L para especificar el objetivo correcto:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
Aquí está la salida:

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:
|
1 |
sudo apt install ipvsadm |
Ahora puede ejecutar el siguiente comando:
|
1 |
sudo ipvsadm -Ln |
Para mostrar una única IP de servicio, añada la bandera -t , especificando la dirección IP deseada:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
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 :
|
1 |
sudo apt 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 :
|
1 |
kubectl get service -n kube-system kube-dns |
El comando muestra:

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:
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
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:

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:
|
1 |
sudo conntrack -L |
Muestra algo similar a la captura de pantalla:

Añada la bandera -E para vigilar continuamente las conexiones entrantes:
|
1 |
sudo conntrack -E |
Para ver las conexiones rastreadas a una dirección de destino particular, añada la bandera -d y especifique la dirección de destino:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
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:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: tabla llena, descartando paquete. |
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:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
Muestra:

Puede modificar el valor utilizando la opción -w parámetro:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
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:
|
1 |
sudo nano /etc/sysctl.conf |
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:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
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!
Comentarios
Aún no hay comentarios. Sea el primero.