Kubernetes Troubleshooting: Networking, Services, DNS, NetworkPolicy, Ingress y CNI

Aprende a solucionar problemas de networking en Kubernetes siguiendo el tráfico desde Pods y Services hasta EndpointSlices, DNS, NetworkPolicy, Ingress, Gateway API y CNI.

This post is also available in: English

Los problemas de networking en Kubernetes pueden ser difíciles de diagnosticar porque un mismo síntoma puede tener muchas causas.

Una aplicación puede mostrar:

Connection refused
Connection timed out
No route to host
Name or service not known
502 Bad Gateway
503 Service Unavailable

pero el problema podría encontrarse en:

Application
|
Pod
|
Pod Network
|
Service
|
EndpointSlice
|
NetworkPolicy
|
Ingress / Gateway
|
Load Balancer
|
DNS
|
External Network

La mejor estrategia no es comenzar cambiando configuraciones.

Es seguir la conexión capa por capa hasta encontrar exactamente dónde deja de funcionar.

En este tercer artículo de nuestra serie de Kubernetes Troubleshooting vamos a investigar:

  • conectividad Pod-to-Pod;

  • Services;

  • EndpointSlices;

  • DNS;

  • puertos y targetPort;

  • NetworkPolicies;

  • Ingress;

  • Gateway API;

  • LoadBalancers;

  • CNI;

  • conectividad hacia servicios externos.


Entender primero el modelo de red de Kubernetes

Antes de hacer troubleshooting necesitamos entender algunas expectativas básicas del modelo de networking.

Cada Pod recibe su propia dirección IP dentro del cluster.

En condiciones normales, y salvo que existan mecanismos explícitos de aislamiento, la red del cluster debe permitir comunicación Pod-to-Pod, incluso cuando los Pods estén en diferentes nodos.

Los contenedores que pertenecen al mismo Pod comparten network namespace y pueden comunicarse utilizando:

localhost

Kubernetes Services agregan otra capa de abstracción:

Client Pod
|
v
Service
|
v
EndpointSlice
|
+------ Pod A
|
+------ Pod B
|
+------ Pod C

El Service proporciona una dirección estable mientras los Pods detrás de él pueden aparecer, desaparecer o cambiar de IP.


Nuestro flujo de troubleshooting

Para networking utilizaremos un principio simple:

Probar primero el destino más cercano y después avanzar una capa a la vez.

Por ejemplo, si:

https://api.example.com

no funciona, no comenzamos inmediatamente revisando DNS público o el Ingress Controller.

Primero comprobamos:

Application listening?
|
v
Pod IP reachable?
|
v
Service reachable?
|
v
EndpointSlice correct?
|
v
DNS working?
|
v
NetworkPolicy allows traffic?
|
v
Ingress / Gateway route?
|
v
Load Balancer?
|
v
Public DNS?

Esto nos permite reducir progresivamente el área del problema.


1. Comienza por los Pods

Supongamos que tenemos:

frontend
|
v
api-service
|
v
api Pods

y el frontend reporta:

connection refused

Primero revisamos los Pods backend:

kubectl get pods \
-n production \
-o wide

Busca:

  • STATUS;

  • READY;

  • IP;

  • NODE;

  • restart count.

Por ejemplo:

NAME READY STATUS IP
api-7cf8f76bcd-jx9pq 1/1 Running 10.244.1.23
api-7cf8f76bcd-qt8fz 1/1 Running 10.244.2.15

Running no garantiza que la aplicación esté aceptando conexiones, pero confirma que podemos continuar investigando.


2. ¿La aplicación realmente está escuchando?

Una causa común de problemas de networking no está realmente en Kubernetes.

La aplicación puede no estar escuchando en el puerto esperado.

Si la imagen contiene herramientas adecuadas:

kubectl exec \
-n production \
<pod> -- \
ss -lntp

También podemos comprobar localmente dentro del Pod:

