PerfectScalePerfectScale

PerfectScale

kubectl debug: la guía completa para depurar pods y nodos

kubectl debug es un comando integrado que sirve para diagnosticar workloads en ejecución dentro de un clúster de Kubernetes. Se usa cuando necesitas inspeccionar un contenedor que carece de herramientas esenciales de depuración, como un shell o utilidades de red (algo común en imágenes mínimas \"distroless\"), o cuando un pod está atascado en un ciclo de fallos.

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Sep 25, 202616 min read
Josh Palmer

About Josh Palmer

Head of Content

I'm Josh Palmer, Head of Content at DoiT, where I split my time across multiple business units including DoiT Cloud Intelligence, PerfectScale (Kubernetes cost optimization), and SELECT (Snowflake, Databricks, and BigQuery cost optimization). Before DoiT, I spent four and a half years at OnBoard building content for a board intelligence platform used by 6,000+ organizations, and before that, two years as Content Marketing Manager at Zylo, a SaaS management platform.

My personal page

TL;DR

  • kubectl debug es el comando interactivo de diagnóstico integrado en kubectl. Funciona de tres maneras: agregando un contenedor efímero a un pod en ejecución, creando una copia de un pod con configuración modificada o lanzando un pod con capacidades privilegiadas en un nodo.
  • Úsalo cuando kubectl logs y kubectl describe no alcanzan, por ejemplo, con un contenedor distroless sin shell o un pod atascado en CrashLoopBackOff.
  • Sintaxis básica: kubectl debug (POD | TYPE/NAME) [flags], siendo lo más habitual kubectl debug my-pod -it --image=busybox.
  • Las sesiones de debug se ejecutan bajo un perfil de depuración (--profile, por defecto general en las versiones actuales de kubectl) que controla qué capacidades y namespaces recibe el contenedor de debug; no se ejecuta en modo privilegiado por defecto.
  • Buena práctica: empieza por logs/describe/events, usa los contenedores efímeros solo para inspeccionar (nunca para parchear un workload en ejecución) y elimina cualquier pod creado con --copy-to cuando termines.

¿Qué es kubectl debug?

kubectl debug es un comando integrado que sirve para diagnosticar workloads en ejecución dentro de un clúster de Kubernetes. Se usa principalmente cuando necesitas inspeccionar un contenedor que carece de herramientas esenciales de depuración, como un shell o utilidades de red (algo común en imágenes mínimas "distroless"), o cuando un pod está atascado en un ciclo de fallos.

Comandos comunes:

Para la sintaxis detallada, consulta la documentación oficial de kubectl debug de Kubernetes.

Escenario Ejemplo de comando
Agregar un shell a un pod en ejecución kubectl debug -it <pod-name> --image=busybox
Compartir el namespace de procesos kubectl debug -it <pod-name> --image=busybox --target=<container-name>
Depurar un pod que falla kubectl debug <pod-name> -it --copy-to=debug-pod --image=ubuntu -- /bin/bash
Depurar un nodo del clúster kubectl debug node/<node-name> -it --image=ubuntu

Flags clave:

  • -i / -t (habitualmente combinados como -it): adjunta de inmediato una TTY interactiva a la consola del nuevo contenedor.
  • --target: especifica un contenedor del pod con el que compartir el namespace de procesos, lo que te permite ver sus procesos en ejecución con herramientas como ps.
  • --copy-to: asigna un nombre al nuevo pod que se creará como copia del original para el diagnóstico.
  • --profile: selecciona el perfil de depuración (general, baseline, restricted, netadmin o sysadmin) que controla el contexto de seguridad y los namespaces que recibe el contenedor de debug. En las versiones actuales de kubectl, el valor por defecto es general.

Casos de uso de kubectl debug

El comando opera de tres maneras principales según el recurso objetivo:

  • Contenedores efímeros: agrega un contenedor temporal con la imagen que elijas (por ejemplo, busybox o ubuntu) a un pod existente en ejecución. Esto te permite ejecutar diagnósticos sin reiniciar el pod.
  • Copia de pods: crea una copia de un pod con atributos modificados, como una imagen de contenedor o un comando distintos. Es útil para diagnosticar pods que fallan al arrancar y a los que no se puede acceder en ejecución.
  • Depuración de nodos: crea un nuevo pod que se ejecuta en los namespaces del host del nodo y monta el sistema de archivos raíz del nodo. Se usa para diagnósticos a nivel de infraestructura directamente sobre un nodo del clúster.

three ways to debug with kubectl debug

La sintaxis de kubectl debug

El comando kubectl debug admite varios flujos de depuración, como agregar contenedores efímeros a pods, crear copias de pods para diagnóstico y depurar nodos.

Terminal window
kubectl debug (POD | TYPE/NAME) [flags]

Las opciones más comunes incluyen:

Opción Descripción
-it Inicia una sesión de terminal interactiva
--image Especifica la imagen de contenedor a usar para la depuración
--target Apunta a un contenedor específico dentro de un pod
--copy-to Crea una copia de un pod para depurarla
--share-processes Habilita el uso compartido del namespace de procesos en pods copiados
--profile Selecciona el perfil de depuración (general por defecto) que define el contexto de seguridad y los namespaces del contenedor de debug
node/NODE_NAME Inicia una sesión de depuración en un nodo

Comandos comunes de kubectl debug

1. Agregar un shell a un pod en ejecución

Este ejemplo agrega a un pod existente un contenedor efímero con un shell. El contenedor de debug se ejecuta junto a los contenedores originales sin modificarlos.

Terminal window
kubectl debug my-pod -it --image=busybox

Si el pod contiene varios contenedores, puedes apuntar a uno en particular:

Terminal window
kubectl debug my-pod -it --image=busybox --target=my-container

El flag --target comparte el namespace de procesos con el contenedor indicado, de modo que el contenedor de debug puede ver (e interactuar con) sus procesos en ejecución.

2. Compartir el namespace de procesos

Por defecto, es posible que los contenedores efímeros no vean los procesos que corren en otros contenedores. El flag --share-processes habilita el uso compartido del namespace de procesos en un pod copiado, lo que te permite inspeccionar los procesos en ejecución de todos los contenedores.

Terminal window
kubectl debug my-pod --copy-to=my-pod-debug --share-processes -it --image=busybox

Esto resulta útil con herramientas como ps, top o strace al investigar problemas a nivel de procesos.

3. Depurar un pod que falla

Cuando un contenedor falla de manera repetida, puede terminar antes de que logres inspeccionarlo. La opción --copy-to crea una copia del pod con configuración modificada para el diagnóstico.

Terminal window
kubectl debug my-pod --copy-to=my-pod-debug -it --image=ubuntu

A partir de ahí puedes inspeccionar volúmenes montados, variables de entorno, archivos de configuración o binarios de la aplicación sin afectar al pod original.

4. Depurar un nodo del clúster

kubectl debug también puede crear un pod temporal adjunto a un nodo para diagnósticos a nivel de nodo. Es útil al investigar problemas del kubelet, fallos de red o uso de disco.

Terminal window
kubectl debug node/my-node -it --image=ubuntu

Por defecto, la depuración de nodos usa el perfil general: el pod de debug se ejecuta en los namespaces del host del nodo (hostPID, hostNetwork, hostIPC) y monta el sistema de archivos raíz del nodo en /host, pero no se ejecuta con un contexto de seguridad privilegiado. Desde ahí puedes inspeccionar el sistema de archivos del host y los servicios del sistema. Si necesitas acceso root completo (privilegiado) en el nodo, por ejemplo, para cargar módulos del kernel o usar raw sockets, solicítalo de forma explícita con --profile=sysadmin.

kubectl debug vs. kubectl logs vs. kubectl describe

kubectl debug, kubectl logs y kubectl describe son comandos de diagnóstico, pero cumplen propósitos distintos. kubectl logs recupera la salida de la aplicación, kubectl describe muestra los detalles y eventos de los recursos de Kubernetes, y kubectl debug brinda acceso interactivo para investigar en vivo.

Comando Propósito principal Caso de uso típico
kubectl logs Ver los logs del contenedor Revisar la salida de la aplicación y los mensajes de error
kubectl describe Inspeccionar el estado y los eventos del recurso Diagnosticar problemas de scheduling, configuración o ciclo de vida
kubectl debug Realizar depuración interactiva Investigar contenedores en ejecución, nodos o problemas de red

kubectl logs

El comando kubectl logs muestra la salida de stdout y stderr de los contenedores. Se usa comúnmente para identificar fallos de la aplicación, errores de arranque o errores en tiempo de ejecución.

Terminal window
kubectl logs my-pod

Para pods con varios contenedores, especifica el nombre del contenedor:

Terminal window
kubectl logs my-pod -c app-container

Este comando es ligero y seguro, ya que no modifica el pod ni crea contenedores nuevos.

kubectl describe

El comando kubectl describe proporciona información detallada sobre los recursos de Kubernetes, incluidos labels, condiciones, volúmenes montados y eventos recientes.

Terminal window
kubectl describe pod my-pod

Este comando es útil para diagnosticar problemas como:

A diferencia de kubectl logs, se centra en el estado de los objetos de Kubernetes y no en la salida de la aplicación.

kubectl debug

El comando kubectl debug habilita el diagnóstico interactivo adjuntando contenedores efímeros o creando pods temporales de debug.

Terminal window
kubectl debug my-pod -it --image=busybox

Este enfoque es útil cuando los logs y las descripciones de recursos no bastan. Por ejemplo, puedes:

  • Inspeccionar la conectividad de red
  • Examinar el contenido del sistema de archivos
  • Ejecutar herramientas de inspección de procesos
  • Depurar contenedores mínimos sin shell
  • Investigar problemas a nivel de nodo

Como crea entornos temporales de depuración, kubectl debug ofrece un acceso más profundo que los otros comandos, minimizando a la vez los cambios en los workloads de producción.

Ejemplos prácticos de kubectl debug

Depurar la conectividad de red

Usa un contenedor de debug para probar el DNS, el descubrimiento de servicios y el acceso de red saliente desde el namespace de red del pod.

Terminal window
kubectl debug my-pod -it --image=busybox --target=my-container

Dentro del contenedor de debug, ejecuta comandos como:

Terminal window
nslookup kubernetes.default
wget -qO- http://my-service.default.svc.cluster.local
ping 10.0.0.10

Esto resulta útil cuando la imagen de la aplicación no incluye herramientas como nslookup, curl o ping.

Depurar un pod en CrashLoopBackOff

Para un pod que se reinicia constantemente, crea una copia para inspeccionarla. Así se evita alterar el workload original.

Terminal window
kubectl debug my-pod --copy-to=my-pod-debug -it --image=ubuntu

Desde el pod copiado puedes inspeccionar variables de entorno, archivos montados, configuración y acceso de red:

Terminal window
env
ls -la /etc/config
cat /etc/config/app.conf

Esto ayuda a identificar archivos faltantes, valores de entorno incorrectos o dependencias en tiempo de ejecución.

Depurar compartiendo el namespace de procesos

Comparte el namespace de procesos cuando necesites inspeccionar procesos de otro contenedor del pod.

Terminal window
kubectl debug my-pod \
--copy-to=my-pod-debug \
--share-processes \
-it \
--image=ubuntu

Dentro del contenedor de debug, revisa los procesos en ejecución:

Terminal window
ps aux
top

Es útil para inspeccionar procesos bloqueados, procesos zombis o procesos hijos inesperados.

Depurar con una imagen personalizada

Usa una imagen de debug personalizada cuando las imágenes estándar no incluyan las herramientas que necesitas.

Terminal window
kubectl debug my-pod -it \
--image=my-registry.example.com/debug-tools:latest \
--target=my-container

Una imagen personalizada puede incluir herramientas como curl, dig, tcpdump, strace o clientes de bases de datos. Así se mantienen pequeñas las imágenes de producción sin renunciar a un diagnóstico más profundo cuando hace falta.

Buenas prácticas al usar kubectl debug

Aquí tienes algunas prácticas útiles a tener en cuenta al usar este comando.

1. Empieza por la observabilidad antes de entrar al pod

Usa kubectl logs, kubectl describe, eventos, métricas y trazas antes de iniciar una sesión interactiva de debug. Estas herramientas son más rápidas y seguras, y muchas veces bastan para identificar el problema.

Terminal window
kubectl logs my-pod
kubectl describe pod my-pod
kubectl get events --sort-by=.metadata.creationTimestamp

Esto ayuda a confirmar si el problema se origina en la aplicación, el scheduling, los probes, los límites de recursos, la red o la configuración de Kubernetes. Por ejemplo, kubectl describe puede mostrar fallos al descargar imágenes, readiness probes fallidos o errores de montaje de volúmenes antes de que dediques tiempo a inspeccionar el contenedor directamente.

Usa kubectl debug cuando las señales disponibles no expliquen el problema o cuando necesites inspeccionar el estado en tiempo de ejecución desde dentro del entorno del pod.

2. Usa contenedores efímeros para inspeccionar, no para modificar la aplicación

Los contenedores efímeros están pensados para el diagnóstico. No los uses para parchear archivos, reiniciar servicios, instalar dependencias ni cambiar el comportamiento de la aplicación en un workload en ejecución.

Úsalos para inspeccionar el estado, ejecutar comandos de diagnóstico y recopilar evidencia:

Terminal window
kubectl debug my-pod -it --image=busybox --target=my-container

Por ejemplo, puedes comprobar la resolución de DNS, inspeccionar archivos montados, probar la conectividad de servicios o ver los procesos en ejecución. Estas acciones ayudan a entender qué está pasando sin alterar el workload.

Cualquier corrección debe hacerse en el código fuente, la imagen del contenedor, los manifiestos o el pipeline de despliegue. Así el comportamiento en producción se mantiene reproducible y se evitan cambios manuales puntuales que desaparecen cuando el pod se reinicia.

3. Prefiere los contenedores de debug antes que agregar herramientas a las imágenes de producción

Evita instalar shells, gestores de paquetes y herramientas de red en las imágenes de producción solo para el diagnóstico. Estas herramientas aumentan el tamaño de la imagen y pueden ampliar la superficie de ataque del contenedor.

En su lugar, mantén pequeñas las imágenes de la aplicación y usa una imagen de debug aparte cuando sea necesario:

Terminal window
kubectl debug my-pod -it --image=nicolaka/netshoot --target=my-container

Esto es especialmente útil con imágenes mínimas, como los contenedores distroless o basados en scratch, que a menudo no incluyen un shell. Un contenedor de debug puede aportar herramientas como curl, dig, tcpdump, ss e ip sin modificar la imagen de producción.

Este enfoque también mantiene una separación clara: la imagen de la aplicación ejecuta el workload, mientras que la imagen de debug se usa solo durante sesiones de diagnóstico controladas.

4. Usa imágenes de depuración aprobadas y seguras

Las imágenes de debug suelen incluir herramientas potentes como tcpdump, strace, curl, dig, gestores de paquetes y utilidades de shell. Usa únicamente imágenes aprobadas de registros confiables.

Fija las versiones de las imágenes en lugar de usar tags flotantes:

Terminal window
kubectl debug my-pod -it --image=registry.example.com/debug-tools:1.4.2

Las imágenes aprobadas deben escanearse en busca de vulnerabilidades y mantenerse actualizadas. Deben contener las herramientas que tus equipos realmente necesitan, sin paquetes innecesarios.

El acceso también debe controlarse con RBAC. No todos los usuarios deberían poder crear contenedores efímeros, adjuntarse a workloads sensibles o iniciar sesiones de debug a nivel de nodo. La depuración de nodos puede exponer sistemas de archivos del host e información a nivel de sistema, así que debe limitarse a operadores de confianza; combínala con el flag --profile (restricted o baseline) siempre que sea posible para no otorgar más acceso del que la sesión necesita.

5. Limpia los pods de debug y documenta la sesión

Elimina los pods de debug copiados una vez terminado el diagnóstico para evitar acumulación y consumo innecesario de recursos.

Terminal window
kubectl delete pod my-pod-debug

Los contenedores efímeros agregados a pods existentes no se pueden eliminar de la especificación del pod, pero dejan de ejecutarse cuando termina la sesión de depuración. Los pods copiados, en cambio, permanecen en el clúster hasta que se eliminan.

Registra qué se revisó, qué comandos se ejecutaron y qué se encontró. Esto facilita la revisión del incidente y ayuda a mejorar los runbooks para futuros problemas.

Unas buenas notas deben incluir el pod o nodo afectado, la imagen de debug utilizada, la salida importante de los comandos y la causa final. Así otros Engineers evitan repetir la misma investigación más adelante.

Reduce la depuración manual corrigiendo de forma proactiva los riesgos de resiliencia con PerfectScale

Comandos como kubectl debug son esenciales cuando necesitas investigar en tiempo real un pod que falla, un proceso bloqueado o un problema a nivel de nodo, pero la mayoría de esos incidentes se remontan a configuraciones incorrectas de recursos que podrían haberse detectado antes. PerfectScale mejora de forma autónoma la resiliencia y el rendimiento de Kubernetes mediante el right-sizing de los workloads, previniendo caídas y optimizando el uso de recursos para lograr una disponibilidad del 99.99%, de modo que tu equipo dedique menos tiempo a abrir sesiones interactivas de debug y más tiempo a lanzar producto. En lugar de esperar a que un pod falle para recurrir a los contenedores efímeros, PerfectScale identifica y corrige de raíz los riesgos de resiliencia que provocan esos fallos.

Capacidades clave de PerfectScale:

  • Corrección automática de problemas: identifica y corrige al instante los riesgos de resiliencia para maximizar el tiempo de actividad y eliminar la latencia, previniendo errores de configuración (sin CPU request, sin memory request, sin memory limits) y problemas de aprovisionamiento insuficiente de recursos como OOM, CPU throttling y evictions.
  • Fortalecimiento de la infraestructura: ofrece visibilidad integral de tus nodos para detectar de forma proactiva configuraciones incorrectas, prevenir la sobreasignación de nodos con recomendaciones precisas de memory limits, validar node affinities y taints, y elegir los tipos de nodo más adecuados para tus pods.
  • Priorización basada en el impacto: enfoca a tu equipo en los problemas más críticos en tiempo real con priorización automática avanzada, y alinea las alertas con tus SLA y SLO para que los niveles de servicio se mantengan dentro del objetivo.
  • Alertas en tiempo real e integraciones de ticketing: envía notificaciones instantáneas a través de Slack, MS Teams o Datadog, y te permite escalar cualquier problema a un flujo de trabajo establecido creando un ticket con un solo clic.
  • Amplia cobertura de riesgos: detecta de forma continua evictions, errores de out of memory, sospechas de fugas de memoria, CPU throttling, reinicios de pods, HPA alcanzando el máximo de réplicas, y requests y limits de CPU y memoria insuficientes o sin definir.

Descubre cómo PerfectScale puede mantener estables tus clústeres y reducir la necesidad de diagnóstico manual en la plataforma de optimización de rendimiento de Kubernetes.

Preguntas frecuentes

¿Para qué sirve el comando kubectl debug?

kubectl debug sirve para diagnosticar workloads y nodos de Kubernetes de forma interactiva. Puede adjuntar un contenedor efímero a un pod en ejecución, crear una copia modificada de un pod que falla o lanzar un pod de debug en un nodo, todo sin necesidad de que la imagen objetivo incluya herramientas de depuración de fábrica.

¿Cómo uso kubectl debug en un pod?

Ejecuta kubectl debug <pod-name> -it --image=busybox para adjuntar un contenedor efímero de debug a un pod en ejecución. Agrega --target=<container-name> para compartir el namespace de procesos con un contenedor específico, o --copy-to=<new-pod-name> para depurar una copia en lugar del pod en vivo (útil con pods que fallan al arrancar).

¿Cómo uso kubectl debug en un nodo?

Ejecuta kubectl debug node/<node-name> -it --image=ubuntu para crear un pod de debug que se ejecuta en los namespaces del host del nodo con el sistema de archivos raíz del nodo montado en /host. Por defecto usa el perfil general, que no otorga acceso privilegiado; usa --profile=sysadmin si necesitas capacidades root completas.

¿Cuál es la sintaxis del comando kubectl debug?

La forma general es kubectl debug (POD | TYPE/NAME) [flags], usada habitualmente con --image para definir la imagen del contenedor de debug, -it para una terminal interactiva, --target para apuntar a un contenedor específico y --copy-to para depurar una copia del pod.

¿En qué se diferencia kubectl debug de kubectl exec?

kubectl exec ejecuta un comando dentro de un contenedor existente con la propia imagen del pod, así que solo funciona si esa imagen ya incluye las herramientas que necesitas. kubectl debug adjunta un contenedor (o pod) aparte con la imagen que elijas, algo esencial para contenedores mínimos o distroless que no tienen shell.

¿kubectl debug modifica el pod original o sus contenedores?

Agregar un contenedor efímero con kubectl debug no reinicia ni modifica los contenedores existentes del pod; solo agrega un contenedor temporal junto a ellos. Con --copy-to se va un paso más allá y se crea un pod aparte, dejando el original completamente intacto.

¿Debo limpiar los pods creados por kubectl debug?

Sí, en el caso de cualquier pod creado con --copy-to. Esos pods persisten en el clúster hasta que los eliminas con kubectl delete pod <debug-pod-name>. Los contenedores efímeros agregados directamente a un pod existente no requieren limpieza aparte: dejan de ejecutarse cuando termina la sesión, aunque siguen apareciendo en la especificación del pod.