Depura aplicaciones de Kubernetes en Cloud Code para Cloud Shell

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Cloud Code te permite depurar con facilidad una aplicación implementada en un clúster de Kubernetes mediante skaffold debug.

Puedes depurar tu aplicación en un clúster local (como Minikube o Docker Desktop), Google Kubernetes Engine (GKE) o cualquier otro proveedor de servicios en la nube.

Con la asistencia de depuración de Cloud Code, no tienes que completar la configuración manual, como configurar la redirección de puertos o insertar argumentos de depuración específicos de idioma. La depuración requiere una aplicación de Kubernetes lista para usar con Cloud Code que incluya un archivo de configuración skaffold.yaml y una configuración de inicio cloudcode.kubernetes.

Depura una aplicación

  1. Haz clic en Barra de estado de Cloud Code Cloud Code en la barra de estado y, luego, en Debug on Kubernetes.
  2. Si tu aplicación no tiene la configuración de Skaffold necesaria o la configuración de inicio de cloudcode.kubernetes, Cloud Code te ayuda a configurarlas.
  3. Confirma si deseas usar el contexto de Kubernetes actual para ejecutar la aplicación (o cambia a una preferida).
  4. Si eliges un clúster remoto como contexto, cuando se te solicite, elige un registro de imagen al que se envíen las imágenes. Si usas Container Registry, puedes navegar a un registro existente o especificar el nombre de un registro que se creará. Si tu proyecto tiene la API de Artifact Registry habilitada y al menos un repositorio de Artifact Registry, puedes explorar y seleccionar un repositorio de Artifact Registry existente.

    En los siguientes ejemplos, se muestra cómo especificar dónde se almacenan las imágenes de contenedor para algunos registros comunes:

    Artifact Registry {region}-docker.pkg.dev/{project_id}/{repo-name}
    Container Registry gcr.io/{project_id}
    Docker Hub docker.io/{account}
    Asegúrate de estar autenticado de forma correcta si usas un repositorio privado de Docker Hub.

    Para generar el nombre final del repositorio de imágenes, Cloud Code concatena este registro de imágenes con el nombre de la imagen especificado en los manifiestos de Kubernetes. Esta opción se almacena en la configuración de inicio de cloudcode.kubernetes (se encuentra en .vscode/launch.json).

    Para obtener más información, consulta la guía de manejo del registro de imágenes.

    A continuación, Cloud Code compila los contenedores, los envía al registro, aplica las configuraciones de Kubernetes al clúster y espera el lanzamiento.

    Cuando finaliza el lanzamiento, Cloud Code redirecciona automáticamente todos los puertos de contenedor declarados a tu máquina y muestra las URL en la ventana de resultado para que puedas explorar la aplicación en vivo.

  5. Para cada contenedor depurable de tu aplicación, confirma o ingresa el directorio en el contenedor remoto en el que se encuentra el programa que deseas depurar.

    Como alternativa, puedes presionar ESC para omitir la depuración del contenedor.

    Solicitud raíz remoto

    Cloud Code adjunta una sesión de depuración para cada contenedor depurable en la aplicación.

    Ahora puedes realizar las mismas tareas que sueles hacer cuando depuras código local, como establecer puntos de interrupción y revisar el código paso a paso, en un clúster activo de Kubernetes.

    De forma predeterminada, cuando un cambio en tu aplicación se guarda de forma automática, Cloud Code vuelve a implementarla y configura una nueva sesión de depuración. Puedes activar o desactivar esta función con la marca watch en la configuración de inicio del proyecto.

  6. Usa la barra lateral de depuración para revisar la información sobre las variables y la pila. Usa la consola de depuración ubicada en el depurador del panel inferior si deseas interactuar con la sesión de depuración.

  7. Una vez que se complete la sesión, puedes usar los siguientes comandos del menú contextual:

    • Abrir registros de implementación: abre los registros de la aplicación de una implementación específica con el explorador de registros de Cloud Code.
    • Abrir URL de servicio: abre la URL de servicio de aplicación de un servicio específico en un navegador web.
  8. Si desactivaste el modo de reproducción en la configuración de inicio y quieres realizar cambios en tu aplicación y volver a compilarla y, luego, volver a implementarla, en el panel Development sessions, pausa la acción run y, luego, haz clic en Ícono de vuelve a compilar e implementar Rebuild and redeploy the application.

  9. Con el objetivo de finalizar la sesión de depuración, haz clic en Ícono de detención de depuración Detener en la barra de herramientas de depuración.

    Una vez que finalizas la sesión de depuración, todos los recursos de Kubernetes implementados se borran del clúster.

Detalles de configuración