kubectl exec \
-n production \
<pod> -- \
curl -v http://127.0.0.1:8080/health

Si esto falla:

Pod
|
X
Application

todavía no tiene sentido investigar el Service.

Primero debemos entender por qué la aplicación no está escuchando.


Un problema clásico: escuchar solamente en localhost

Supongamos que nuestra aplicación inicia con:

127.0.0.1:8080

Dentro del contenedor:

curl http://127.0.0.1:8080

puede funcionar.

Pero otros Pods intentarán alcanzar la aplicación usando la IP del Pod:

10.244.1.23:8080

Si la aplicación únicamente está vinculada a loopback, esa conexión puede fallar.

Muchas aplicaciones dentro de Kubernetes necesitan escuchar en:

0.0.0.0

o en una interfaz adecuada del Pod.


3. Probar directamente el Pod IP

Desde otro Pod podemos probar la dirección del backend.

Una forma útil de crear un Pod temporal de debugging es:

kubectl run network-debug \
-n production \
--rm -it \
--restart=Never \
--image=curlimages/curl \
-- sh

Dentro:

curl -v http://10.244.1.23:8080

Si funciona:

Debug Pod
|
v
Pod IP
|
v
Application
|
OK

hemos confirmado:

  • Pod networking básico;

  • puerto del Pod;

  • aplicación.

Ahora podemos avanzar hacia el Service.

Si no funciona, debemos investigar:

Application
Pod networking
NetworkPolicy
CNI
Node networking

4. Investigar el Service

Lista los Services:

kubectl get svc \
-n production

Después:

kubectl describe svc api-service \
-n production

Revisa especialmente:

Selector
Type
IP Families
ClusterIP
Port
TargetPort

Un Service puede verse perfectamente saludable como objeto Kubernetes y aun así no enviar tráfico correctamente.


Service port vs targetPort

Considera:

ports:
- port: 80
targetPort: 8080

El flujo es:

Client
|
| :80
v
Service
|
| :8080
v
Pod

port es el puerto presentado por el Service.

targetPort es el puerto hacia el backend.

Si nuestra aplicación escucha en:

8080

pero configuramos:

targetPort: 3000

el Service existe y puede resolver correctamente por DNS, pero el tráfico no llegará al proceso esperado.


5. EndpointSlices: ¿el Service tiene backends?

Esta es una de las comprobaciones más importantes.

Actualmente deberíamos investigar principalmente EndpointSlices:

kubectl get endpointslices \
-n production \
-l kubernetes.io/service-name=api-service

Para obtener más información:

kubectl describe endpointslice \
-n production \
-l kubernetes.io/service-name=api-service

EndpointSlice es la API que Kubernetes utiliza para representar eficientemente los backends asociados a un Service.

Podemos pensar:

Service
|
v
EndpointSlice
|
+--- 10.244.1.23:8080
|
+--- 10.244.2.15:8080

Si encontramos endpoints, podemos probar esas IPs directamente.


¿Qué pasa si no existen endpoints?

Tenemos:

Service
|
v
EndpointSlice
|
X
No backend Pods

Una de las primeras cosas que debemos revisar es el selector del Service.

kubectl get svc api-service \
-n production \
-o yaml

Por ejemplo:

selector:
app: api

Ahora revisamos los labels de los Pods:

kubectl get pods \
-n production \
--show-labels

Si los Pods tienen:

app=backend-api

pero el Service busca:

app=api

no existe match.

El resultado será un Service sin los backends esperados.


Readiness también importa

Supongamos que los labels sí coinciden.

Pero:

kubectl get pods -n production

muestra:

NAME READY
api-abc 0/1
api-def 0/1

Una readiness probe fallando puede hacer que esos Pods no sean considerados endpoints listos para tráfico normal.

Podemos comprobarlo con:

kubectl describe pod api-abc \
-n production

y revisar las condiciones del EndpointSlice:

