Cómo Depurar Servicios K8S en 5 Pasos Sencillos

En Kubernetes, un servicio es un concepto central. En este artículo, aprenderás cómo depurar servicios K8S, que son interfaces abstractas (host+puerto) para cargas de trabajo compuestas por múltiples Pods.

Antes de adentrarnos en los métodos de depuración, revisemos brevemente la red, base de los servicios de Kubernetes.

  • Los contenedores en un Pod comparten el mismo espacio de red e IP.
  • Todos los Pods pueden comunicarse entre sí a través de sus IPs.
  • Cada nodo puede ver todos los Pods y viceversa.
  • Los Pods pueden ver todos los servicios.

¿Qué significa esto en la práctica?

En la figura:

  • Un contenedor dentro de Pod1 puede acceder al contenedor A como localhost.
  • El contenedor B puede dirigirse a Pod2 directamente por su IP (kubectl get pod -o wide). Dado que Pod2 puede fallar y ser reemplazado, este no es un canal de comunicación confiable.
  • Luego, el contenedor B puede usar el Servicio X para acceder a Pod2 y Pod3, donde se agrupan sus IPs con balanceo de carga, lo cual es crucial para aplicaciones basadas en microservicios en K8S.

Aunque una exploración profunda de la estructura de red interna de Kubernetes está fuera del alcence de este artículo, puedes experimentar con la red en Kubernetes lanzando un Pod de prueba y utilizando comandos como wget, ping y nslookup.

kubectl run -it testred --image=alpine sh --restart=Never --rm

Ahora estás en el espacio de red de Kubernetes y puedes usar estos comandos para probar las exigencias de red mencionadas anteriormente.

Volvamos al tema principle: troubleshooting de serviicos Kubernetes, que es principalmente una cuestión de estructura de red.

Paso 1: Verifica la existencia del servicio

kubectl get svc

Si el servicio no existe, debe haber un problema con la definición del servicio.

Paso 2: Prueba tu servicio

Un servicio ClusterIP interno no es accesible desde fuera del cluster. Hay dos formas de probarlo:

kubectl run -it podprueba --image=alpine sh --restart=Never --rm

Desde aquí, puedes probar el servicio usando wget <nombreServicio>:<puertoHTTP> o verificar si hay una entrada DNS para el servicio con nslookup <nombreServicio>.

Otra opción es reenviar puertos al equipo local y probarlo allí:

kubectl port-forward <nombre_servicio> 8000:8080

Puedes acceder al servicio a través de localhost:8000.

Paso 3: Comprueba si el servicio apunta a los Pods correctos

Kubernetes enruta tráfico entrante a uno de los Pods según el selector de etiquetas. Verifica si el servicio está vinculado a los Pods correspondientes:

kubectl describe service <nombre_servicio> | grep Endpoints

Deberías ver las IPs de todos los Pods relacionados. Si no es así, pasa al Paso 4.

Paso 4: Revisa las etiquetas de los Pods

Asegúrate de que el selector en el servicio coincida con las etiquetas de los Pods:

kubectl get pods --show-labels
kubectl describe svc <nombre_servicio>

Aquí, puedes verificar si las etiquetas de los Pods (app=pequenaweb, nivel=frontend) coinciden con el selector del servicio.

Paso 5: Confirma que los puertos del servicio coincidan con los del Pod

Finalmente, asegúrate de que tu código en los Pods escuche en el puerto especificado para el servicio (por ejemplo, puerto 8001).

Para más información sobre redes en Kubernetes, consulta los siguientes recursos:

  • Despliegue de aplicaciones en Kubernetes
  • Depuración de servicios
  • Redes en Kubernetes

Etiquetas: Kubernetes redes depuración ClusterIP dns

Publicado el 8-28 05:15