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