kubectl get endpointslices \
-n production \
-l kubernetes.io/service-name=api-service \
-o yaml

Los EndpointSlices pueden incluir condiciones como:

ready
serving
terminating

Esto permite diferenciar si un backend está disponible para recibir tráfico y si está en proceso de terminación.


6. Probar el Service desde dentro del cluster

Una vez confirmado que existen backends:

kubectl run network-debug \
-n production \
--rm -it \
--restart=Never \
--image=curlimages/curl \
-- sh

Dentro:

curl -v http://api-service

o:

curl -v http://api-service:80

También podemos probar directamente el ClusterIP:

curl -v http://10.96.120.15:80

Esto produce una distinción muy útil.


Pod IP funciona, Service IP falla

Client
|
+---- Pod IP --------> OK
|
+---- Service IP ----> FAIL

Ahora podemos concentrarnos en:

Service configuration
EndpointSlice
Service proxy implementation
Node networking

Dependiendo de la plataforma y configuración, el dataplane del Service puede involucrar componentes como kube-proxy o implementaciones proporcionadas por el networking stack.


Service IP funciona, Service DNS falla

Service ClusterIP
|
OK
Service name
|
FAIL

Eso apunta fuertemente hacia DNS.


7. DNS troubleshooting

Kubernetes proporciona descubrimiento de Services mediante DNS.

Desde un Pod en el mismo namespace podemos utilizar normalmente:

api-service

Desde otro namespace:

api-service.production

o el FQDN:

api-service.production.svc.cluster.local

El cluster domain puede configurarse de forma diferente, por lo que cluster.local es común pero no debe asumirse universalmente en cualquier cluster.


Probar resolución

Desde un Pod con herramientas DNS:

nslookup api-service

Después:

nslookup api-service.production

Y finalmente:

nslookup api-service.production.svc.cluster.local

También podemos revisar:

cat /etc/resolv.conf

Un ejemplo podría contener:

search production.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5

Esto explica por qué nombres cortos pueden funcionar dentro de un namespace y comportarse diferente desde otro.


Revisar CoreDNS

Si DNS falla para múltiples aplicaciones:

kubectl get pods \
-n kube-system \
-l k8s-app=kube-dns

También podemos revisar el Service DNS:

kubectl get svc \
-n kube-system

Y logs:

kubectl logs \
-n kube-system \
-l k8s-app=kube-dns

Dependiendo del deployment, puede existir más de un contenedor o réplica, por lo que en incidentes reales conviene identificar exactamente qué Pods están procesando las consultas.


Una distinción importante

Considera:

nslookup api-service
|
FAIL
nslookup kubernetes.default
|
FAIL

Eso sugiere un problema DNS más general.

Pero:

nslookup kubernetes.default
|
OK
nslookup api-service
|
FAIL

entonces deberíamos revisar:

Service name
Namespace
Service existence
DNS record creation

antes de asumir que CoreDNS está completamente roto.


8. NetworkPolicy

Otro escenario común:

Pod A -> Pod B

funcionaba hasta que implementamos nuevas políticas de red.

Comenzamos con:

kubectl get networkpolicy -A

Después:

kubectl describe networkpolicy \
<policy> \
-n production

También debemos revisar los labels:

kubectl get pods \
-n production \
--show-labels

porque NetworkPolicy selecciona Pods mediante labels.


NetworkPolicies son aditivas

Este comportamiento es importante.

Si múltiples NetworkPolicies seleccionan un Pod, no se evalúan como reglas de firewall ordenadas de arriba hacia abajo.

Las reglas permitidas se combinan.

Para una conexión Pod-to-Pod:

Source Pod
|
| Egress must allow
v
Network
|
| Ingress must allow
v
Destination Pod

Cuando ambos lados están aislados por NetworkPolicy, tanto el egress del origen como el ingress del destino deben permitir la conexión.