Cloud Code, con la tecnología de Skaffold, controla automáticamente los siguientes detalles de configuración para todos los lenguajes compatibles:

  • Redireccionar el puerto de depuración para poder conectar el depurador
  • Conectar un depurador a uno o más contenedores depurables en tu aplicación. Si tu aplicación tiene varios contenedores depurables (los contenedores cuyo lenguaje es compatible con la depuración de Cloud Code) configurados en skaffold.yaml, se adjunta un depurador a cada contenedor depurable.
  • Conservar las definiciones de asignación de origen en las sesiones. Puedes editar el archivo .vscode/launch.json directamente para personalizar estas definiciones.

Cloud Code también controla los siguientes detalles de configuración específicos del lenguaje:

Node.js

Reescribe el punto de entrada que se invocará:

node --inspect=localhost:9229

Python

Instala el módulo ptvsd mediante un contenedor Init y reescribe el punto de entrada que se invocará:

python -m ptvsd --host localhost --port 5678

Comienza a usarlo

Instala el depurador dlv mediante un contenedor Init y reescribe el punto de entrada de modo que la sesión de depuración iniciada se ejecute solo con un servidor de depuración (en modo sin interfaz gráfica) continúa el proceso de depuración en el inicio, acepta varias conexiones de clientes y escucha en localhost:56268:

dlv exec --headless --continue --accept-multiclient --listen=localhost:56268 --api-version=2, <app> --

Java

Agregar un entorno JAVA_TOOLS_OPTIONS con la configuración apropiada del protocolo de conexión Wi-Fi (JDWP) de Java para que el agente de depuración de JDWP escuche una conexión de socket en el puerto 5005 y permita que la VM comience a ejecutarse antes de conectar el depurador:

jdwp=transport=dt_socket,server=y,suspend=n,address=5005,quiet=y

Para obtener más detalles sobre la depuración con la tecnología de Skaffold, consulta la documentación de skaffold debug.

Adjunta un depurador a un pod de Kubernetes

Cloud Code para Cloud Shell admite la conexión de un depurador a un pod de Kubernetes para Node.js, Python, Go, Java y .NET. Todo lo que necesitas es un contenedor depurable y una configuración de conexión del tipo cloudcode.kubernetes.

Para obtener información sobre cómo la conexión a un pod de Kubernetes difiere de la opción Depurar una aplicación de Kubernetes, consulta Cómo adjuntar un pod de Kubernetes y depurar una aplicación de Kubernetes.

Configura el contenedor

A fin de preparar tu contenedor para la depuración, sigue las instrucciones según el lenguaje que uses:

Node.js

  • Inicia la aplicación Node.js con --inspect=<debugPort>, en el que debugPort proviene de la configuración de conexión. Por ejemplo: CMD ["node", "--inspect=9229", "index.js"]

Python

  • Asegúrate de tener instalado el módulo ptvsd en tu máquina y en tu contenedor.
  • Inicia la aplicación de Python a través de ptvsd. Haz coincidir el puerto especificado con el campo debugPort en la configuración de conexión. Por ejemplo:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]
    

Comienza a usarlo

  • Asegúrate de tener instalado el paquete dlv en tu máquina y en el contenedor de Go.
  • Inicia tu aplicación de Go a través de dlv debug.

    El puerto especificado en el comando de inicio debe ser el mismo que el valor del atributo debugPort en la configuración de conexión. Por ejemplo:

    CMD ["dlv", "debug", "--headless", "--listen=:<debugPort>", "--log"]
    

    Sugerencia para solucionar problemas: Cuando depures una aplicación de Go, esta se paralizará y esperará a que se adjunte un depurador. Adjunta un depurador para que el servicio se inicie.

Java

  • Asegúrate de que la JVM esté instalada en tu máquina.
  • Inicia la aplicación de Java con las siguientes opciones, en las que debugPort proviene de la configuración de conexión.

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=,quiet=y
    

    Por ejemplo, para iniciar la aplicación de Java en modo de depuración y escuchar la conexión en el puerto debugPort:

    ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<debugPort>,quiet=y", "-jar", "my-app-1.0.jar"]
    

