TLDR:
El troubleshooting en Kubernetes funciona de abajo hacia arriba: revisa el estado de los pods, inspecciona los eventos, consulta los logs y, si hace falta, depura de forma interactiva. La mayoría de los problemas se reduce a un puñado de errores recurrentes (ImagePullBackOff, CrashLoopBackOff, Pending, OOMKilled), todos rastreables con kubectl describe/logs. Para prevenir problemas recurrentes, define requests y límites de recursos adecuados, ajusta los probes, monitorea de forma continua y aplica right-sizing a tus workloads con el tiempo.
¿Qué es el troubleshooting en Kubernetes?
El troubleshooting en Kubernetes es el proceso sistemático de identificar y resolver problemas en pods, servicios y clústeres para mantener la salud de las aplicaciones. En general, el proceso sigue un enfoque "de abajo hacia arriba": se parte de la unidad más pequeña, el pod, y se escala hasta los nodos y la red a nivel de clúster.
El proceso de troubleshooting en Kubernetes se apoya en una combinación de herramientas de línea de comandos, inspección de logs, análisis de eventos y sesiones de depuración interactiva. Para hacerlo bien se necesita dominar herramientas como kubectl y conocer los patrones de error más comunes junto con sus soluciones. Con flujos de trabajo de troubleshooting estructurados, los ingenieros pueden reducir el tiempo de inactividad, prevenir fallas en cascada y mantener la confiabilidad de las aplicaciones.
Un flujo de trabajo de troubleshooting en Kubernetes suele incluir estos pasos:
- Revisa el estado de los pods: Ejecuta kubectl get pods para identificar los pods con fallas.
- Inspecciona los eventos: Usa kubectl describe pod <pod-name> para ver el historial de eventos (por ejemplo, fallas de scheduling o errores al descargar imágenes).
- Consulta los logs: Ejecuta kubectl logs <pod-name> para ver los errores a nivel de aplicación.
- Depuración interactiva: Usa kubectl exec -it <pod-name> -- /bin/sh para probar la conectividad interna o inspeccionar archivos de configuración.
Entre los códigos de error más comunes y sus soluciones se incluyen:
En este artículo:
- ¿Por qué es importante el troubleshooting en Kubernetes?
- Flujo de trabajo básico de troubleshooting en Kubernetes
- Comandos esenciales de kubectl para troubleshooting
- Códigos de error comunes en Kubernetes y sus soluciones
- 5 formas de prevenir problemas en Kubernetes desde el inicio
¿Por qué es importante el troubleshooting en Kubernetes?
El troubleshooting en Kubernetes cumple un papel fundamental para mantener entornos de contenedores estables y confiables. Los clústeres de Kubernetes contienen muchos componentes interconectados, como pods, nodos, servicios, controladores de ingress, sistemas de almacenamiento y capas de red.
Una falla en un componente puede afectar rápidamente otras partes del sistema. El troubleshooting ayuda a los ingenieros a identificar los problemas de forma temprana, aislar las causas raíz y restablecer las operaciones normales con la mínima interrupción:
- Reduce el tiempo de inactividad de las aplicaciones: Los workloads de Kubernetes pueden fallar por muchas razones, como caídas de contenedores, deployments fallidos, problemas de red o interrupciones en los nodos. El troubleshooting ayuda a los equipos a ubicar el origen del problema y restaurar los servicios afectados.
- Mantiene una alta disponibilidad: Los sistemas de producción suelen depender de Kubernetes para ejecutar aplicaciones de negocio. El troubleshooting ayuda a garantizar que las aplicaciones sigan accesibles y con buena capacidad de respuesta cuando fallan componentes de infraestructura o los workloads se vuelven inestables.
- Identifica errores de configuración y de deployment: Muchos problemas de Kubernetes se deben a configuraciones YAML incorrectas, variables de entorno inválidas, límites de recursos o definiciones de servicios. El troubleshooting ayuda a detectar estos errores y a verificar que los workloads estén desplegados correctamente.
- Previene fallas en cascada: Los problemas en entornos de Kubernetes pueden propagarse rápidamente. Por ejemplo, el agotamiento de recursos en un nodo puede afectar el scheduling en todo el clúster. El troubleshooting ayuda a aislar las fallas antes de que impacten a más workloads o servicios.
- Mejora el rendimiento y la eficiencia de los recursos: El troubleshooting ayuda a identificar throttling de CPU, presión de memoria, cuellos de botella de disco y problemas de latencia de red. Resolver estos problemas mejora el rendimiento de los workloads y garantiza que los recursos del clúster se usen de forma eficiente.
- Acelera la respuesta a incidentes: Los flujos de trabajo estructurados de troubleshooting ayudan a los ingenieros a responder a los incidentes con mayor eficiencia. Usar logs, eventos, métricas y herramientas de depuración permite a los equipos reducir el tiempo medio de detección (MTTD) y el tiempo medio de recuperación (MTTR).
- Facilita escalados y actualizaciones confiables: Los entornos de Kubernetes cambian con frecuencia debido al autoescalado, las actualizaciones progresivas, los reemplazos de nodos y los cambios de configuración. El troubleshooting ayuda a validar que estos cambios no introduzcan inestabilidad ni comportamientos inesperados.
Flujo de trabajo básico de troubleshooting en Kubernetes
1. Revisa el estado de los pods
El primer paso para diagnosticar un problema en Kubernetes es revisar el estado de los pods relevantes con kubectl get pods o kubectl describe pod <pod-name>. Esto proporciona información sobre la fase del pod, su disponibilidad, los reinicios y los mensajes de error. Revisar el estado del pod ayuda a identificar si está en ejecución, pendiente, con fallas o atascado en un ciclo de reinicios.
Las descripciones detalladas del pod revelan las transiciones de estado recientes, el estado de los contenedores y las razones de las fallas o los reinicios. Estos detalles pueden apuntar a configuraciones incorrectas, fallas al descargar imágenes, restricciones de recursos o errores a nivel de aplicación. Revisar el estado del pod al inicio del flujo de trabajo ayuda a enfocarse en los componentes correctos.
Ejemplo
kubectl get podskubectl describe pod nginx-7d8b49557c-xk9m22. Inspecciona los eventos
Los eventos de Kubernetes ofrecen un registro cronológico de los sucesos importantes dentro del clúster, como fallas de scheduling de pods, errores al descargar imágenes o violaciones de cuotas de recursos. Usar kubectl get events o kubectl describe <resource> ayuda a ver los eventos recientes relacionados con el recurso problemático. Estos eventos suelen incluir códigos de error y mensajes descriptivos.
Los eventos son efímeros y pueden sobrescribirse rápidamente en clústeres con mucha actividad, así que revísalos cuanto antes. Correlacionar las marcas de tiempo de los eventos con los reportes de incidentes o las alertas de monitoreo puede ayudar a reconstruir la secuencia que llevó al problema. Inspeccionar los eventos de forma consistente facilita el análisis de causa raíz y reduce el riesgo de pasar por alto señales críticas durante la respuesta a incidentes.
Ejemplo
kubectl get events --sort-by=.metadata.creationTimestampkubectl describe pod nginx-7d8b49557c-xk9m23. Consulta los logs
Los logs de aplicación y del sistema te ayudan a entender el comportamiento de los contenedores e identificar la causa raíz de las fallas. El comando kubectl logs <pod-name> recupera los logs de un contenedor específico y muestra stack traces, mensajes de error y la salida de la aplicación. Revisar los logs ayuda a distinguir entre problemas a nivel de infraestructura y a nivel de aplicación.
Para pods con varios contenedores o que ya fallaron, flags como -c <container-name> o --previous dan acceso a logs específicos. El análisis de logs muestra qué estaba haciendo la aplicación antes de la falla y pone en evidencia errores de configuración, bugs en el código o agotamiento de recursos.
Ejemplo
kubectl logs nginx-7d8b49557c-xk9m2kubectl logs nginx-7d8b49557c-xk9m2 -c app --previous4. Depuración interactiva
Cuando las verificaciones de estado, los eventos y los logs no aportan suficiente contexto, puede ser necesaria la depuración interactiva. Herramientas como kubectl exec -it <pod-name> -- /bin/sh permiten abrir una shell dentro de un contenedor en ejecución para inspeccionarlo en tiempo real. Esto permite ejecutar comandos de diagnóstico, examinar el sistema de archivos y verificar la conectividad de red desde dentro del pod.
La depuración interactiva es útil para investigar variables de entorno, volúmenes montados o el estado de la aplicación que quizá no sea visible desde fuera del contenedor. También sirve para probar la conectividad con servicios externos o reproducir errores de la aplicación. Úsala con cuidado en entornos de producción para evitar efectos secundarios no deseados.
Ejemplo
kubectl exec -it nginx-7d8b49557c-xk9m2 -- /bin/shComandos esenciales de kubectl para troubleshooting
Comandos de pods y deployments
El comando kubectl get pods ofrece una vista general del estado de los pods, su disponibilidad, la cantidad de reinicios y los nodos asignados. Se usa para identificar pods atascados en Pending, CrashLoopBackOff, ImagePullBackOff u otros estados anormales. Agregar flags como -o wide muestra detalles como la ubicación en nodos y las direcciones IP de los pods.
El comando kubectl describe pod <pod-name> muestra información detallada de un pod, como el estado de los contenedores, los volúmenes montados, las variables de entorno y los eventos recientes. Este comando ayuda a identificar fallas de scheduling, problemas de recursos y errores de arranque de los contenedores.
Para inspeccionar la salud de los deployments, se usan kubectl get deployments y kubectl describe deployment <deployment-name>. Estos comandos muestran el estado del rollout, el número de réplicas, las estrategias de actualización y los eventos del deployment. Ayudan a determinar si los pods fallan por problemas en el rollout o por configuraciones de deployment inválidas.
El comando kubectl rollout status deployment/<deployment-name> monitorea el progreso del deployment en tiempo real. Si un rollout se atasca o falla, kubectl rollout undo deployment/<deployment-name> revierte el deployment a la revisión estable anterior. Estos comandos se usan durante actualizaciones fallidas de aplicaciones o cambios de configuración.
Contenido relacionado: Ten a mano nuestra guía rápida de kubectl como referencia completa de comandos de troubleshooting.
Comandos de nodos
Los problemas a nivel de nodo pueden afectar el scheduling, la red y la estabilidad de los workloads en todo el clúster. El comando kubectl get nodes muestra la disponibilidad de los nodos e información general de su estado. Los nodos marcados como NotReady o SchedulingDisabled suelen indicar problemas de infraestructura o relacionados con el kubelet.
El comando kubectl describe node <node-name> proporciona diagnósticos del nodo, como la capacidad de recursos, los recursos asignables, los pods en ejecución, los taints, las condiciones y los eventos recientes. Esta información ayuda a identificar presión de CPU, agotamiento de memoria, presión de disco o problemas de red que afecten los workloads del nodo.
El comando kubectl top nodes muestra el consumo de recursos de los nodos, incluido el uso de CPU y memoria. Una utilización alta puede explicar desalojos de pods, throttling o fallas de scheduling. Combinarlo con kubectl top pods ayuda a correlacionar la presión de recursos del nodo con los workloads problemáticos.
Para una investigación más profunda, se pueden inspeccionar los logs del kubelet o los servicios del sistema directamente en el nodo con herramientas como journalctl. El troubleshooting a nivel de nodo es importante cuando los pods fallan en varios namespaces o cuando se degrada el rendimiento de todo el clúster.
Comandos de servicios y redes
Los problemas de red en Kubernetes suelen involucrar servicios, resolución de DNS, reglas de ingress o políticas de red. El comando kubectl get services lista los servicios del clúster junto con sus direcciones IP asignadas, puertos y tipos. Esto ayuda a verificar si los servicios están expuestos correctamente y mapeados a los workloads esperados.
El comando kubectl describe service <service-name> muestra los selectores del servicio, los endpoints y la información de eventos. La ausencia de endpoints suele indicar que los pods no coinciden con los labels del selector del servicio o que están fallando las verificaciones de readiness.
El comando kubectl get endpoints verifica qué IPs de pods están asociadas a un servicio. Si no aparecen endpoints, el tráfico no puede llegar a los pods de backend aunque el servicio exista.
Los problemas de DNS y conectividad suelen investigarse con contenedores temporales de depuración o shells interactivas. Comandos como kubectl exec -it <pod-name> -- nslookup <service-name> o curl <service-name> ayudan a verificar la resolución interna de DNS y el alcance de los servicios. Estas verificaciones ayudan a aislar si las fallas provienen de la configuración de DNS, las políticas de red, las reglas de ingress o problemas de conectividad a nivel de aplicación.
Códigos de error comunes en Kubernetes y sus soluciones
ImagePullBackOff
Problema: ImagePullBackOff ocurre cuando Kubernetes no puede descargar la imagen de contenedor necesaria para iniciar un pod. Después de la primera falla al descargar la imagen, Kubernetes reintenta la operación con demoras cada vez más largas. Hasta que la imagen esté disponible, el pod permanece sin ejecutarse.
Diagnóstico: Las fallas al descargar imágenes suelen deberse a nombres de imagen inválidos, tags incorrectos, credenciales del registry faltantes, tokens de autenticación expirados, caídas del registry o problemas de conectividad de red. El punto de partida más útil es la sección de Eventos de la descripción del pod.
Ejecuta kubectl describe pod <pod-name> y busca mensajes como ErrImagePull, pull access denied, unauthorized o manifest unknown. Estos mensajes suelen indicar si la falla está relacionada con la autenticación, la disponibilidad de la imagen o la conectividad.
Flujo de resolución:
- Ejecuta kubectl describe pod <pod-name> y revisa la sección de Eventos.
- Verifica que el nombre y el tag de la imagen sean correctos y existan en el registry.
- Confirma que el registry de contenedores sea accesible desde los nodos del clúster.
- Valida los secrets de descarga de imágenes configurados en el pod o en la cuenta de servicio.
- Revisa las credenciales del registry, los permisos y el estado de expiración de los tokens.
- Verifica la resolución de DNS y la conectividad de red saliente desde los nodos worker.
- Revisa las configuraciones de proxy, firewall o políticas de red que puedan bloquear el acceso al registry.
Ejemplo
kubectl describe pod my-podkubectl get secretskubectl describe secret registry-secretCrashLoopBackOff
Problema: CrashLoopBackOff indica que un contenedor arranca, termina y es reiniciado por Kubernetes una y otra vez. Después de varias fallas consecutivas, Kubernetes introduce demoras crecientes entre los intentos de reinicio para evitar ciclos constantes de reinicio.
Diagnóstico: Esta condición suele deberse a fallas en el arranque de la aplicación, valores de configuración inválidos, variables de entorno faltantes, fallas al inicializar dependencias, problemas de conectividad con la base de datos o comandos de contenedor incorrectos.
Los logs del contenedor suelen ser la forma más rápida de identificar la causa raíz. Revisa los logs con kubectl logs <pod-name>. Si el contenedor se reinicia demasiado rápido, usa el flag --previous para recuperar los logs de la última instancia fallida. La descripción del pod también puede revelar razones de terminación, códigos de salida, conteos de reinicios y fallas en los probes.
Flujo de resolución:
- Revisa los logs de la aplicación con kubectl logs <pod-name>.
- Si es necesario, recupera los logs de la instancia anterior del contenedor con --previous.
- Inspecciona los eventos del pod y los detalles de terminación con kubectl describe pod <pod-name>.
- Verifica las variables de entorno, los archivos de configuración, los secrets y los comandos de arranque.
- Revisa las conexiones a bases de datos, las dependencias externas y los endpoints de servicios.
- Revisa los límites de CPU y memoria en busca de señales de agotamiento de recursos.
- Valida la configuración de los probes de readiness, startup y liveness, y ajusta los umbrales de tiempo si es necesario.
Ejemplo
kubectl logs my-podkubectl logs my-pod --previouskubectl describe pod my-podPending
Problema: Un pod entra en el estado Pending cuando Kubernetes acepta la definición del pod pero no puede asignarlo a un nodo adecuado. El workload permanece sin programar y no arranca hasta que se cumplan todos los requisitos de scheduling.
Diagnóstico: Los pods en estado Pending suelen deberse a recursos insuficientes en el clúster, reglas de scheduling restrictivas, fallas en el aprovisionamiento de almacenamiento o restricciones de ubicación en nodos. Los mensajes de scheduling comunes incluyen CPU insuficiente, memoria insuficiente, selectores de nodo sin coincidencias, conflictos de taints o PersistentVolumeClaims sin vincular.
Los eventos de scheduling que muestra kubectl describe pod <pod-name> normalmente identifican la razón exacta por la que el scheduler no pudo ubicar el workload.
Flujo de resolución:
- Ejecuta kubectl describe pod <pod-name> y revisa los eventos del scheduler.
- Verifica la disponibilidad de los nodos con kubectl get nodes.
- Confirma que existan suficientes recursos de CPU y memoria en el clúster.
- Revisa los selectores de nodo, las reglas de afinidad de nodos, los taints y las tolerations.
- Valida que estén presentes los labels de nodo requeridos.
- Revisa los PersistentVolumeClaims (PVC) y el estado del aprovisionamiento de almacenamiento.
- Si el autoescalado está habilitado, confirma que el cluster autoscaler funcione correctamente.
Ejemplo
kubectl describe pod my-podkubectl get nodeskubectl get pvcOOMKilled
Problema: OOMKilled ocurre cuando un contenedor supera su límite de memoria configurado y es terminado por el OOM killer de Linux. Kubernetes aplica los límites de memoria de forma estricta, lo que hace que el contenedor se detenga de inmediato al superar el límite.
Diagnóstico: El agotamiento de memoria puede deberse a fugas de memoria, uso excesivo de caché, comportamiento ineficiente de la aplicación, picos de tráfico, conjuntos de datos grandes o límites de memoria demasiado bajos para el workload.
La descripción del pod suele mostrar OOMKilled como razón de terminación. Herramientas de monitoreo de recursos como Prometheus, Grafana o Metrics Server pueden ayudar a determinar si el workload experimenta presión de memoria sostenida o picos repentinos de uso.
Flujo de resolución:
- Confirma la razón de terminación con kubectl describe pod <pod-name>.
- Revisa las métricas de consumo de memoria previas a la falla.
- Identifica picos de memoria, fugas o una utilización alta sostenida.
- Compara el uso real de memoria con los requests y límites configurados.
- Aumenta los límites de memoria si claramente son insuficientes.
- Investiga causas a nivel de aplicación como caché, concurrencia o fugas de memoria.
- Optimiza el uso de memoria de la aplicación y ajusta la configuración de recursos según el comportamiento observado del workload.
Ejemplo
kubectl describe pod my-podkubectl top pod my-podkubectl top nodes5 formas de prevenir problemas en Kubernetes desde el inicio
Los equipos que trabajan bien con Kubernetes planifican sus clústeres de forma que se minimicen las fallas comunes. Esto favorece la resiliencia y, además, facilita el troubleshooting cuando surgen los problemas.
1. Define requests y límites de recursos
Los requests y límites de recursos ayudan a Kubernetes a asignar CPU y memoria de forma predecible en todo el clúster. Los requests definen los recursos mínimos necesarios para el scheduling, mientras que los límites definen el máximo de recursos que un contenedor puede consumir. Una configuración adecuada evita que los workloads compitan agresivamente por los recursos compartidos.
Sin requests, el scheduler no puede tomar decisiones de ubicación precisas, lo que puede llevar a nodos sobrecargados y workloads inestables. Sin límites, un solo contenedor puede consumir memoria o CPU en exceso y afectar a otras aplicaciones que corren en el mismo nodo.
Unos límites configurados con cuidado ayudan a reducir el riesgo de eventos OOMKilled, throttling de CPU y agotamiento de recursos en los nodos. Sin embargo, límites demasiado bajos también pueden generar inestabilidad al restringir las aplicaciones durante los picos de carga.
Usar políticas de LimitRange y ResourceQuota a nivel de namespace ayuda a aplicar prácticas consistentes de gestión de recursos entre equipos y entornos. Estos controles reducen la probabilidad de que workloads mal configurados afecten la estabilidad del clúster.
2. Usa los readiness y liveness probes con cuidado
Los probes de readiness y liveness ayudan a Kubernetes a determinar si los contenedores están saludables y listos para recibir tráfico. Una configuración adecuada de los probes mejora la confiabilidad de las aplicaciones al evitar que pods en mal estado atiendan solicitudes y al reiniciar automáticamente los contenedores que fallan.
Los readiness probes controlan si un pod se agrega a la lista de endpoints de un servicio. Si el readiness probe falla, el tráfico deja de enrutarse al pod hasta que se recupere. Esto ayuda a evitar que los usuarios lleguen a aplicaciones degradadas o inicializadas parcialmente.
Los liveness probes detectan bloqueos de la aplicación o procesos que no responden. Cuando un liveness probe falla repetidamente, Kubernetes reinicia el contenedor de forma automática. Este mecanismo mejora la capacidad de autorreparación, pero también puede generar inestabilidad si se configura mal.
Configurar tiempos demasiado agresivos en los probes es una causa frecuente de reinicios innecesarios y condiciones de CrashLoopBackOff. Las aplicaciones que requieren tiempos de arranque largos pueden no superar las verificaciones de salud antes de completar la inicialización. Los startup probes suelen ser útiles para workloads con procesos de arranque lentos.
3. Monitorea eventos, logs y métricas
El monitoreo continuo es esencial para detectar problemas en Kubernetes antes de que escalen a interrupciones del servicio. Los logs, las métricas y los eventos del clúster brindan visibilidad sobre el comportamiento de los workloads, el uso de recursos, la salud de la infraestructura y las fallas operativas.
Plataformas de métricas como Prometheus y Grafana ayudan a seguir el uso de CPU, el consumo de memoria, los reinicios de pods, la latencia de red y el rendimiento del almacenamiento. Monitorear las tendencias a lo largo del tiempo permite identificar comportamientos anormales antes de que los servicios se vuelvan inestables.
Los sistemas de logging centralizados mejoran el troubleshooting al reunir los logs de contenedores, los logs de nodos y los eventos del sistema en una plataforma con capacidad de búsqueda. Herramientas como Elasticsearch, Fluent Bit, Loki y Splunk se usan comúnmente para recolectar y analizar logs de Kubernetes.
Los eventos de Kubernetes aportan contexto operativo adicional al registrar fallas de scheduling, errores al descargar imágenes, desalojos de pods y problemas de configuración. Como los eventos son temporales, recolectarlos y almacenarlos externamente mejora la capacidad de troubleshooting a largo plazo.
4. Usa namespaces y labels de forma consistente
Los namespaces ayudan a organizar los workloads y aislar los recursos dentro de un clúster de Kubernetes. Un uso consistente de los namespaces mejora la claridad operativa, el control de acceso, la gestión de recursos y la eficiencia del troubleshooting.
Separar entornos como desarrollo, staging y producción en namespaces distintos reduce el riesgo de interferencias accidentales entre workloads. Las políticas a nivel de namespace también pueden aplicar límites de seguridad y cuotas de recursos.
Los labels aportan metadatos que se usan para seleccionar, agrupar, monitorear y automatizar workloads. Los servicios, deployments, políticas de red y sistemas de monitoreo de Kubernetes dependen en gran medida de los labels para identificar los workloads.
Los esquemas de etiquetado inconsistentes o mal diseñados suelen causar fallas en el enrutamiento de servicios, confusión en los deployments y complejidad operativa. Los labels estandarizados facilitan buscar, monitorear y gestionar workloads en clústeres grandes.
5. Aplica right-sizing continuo a tus workloads según el uso real
Los requerimientos de recursos de los workloads cambian con el tiempo a medida que las aplicaciones evolucionan, los patrones de tráfico se modifican y crece el uso de la infraestructura. Aplicar right-sizing continuo a los workloads ayuda a mantener el rendimiento y, al mismo tiempo, a reducir la pérdida de recursos en el clúster.
Los workloads sobreaprovisionados malgastan CPU y memoria, lo que aumenta los costos de infraestructura y reduce la eficiencia del clúster. Los workloads subaprovisionados generan inestabilidad, fallas de scheduling, throttling de CPU y caídas relacionadas con la memoria.
Monitorear el comportamiento real de los workloads brinda los datos necesarios para optimizar los requests y límites de recursos. Conviene revisar los patrones de uso a largo plazo en lugar de basarse solo en picos de corto plazo o en las estimaciones del deployment inicial.
Herramientas como el Vertical Pod Autoscaler (VPA) pueden recomendar o ajustar automáticamente la configuración de recursos según el consumo observado. El Horizontal Pod Autoscaler (HPA) complementa este enfoque al escalar el número de réplicas en respuesta a los cambios de carga.
Cómo PerfectScale te ayuda a prevenir y resolver problemas en Kubernetes
La mayor parte del troubleshooting en Kubernetes es reactivo: esperas a que un pod falle y luego escarbas entre eventos, logs y métricas para encontrar la causa. PerfectScale invierte ese modelo al aplicar right-sizing autónomo a los workloads, evitar tiempos de inactividad y optimizar el uso de recursos para mantener una disponibilidad del 99.99%. En lugar de perseguir manualmente eventos de OOMKilled, CrashLoopBackOff y throttling, tus equipos de DevOps, SRE e ingeniería de plataforma obtienen una remediación continua y basada en datos en cada capa del stack de K8s.
Capacidades clave de PerfectScale:
- Remediación automática de problemas: Identifica y corrige al instante los riesgos de resiliencia para maximizar el tiempo de actividad y eliminar la latencia, abordando problemas como OOM, throttling de CPU y desalojos de pods antes de que deriven en interrupciones en cascada.
- Prevención de errores de configuración: Detecta las configuraciones incorrectas detrás de las fallas comunes, como requests de CPU faltantes, requests de memoria faltantes y límites de memoria sin definir, para que los workloads arranquen y funcionen de forma confiable.
- Detección de subaprovisionamiento: Pone en evidencia CPU y memoria subaprovisionadas (tanto requests como límites) y posibles fugas de memoria: las causas raíz que mantienen a los pods atascados en ciclos de reinicio incluso cuando los nodos parecen saludables.
- Fortalecimiento de la infraestructura: Obtén visibilidad integral de los nodos para evitar su sobreasignación, validar afinidades de nodos y taints, y elegir los tipos de nodo óptimos para tus workloads.
- Priorización basada en impacto: Alinea las alertas con tus SLA y SLO, recibe notificaciones instantáneas por Slack, MS Teams o Datadog, y escala los problemas a un ticket con un solo clic.
- Optimización del autoescalado: Ajusta con precisión las configuraciones de autoescalado horizontal y vertical para que los disparadores de escalado se activen correctamente, evitando los escenarios de "HPA al máximo de réplicas" y de agotamiento de recursos que generan inestabilidad.
FAQ
¿Cuál es el primer comando que debo ejecutar cuando un pod tiene problemas?
kubectl get pods para identificar el pod con fallas, y luego kubectl describe pod <pod-name> para ver los detalles de su estado y los eventos recientes.
¿Qué causa CrashLoopBackOff?
El contenedor arranca, termina y se reinicia una y otra vez — generalmente por una falla en el arranque, una configuración incorrecta, variables de entorno faltantes o un error de conexión a la base de datos o a una dependencia. Revisa primero kubectl logs <pod-name> --previous.
¿Qué causa ImagePullBackOff? Kubernetes no puede descargar la imagen del contenedor — a menudo por un nombre o tag de imagen inválido, credenciales del registry faltantes o expiradas, o un problema de red para llegar al registry.
¿Por qué mi pod está atascado en Pending?
El scheduler no puede ubicarlo — típicamente por CPU/memoria insuficientes en el clúster, selectores de nodo o taints sin coincidencias, o un PersistentVolumeClaim sin vincular. kubectl describe pod <pod-name> muestra la razón exacta del scheduling.
¿Qué significa OOMKilled? El contenedor superó su límite de memoria y fue terminado por el OOM killer de Linux. Compara el uso de memoria con los requests/límites configurados y busca fugas o límites insuficientes.
¿Cómo depuro problemas de red o DNS?
Usa kubectl get endpoints para confirmar que los pods estén asociados a un servicio, y kubectl exec -it <pod-name> -- nslookup <service-name> para probar la resolución de DNS desde dentro de un pod.
¿Cómo puedo prevenir estos problemas en lugar de solo reaccionar? Define requests/límites de recursos adecuados, configura los probes de readiness/liveness con cuidado, monitorea logs/eventos/métricas de forma continua, usa namespaces y labels consistentes, y aplica right-sizing a los workloads con el tiempo (por ejemplo, con VPA/HPA o una herramienta como PerfectScale).
¿Listo para dejar de apagar incendios en Kubernetes? Explora la plataforma de rendimiento y resiliencia para Kubernetes de PerfectScale y descubre cómo la optimización autónoma mantiene tus clústeres estables, resilientes y rentables.