Probar NetworkPolicy

Desde el origen:

kubectl exec \
-n frontend \
<frontend-pod> -- \
curl -v --connect-timeout 5 \
http://api-service.production:8080

También podemos probar TCP:

nc -vz \
api-service.production \
8080

Si:

DNS resolves
|
v
Correct destination IP
|
v
Connection timeout

NetworkPolicy, routing o firewall se vuelven hipótesis más fuertes.


Atención al CNI

Definir una NetworkPolicy no significa automáticamente que el cluster pueda aplicarla.

El networking implementation del cluster debe soportar NetworkPolicy enforcement.

Por lo tanto:

NetworkPolicy exists
|
X
does not necessarily mean
traffic is being enforced

El comportamiento dependerá del network plugin utilizado.


9. Pod-to-Pod funciona en el mismo nodo, pero falla entre nodos

Este es un escenario muy útil para identificar problemas de CNI o infraestructura.

Supongamos:

Node A
|
+-- Pod A
|
| works
v
+-- Pod B

pero:

Node A Node B
| |
Pod A -----------------> Pod C
FAIL

Eso cambia significativamente nuestra hipótesis.

Revisa dónde están los Pods:

kubectl get pods \
-A \
-o wide

Después revisa los nodos:

kubectl get nodes -o wide

Ahora podemos investigar:

  • CNI Pods;

  • routing;

  • encapsulation;

  • firewall;

  • MTU;

  • node interfaces;

  • IP allocation.


Identificar el networking stack

Dependiendo de nuestra distribución Kubernetes podemos encontrar componentes diferentes.

Una inspección inicial:

kubectl get pods \
-n kube-system \
-o wide

Podemos encontrar implementaciones como:

Calico
Cilium
Flannel
Antrea
cloud-provider-specific networking

Cada implementación tendrá herramientas y métricas diferentes.

No debemos asumir comandos específicos de Calico o Cilium hasta confirmar qué plugin utiliza el cluster.


10. CNI y problemas de asignación de IP

Si nuevos Pods no pueden obtener conectividad, Events pueden contener pistas.

kubectl describe pod <pod> \
-n production

Busca errores relacionados con:

sandbox creation
network setup
CNI
IP allocation

También:

kubectl get events -A \
--sort-by='.lastTimestamp'

Puede ayudar a correlacionar si múltiples Pods o nodos comenzaron a presentar errores simultáneamente.


11. MTU: el problema que parece aleatorio

Algunos problemas de networking aparecen así:

Small request
|
OK
Large request
|
timeout

o:

TCP connection
|
established
|
TLS handshake / large response
|
FAIL

Una posible causa es un problema de MTU.

Esto puede aparecer en redes con:

  • overlays;

  • VXLAN;

  • VPNs;

  • cloud networking;

  • tunnels.

Podemos investigar interfaces:

ip link

y rutas:

ip route

Pero cualquier cambio de MTU debe hacerse entendiendo el CNI y la red subyacente. Ajustarlo por prueba y error puede crear problemas adicionales.


12. Ingress troubleshooting

Ahora supongamos:

curl http://api-service.production

funciona dentro del cluster.

Pero:

https://api.example.com

no funciona desde fuera.

Esto es importante:

Pod OK
Service OK
DNS OK
|
v
Problem is farther upstream

Ahora sí investigamos Ingress.

kubectl get ingress -A

Después:

kubectl describe ingress <name> \
-n production

Revisa:

IngressClass
Host
Path
Backend Service
Backend Port
TLS
Events
Address

Ingress necesita un controller

Crear:

kind: Ingress

por sí solo no implementa el routing.

El cluster necesita un Ingress Controller que observe esos recursos y configure el dataplane correspondiente.

Podemos revisar:

kubectl get ingressclass

y encontrar el controller apropiado según la plataforma.

Después revisamos sus Pods y logs.