.NET Core

  • Asegúrate de tener instalado vsdbg, el depurador de línea de comandos de .NET Core de Microsoft, en tu contenedor de Kubernetes.

    Por ejemplo:

    RUN apt-get update 
    && apt-get install -y --no-install-recommends unzip
    && apt-get install -y procps
    && rm -rf /var/lib/apt/lists/*
    && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /dbg/netcore/vsdbg

Establece la configuración de conexión

Para adjuntar a un contenedor depurable, debes tener una configuración de conexión del tipo cloudcode.kubernetes.

Agrega un archivo .vscode/launch.json

Si tu proyecto no tiene un archivo launch.json en su carpeta .vscode, puedes agregar uno mediante el panel “Depurar”.

  1. Para navegar al panel Depurar, haz clic en Ícono Depurar Depurar en la barra de actividades.

  2. Seleccione Agregar configuración en el menú desplegable.

  3. Selecciona Cloud Code: Kubernetes como entorno.

    Configura Cloud Code: Kubernetes como el entorno.

  4. Selecciona la opción Adjuntar al pod de Kubernetes.

    Selecciona la opción de configuración de Kubernetes

  5. Selecciona el lenguaje de programación que usas.

    Esto crea y abre un archivo launch.json para tu proyecto y crea una configuración de conexión.

  6. Actualiza los atributos de configuración en el archivo launch.json para que coincidan con los del proyecto. Para obtener más información sobre los atributos de configuración, consulta Atributos de configuración.

Agrega una configuración de archivo adjunto a tu archivo .vscode/launch.json

Para agregar una nueva configuración de conexión a un archivo .vscode/launch.json existente, haz lo siguiente:

  1. Abre el archivo launch.json.
  2. Para invocar el fragmento Intellisense, haga clic en Agregar configuración.
  3. Para agregar una configuración de conexión, selecciona el fragmento Cloud Code: Adjuntar a pod de Kubernetes para el lenguaje que usas.
  4. Actualiza los atributos en la configuración para que coincidan con los de tu proyecto. Para obtener más información sobre los atributos de configuración, consulta Atributos de configuración.

Atributos de la configuración

Atributo Descripción
debugPort Puerto de depuración usado en el contenedor.
podSelector Conjunto de pares clave-valor que se usan para seleccionar el pod de depuración. Para obtener más información, consulta la guía sobre selectores. En el siguiente ejemplo, se muestra un `podSelector` típico:

"podSelector": { "app": <deployment-name> }

localRoot La ruta de acceso al directorio local que contiene el programa en depuración. La configuración predeterminada es ${workspaceFolder}.
remoteRoot La ruta de acceso absoluta del directorio remoto que contiene el programa en depuración (en el contenedor de Kubernetes).

Adjunta un depurador a su pod de Kubernetes

Después de establecer la configuración y el contenedor, haz lo siguiente:

  1. Para navegar al panel Depurar, haz clic en Ícono Depurar Depurar en la barra de actividades.
  2. Para iniciar y seleccionar la configuración, presiona F5.

    • localhost:${debugPort} se redirecciona a debugPort en el contenedor durante la depuración.

    La sesión de depuración ya se configuró de manera correcta. Puedes realizar las tareas que sueles hacer cuando depuras código local, como establecer interrupciones y revisar el código.

  3. Usa la barra lateral de depuración para revisar la información sobre las variables y la pila. Usa la consola de depuración ubicada en el depurador del panel inferior si deseas interactuar con la sesión de depuración.

  4. Para finalizar la sesión de depuración, haz clic en Ícono de detención de depuración Detener en la barra de herramientas de depuración.

Comparación entre un depurador a un pod y una aplicación de Kubernetes

Adjuntar a un pod de Kubernetes Depurar una aplicación de Kubernetes
Depura un solo pod de Kubernetes. Depura todos los contenedores depurables en la aplicación.
La aplicación debe ejecutarse en el pod de Kubernetes antes de depurar. Ejecuta la aplicación en el clúster de Kubernetes y adjunta el depurador.
Usa configuration (.vscode/launch.json) del tipo "cloudcode.kubernetes" y solicita "attach". Usa configuration (.vscode/launch.json) del tipo “cloudcode.kubernetes” y solicita “iniciar”.
Para obtener más información, consulta Comparación entre configuraciones de lanzamiento y de conexión.
Configuración de muestra:

{
  "name": "Attach to Kubernetes Pod (NodeJS)",
  "type": "cloudcode.kubernetes",
  "request": "attach",
  "language": "Node",
  "debugPort": 9229,
  "podSelector": {
     "app": "hello-world"
  },
  "localRoot": "${workspaceFolder}",
  "remoteRoot": "/app"
}
Configuración de muestra:

{
  "name": "Run/Debug on Kubernetes",
  "type": "cloudcode.kubernetes",
  "request": "launch",
  "skaffoldConfig": "${workspaceFolder}/skaffold.yaml",
  "watch": true,
  "cleanUp": true,
  "portForward": true
}
Esta configuración no se puede usar para ejecutar la aplicación. Esta configuración se puede usar para ejecutar o depurar la aplicación.
Esta configuración es específica del lenguaje. Esta configuración es independiente del lenguaje.
No hay un comando exclusivo. Debug on Kubernetes (Depurar en Kubernetes).

¿Qué sigue?