Cómo investigar problemas de contenedores de Kubernetes con "Kubectl Debug"

Puede ser complicado diagnosticar problemas con la ejecución de cargas de trabajo de Kubernetes. Puede que tenga suerte y encuentre la causa en los registros de su aplicación, a través de la kubectl logs dominio. Sin embargo, en algunos casos no se puede evitar una sesión de depuración en vivo, en la que interactúa de forma interactiva con sus pods para descubrir problemas.

los kubectl debug El comando simplifica estas tareas de depuración al proporcionar un nuevo contenedor efímero dentro de su Pod. Esto se puede usar para inspeccionar el entorno del Pod para que pueda comenzar a solucionar los problemas que están surgiendo en sus contenedores existentes.

Índice de contenidos
  1. Preparación para usar la depuración de Kubectl
  2. Usando la depuración de Kubectl
  3. Copiando vainas
  4. Argumentos opcionales
  5. Conclusión

Preparación para usar la depuración de Kubectl

kubectl debug se lanzó con v1.18 de Kubernetes y Kubectl. Se basa en que los contenedores efímeros estén disponibles en su clúster. Los contenedores efímeros se convirtieron en una función beta en Kubernetes v1.23 y ahora están habilitados de forma predeterminada. Deberá habilitar manualmente la puerta de características si su clúster ejecuta una versión anterior de Kubernetes.

Los contenedores efímeros están diseñados para tareas transitorias en las que necesita conectar temporalmente un contenedor adicional a un Pod existente. Esto es ideal para operaciones de depuración en las que desea inspeccionar con precisión un pod sin afectar las instancias de contenedores en vivo.

La mayoría de las imágenes de contenedores carecen de herramientas de depuración; instalarlos dentro de un contenedor en ejecución mutaría su entorno y podría causar efectos secundarios. Adjuntar un contenedor efímero a su Pod es una forma más segura de depuración que le brinda un entorno de trabajo limpio. Puedes usar una imagen más pesada que incluya todas las herramientas que necesitas.

Aunque los contenedores efímeros pasan a formar parte de su Pod de acogida, todavía hay algunas diferencias a tener en cuenta. Los contenedores efímeros no admiten enlaces de puerto, sondeos ni reservas de recursos, ya que solo son de naturaleza temporal. Nunca se reiniciarán automáticamente y no se pueden cambiar una vez que se hayan creado. Una lista completa de capacidades admitidas está disponible en la documentación.

Usando la depuración de Kubectl

Antes de continuar, cree una implementación básica para usar con fines de prueba:

$ kubectl create deployment nginx --image=nginx:latest
deployment.apps/nginx created

A continuación, utilice el get pods Comando para encontrar el nombre del pod de su implementación:

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-55649fd747-qsnr2   1/1     Running   0          5s

El Pod de nuestro despliegue se llama nginx-55649fd747-qsnr2.

Ahora puedes usar el kubectl debug comando para iniciar una sesión de depuración dentro de su Pod:

$ kubectl debug -it --image=ubuntu:20.04 nginx-55649fd747-qsnr2

La sintaxis del comando es similar a un híbrido de kubectl create y kubectl debug. El argumento sin nombre proporcionado al comando identifica un Pod existente al que adjuntarlo. los --image El argumento especifica la imagen que se usará para el nuevo contenedor. estamos usando ubuntu:20.04 aquí para obtener acceso a los comandos familiares incluidos en la distribución Ubuntu Linux.

los -it bandera es equivalente a --stdin --tty. Incluir estos argumentos asignará un TTY al contenedor, lo adjuntará y conectará la transmisión estándar de su terminal. Esto le brinda un caparazón interactivo dentro de su nuevo contenedor.

Ahora puedes realizar tus tareas de depuración desde dentro de tu contenedor efímero.

Copiando vainas

Otra forma de usar kubectl debug es con un --copy-to argumento. Esto crea una copia del Pod de destino y agrega el contenedor efímero a la copia. El Pod original se deja intacto.

$ kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug nginx-555649fd747-qsnr2

Esta función le ofrece una seguridad aún mayor de que los cambios realizados durante la depuración no afectarán directamente a su aplicación de producción.

Copiar el Pod también le permite activar el uso compartido del espacio de nombres del proceso. Esto hace que los procesos existentes en su Pod sean visibles para su contenedor efímero. No se puede utilizar con contenedores existentes como su spec.shareProcessNamespace el campo generalmente se establecerá en false. Correr kubectl debug con el --copy-to y --share-processes flag permitirá compartir procesos en el Pod copiado, haciendo que este procedimiento sea mucho más intuitivo:

$ kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --share-processes nginx-555649fd747-qsnr2

La lista de procesos visible para su contenedor efímero de Ubuntu ahora incluirá un proceso NGINX:

$ ps ax
PID   USER     TIME  COMMAND
    1 root      0:00 /pause
    9 root      0:00 nginx: master process nginx -g daemon off;

Este proceso todavía se está ejecutando en el contenedor NGINX separado dentro de su Pod. El uso compartido de espacios de nombres también proporciona acceso al sistema de archivos del contenedor de destino a través de /proc:

$ ls /proc/9/root/etc/nginx
conf.d fastcgi_params mime.types modules nginx.conf ...

Por lo tanto, copiar el Pod de esta manera es una poderosa herramienta de depuración. Puede inspeccionar fácilmente los archivos y procesos del Pod usando un contenedor separado que está preparado con herramientas familiares.

Argumentos opcionales

los --copy-to flag siempre deja el Pod original intacto por defecto. Puede hacer que la operación actúe como un reemplazo en lugar de usar --replace. Esto detendrá el primer Pod.

$ kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --replace nginx-555649fd747-qsnr2

Kubernetes programará el Pod copiado en cualquier Nodo disponible. Esto puede ser problemático si desea garantizar un entorno de prueba coherente. agregando --same-node programará la copia en el Nodo del Pod existente, eliminando cualquier diferencia que pueda existir entre las máquinas en su clúster.

$ kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --same-node nginx-555649fd747-qsnr2

Otra opción útil es --env para establecer variables de entorno adicionales dentro de su contenedor efímero. Es posible que deba usar esto para configurar las herramientas de depuración o anular los valores heredados de su pod de destino.

$ kubectl debug -it --image=ubuntu:20.04 --copy-to nginx-debug --env EDITOR=/usr/bin/nano nginx-555649fd747-qsnr2

Finalmente, recuerda que los contenedores creados por kubectl debug no tiene que ser interactivo. Puede ejecutar fácilmente comandos únicos contra sus Pods usando kubectl exec-como sintaxis. los --attach Se admite el argumento para controlar si su shell está conectado al contenedor cuando no está ejecutando con -i (--stdin).

$ kubectl debug --image=ubuntu:20.04 --copy-to nginx-debug --share-processes --attach true nginx-555649fd747-qsnr2 -- ls /proc/9/root/etc/nginx
conf.d fastcgi_params mime.types modules nginx.conf ...

Conclusión

Contenedores efímeros y el kubectl debug El comando proporciona una experiencia de depuración simplificada para las cargas de trabajo de Kubernetes. Puede ejecutar comandos dentro de un Pod usando una imagen diferente a sus contenedores regulares. Esto le permite acceder a herramientas de depuración que no están incluidas en la imagen de su aplicación.

kubectl debug También puede crear copias de Pods y compartir sus procesos con el original. Este mecanismo le permite inspeccionar los procesos en los contenedores del Pod de destino, desde un contenedor efímero separado sobre el que tiene control total. Proporciona opciones de depuración más avanzadas cuando necesita interrogar procesos en ejecución.

Descubre más contenido

Subir
DiarioInforme utiliza cookies    Configurar y más información
Privacidad
Change privacy settings