Por ejemplo, si sabemos que utiliza un namespace específico:

kubectl get pods \
-n <ingress-controller-namespace>

y:

kubectl logs \
-n <ingress-controller-namespace> \
<controller-pod>

No debemos asumir que todos los clusters utilizan ingress-nginx.


502 vs 503

El significado exacto depende del proxy/controller utilizado, pero estos códigos pueden ayudarnos a orientar la investigación.

Por ejemplo:

External Client
|
v
Ingress Controller
|
+---- backend unavailable
|
+---- backend connection failure
|
+---- timeout

Siempre revisa simultáneamente:

  • controller logs;

  • backend endpoints;

  • application logs;

  • latency metrics.

No debemos diagnosticar solamente basándonos en el código HTTP.


13. Gateway API

Para nuevos diseños debemos considerar Gateway API.

El proyecto Kubernetes recomienda Gateway en lugar de continuar expandiendo Ingress.

Ingress continúa soportado, pero su API está congelada.

Conceptualmente podemos tener:

Client
|
Gateway
|
HTTPRoute
|
Service
|
EndpointSlice
|
Pods

Dependiendo de la implementación podemos revisar recursos como:

kubectl get gateway -A
kubectl get httproute -A
kubectl describe gateway <gateway> \
-n <namespace>
kubectl describe httproute <route> \
-n <namespace>

Gateway API no viene implementada automáticamente por el simple hecho de utilizar Kubernetes.

Necesitamos una implementación/controller compatible.


14. LoadBalancer no obtiene IP

Otro problema frecuente:

kubectl get svc

muestra:

TYPE EXTERNAL-IP
LoadBalancer <pending>shellscriptshellscript

Aquí debemos entender dónde estamos ejecutando Kubernetes.

Service type LoadBalancer
|
v
Who provides the load balancer?

En un cloud provider puede depender de:

  • cloud controller;

  • permissions;

  • networking;

  • quotas;

  • subnet configuration;

  • load balancer controller.

En clusters bare-metal o locales puede requerir una implementación adicional como un load-balancer controller apropiado para ese entorno.

Kubernetes define la abstracción LoadBalancer, pero la infraestructura debe proporcionar la implementación necesaria.


15. DNS público

Supongamos que:

Load Balancer
|
OK

pero:

api.example.com
|
FAIL

Comprueba DNS público:

dig api.example.com

o:

nslookup api.example.com

Después compara la respuesta con la dirección del load balancer.

También puedes probar directamente:

curl -v \
--resolve api.example.com:443:<IP> \
https://api.example.com

Esto es extremadamente útil porque permite probar:

HTTP/TLS/Host routing

utilizando una IP específica sin depender de la resolución DNS normal.


16. TLS

Un problema de networking puede ser en realidad un problema TLS.

Prueba:

curl -vk https://api.example.com

Para una inspección más detallada:

openssl s_client \
-connect api.example.com:443 \
-servername api.example.com

Revisa:

certificate chain
expiration
SAN
issuer
SNI
hostname

Si utilizamos un Secret Kubernetes:

kubectl get secret <tls-secret> \
-n production

y:

kubectl describe ingress <ingress> \
-n production

o el recurso Gateway correspondiente para confirmar qué certificado debería utilizarse.


17. Pods no pueden salir a Internet

Ahora cambiamos de dirección:

Pod
|
v
Internet
|
X

Comienza desde el Pod:

curl -v https://example.com

Después separa DNS de conectividad:

nslookup example.com

Si DNS funciona pero la conexión no:

DNS
|
OK
|
v
TCP connection
|
FAIL

investiga:

  • NetworkPolicy egress;

  • routing;

  • NAT;

  • firewall;

  • proxy;

  • cloud security controls;

  • CNI.


DNS vs egress

Por ejemplo:

nslookup example.com

funciona.

Pero:

curl https://example.com

timeout.

La resolución DNS funciona, así que no empezamos modificando CoreDNS.

Por el contrario:

nslookup example.com
|
FAIL

requiere primero entender si el Pod puede alcanzar el DNS configurado.


18. Database connection timeout

Este mismo flujo es muy útil para bases de datos.

Supongamos que nuestra aplicación muestra:

connection to database timed out

Dividimos la investigación:

Application
|
v
DNS resolution
|
v
TCP connection
|
v
TLS
|
v
Authentication
|
v
Database

DNS:

nslookup database.example.internal

TCP:

nc -vz \
database.example.internal \
5432

Si obtenemos:

succeeded

ya sabemos que:

DNS + routing + TCP path

funcionan hasta cierto punto.

Después podemos investigar:

  • TLS;

  • credentials;

  • database availability;

  • connection limits;

  • application pool.

Networking troubleshooting también consiste en demostrar qué capas sí funcionan.


19. Connection refused vs timeout

Esta diferencia puede aportar información útil.

Connection refused

Client
|
v
Destination reached
|
v
Nothing accepting connection

Puede indicar:

  • proceso no escuchando;

  • puerto incorrecto;

  • proxy rechazando conexión.

Timeout

Client
|
v
Packets sent
|
?
|
No response

Puede indicar:

  • NetworkPolicy;

  • firewall;

  • routing;

  • unavailable destination;

  • severe network loss.

No es una regla absoluta, pero ayuda a seleccionar la siguiente prueba.


20. Packet capture

Cuando las pruebas de aplicación no son suficientes, podemos observar los paquetes.

Dependiendo de nuestros permisos y del entorno, podemos utilizar herramientas como:

tcpdump

Por ejemplo:

tcpdump -i any -nn \
host 10.244.2.15 \
and port 8080

Podemos buscar:

SYN
SYN-ACK
RST
retransmissions

Un patrón como:

Client Server
SYN -------------------->
SYN -------------------->
SYN -------------------->
no response

apunta a un escenario diferente de:

Client Server
SYN -------------------->
<-------------- RST

Packet capture puede ayudarnos a comprobar hasta dónde viaja realmente el tráfico.


21. Debugging de nodos

Si sospechamos un problema de red en un nodo específico:

kubectl get pods -A -o wide

puede revelar algo como:

Pods on node-01 -> OK
Pods on node-02 -> FAIL

Ahora la hipótesis cambia de:

application issue

a algo posiblemente relacionado con:

node-02
CNI
routes
interfaces
firewall

Podemos utilizar:

kubectl debug node/node-02 \
-it \
--image=ubuntu

y, según los permisos disponibles, revisar:

ip addr
ip route
ip link

Para problemas complejos también podemos revisar logs del networking agent correspondiente al CNI.


22. Metrics

No todo problema de networking produce una falla completa.

También podemos tener:

Packet loss
Latency
Connection resets
Retries
Timeouts

Métricas útiles pueden incluir:

request rate
error rate
request duration
TCP resets
packet drops
retransmissions
DNS latency
DNS errors
connection counts

La disponibilidad exacta depende del CNI, ingress/gateway implementation, service mesh y stack de observabilidad.


23. Distributed tracing

Considera una aplicación:

Frontend
|
v
API
|
v
Payment Service
|
v
Database

El usuario ve una petición de:

5.2 seconds

Un trace puede mostrar:

Frontend 20 ms
|
API 35 ms
|
Payment Service 5.1 sec
|
Database 25 ms

Ahora sabemos qué dependencia investigar.

Las traces no reemplazan las pruebas de red, pero ayudan a identificar qué salto de una arquitectura distribuida está introduciendo el problema.


24. Logs

Los logs también deben correlacionarse entre diferentes componentes.

Durante un incidente de networking podemos revisar:

Application logs
Ingress/Gateway logs
CNI logs
CoreDNS logs
Cloud load balancer logs
Firewall logs

La idea es seguir la misma conexión.

Cuando sea posible utiliza:

timestamp
request ID
trace ID
source IP
destination
status code

para correlacionar información entre sistemas.


Flujo completo de troubleshooting

Podemos resumir el proceso así:

Request fails
|
v
Application alive?
|
v
Listening on port?
|
v
Pod IP works?
|
v
Service works?
|
v
EndpointSlices correct?
|
v
DNS works?
|
v
NetworkPolicy allows?
|
v
Cross-node networking works?
|
v
CNI healthy?
|
v
Ingress / Gateway works?
|
v
Load Balancer works?
|
v
Public DNS works?
|
v
TLS works?
|
v
Root cause

No todos los incidentes requieren recorrer cada paso.

La clave es utilizar cada prueba para eliminar hipótesis.


Command reference

# Pods and nodes
kubectl get pods -A -o wide
kubectl get nodes -o wide
# Services
kubectl get svc -A
kubectl describe svc <service> -n <namespace>
# EndpointSlices
kubectl get endpointslices \
-n <namespace> \
-l kubernetes.io/service-name=<service>
kubectl get endpointslices \
-n <namespace> \
-l kubernetes.io/service-name=<service> \
-o yaml
# Labels
kubectl get pods \
-n <namespace> \
--show-labels
# DNS
nslookup <service>
nslookup <service>.<namespace>
cat /etc/resolv.conf
# CoreDNS
kubectl get pods \
-n kube-system \
-l k8s-app=kube-dns
kubectl logs \
-n kube-system \
-l k8s-app=kube-dns
# NetworkPolicy
kubectl get networkpolicy -A
kubectl describe networkpolicy \
<policy> \
-n <namespace>
# Ingress
kubectl get ingress -A
kubectl describe ingress \
<ingress> \
-n <namespace>
kubectl get ingressclass
# Gateway API
kubectl get gateway -A
kubectl get httproute -A
# Debug Pod
kubectl run network-debug \
-n <namespace> \
--rm -it \
--restart=Never \
--image=curlimages/curl \
-- sh
# Node debugging
kubectl debug node/<node> \
-it \
--image=ubuntu
# Network tools
curl -v <url>
nslookup <hostname>
dig <hostname>
nc -vz <hostname> <port>
ip addr
ip route
ip link
tcpdump -i any -nn

Qué no hacer

Evita comenzar con:

Service doesn't work
|
v
Restart CoreDNS

o:

502
|
v
Restart Ingress Controller

o:

Timeout
|
v
Disable NetworkPolicy

Esas acciones pueden modificar el sistema sin demostrar la causa.

Un mejor proceso es:

Symptom
|
v
Test one boundary
|
v
Record result
|
v
Eliminate hypotheses
|
v
Move one layer
|
v
Find failure point
|
v
Fix
|
v
Validate

Conclusión

Kubernetes networking deja de ser misterioso cuando dejamos de verlo como una sola capa.

Una petición puede recorrer:

Client
|
DNS
|
Load Balancer
|
Gateway / Ingress
|
Service
|
EndpointSlice
|
Pod network
|
Application

Cada una de estas capas puede comprobarse independientemente.

Por eso una de las técnicas más efectivas durante troubleshooting es preguntar continuamente:

¿Hasta dónde sabemos que funciona la conexión?

Si podemos demostrar:

Pod IP -> works
Service IP -> works
Service DNS -> works
Ingress -> fails

ya hemos eliminado una gran parte del sistema de nuestra investigación.

Ese es el objetivo: reemplazar prueba y error por evidencia.

En el siguiente artículo continuaremos con Kubernetes health checks y veremos en detalle:

  • readiness probes;

  • liveness probes;

  • startup probes;

  • timeouts;

  • thresholds;

  • probes que provocan restart loops;

  • dependencias externas dentro de health checks;

  • cómo un health check incorrecto puede causar una falla en cascada.

Comments