Esegui il debug delle applicazioni Kubernetes con Cloud Code for VS Code

Cloud Code ti consente di eseguire il debug di un'applicazione di cui è stato eseguito il deployment in un cluster Google Kubernetes Engine (GKE) sfruttando skaffold debug.

Puoi eseguire il debug dell'applicazione su un cluster locale (come minikube o Docker Desktop), GKE o qualsiasi altro provider cloud.

Con il supporto per il debug di Cloud Code, non è necessario completare la configurazione manuale, ad esempio la configurazione del port forwarding o l'iniezione di argomenti di debug specifici per il linguaggio. Il debug richiede un'applicazione GKE Cloud Code-ready che includa un file di configurazione skaffold.yaml e una configurazione di lancio cloudcode.kubernetes.

Eseguire il debug di un'applicazione GKE

Per iniziare a eseguire il debug dell'applicazione GKE, segui questi passaggi:

  1. Nella barra di stato di Cloud Code, fai clic sul nome del progetto attivo.

    Nome del progetto attivo nella barra di stato

  2. Nel menu Scelta rapida visualizzato, seleziona Esegui il debug su Kubernetes.

  3. Se richiesto, autentica le tue credenziali per eseguire e eseguire il debug di un'applicazione.

  4. Se la tua applicazione non dispone della configurazione Skaffold o della configurazione di lancio cloudcode.kubernetes necessaria, Cloud Code ti aiuta a configurarle.

  5. Conferma se utilizzare il contesto Kubernetes corrente per eseguire l'app (o passa a quello che preferisci).

  6. Se hai scelto un cluster remoto come contesto, quando richiesto, scegli un registry di immagini a cui inviare le immagini. Se utilizzi Container Registry, puoi accedere a un registry esistente o specificare il nome di un registry da creare. Se nel tuo progetto è abilitata l'API Artifact Registry e hai almeno un repository Artifact Registry, puoi sfogliare e selezionare un repository Artifact Registry esistente.

    Gli esempi riportati di seguito mostrano come specificare dove vengono memorizzate le immagini dei contenitori per alcuni registry comuni:

    Artifact Registry {region}-docker.pkg.dev/{project_id}/{repo-name}
    Container Registry gcr.io/{project_id}
    Docker Hub docker.io/{account}
    Assicurati di essere adeguatamente autenticato se utilizzi un repository Docker Hub privato.
    Repository di contenitori AWS (ECR) {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{my-app}
    Azure Container Registry (ACR) {my_acr_name}.azurecr.io/{my-app}

    Per generare il nome del repository dell'immagine finale, Cloud Code concatena questo registry delle immagini con il nome dell'immagine specificato nei manifest di Kubernetes. Questa scelta viene memorizzata nella configurazione di lancio cloudcode.kubernetes (disponibile in .vscode/launch.json).

    Per saperne di più, consulta la guida alla gestione del registry delle immagini.

    Cloud Code crea i container, li invia al registry, applica le configurazioni Kubernetes al cluster e attende l'implementazione.

    Dopo l'implementazione, Cloud Code inoltra automaticamente tutte le porte del contenitore dichiarate alla tua macchina e mostra gli URL nella finestra di output in modo da poter sfogliare l'applicazione in produzione.

  7. Per ogni contenitore di debug nella tua applicazione, conferma o inserisci la directory nel contenitore remoto in cui si trova il programma da eseguire il debug.

    In alternativa, puoi premere ESC per saltare il debug del contenitore.

    Prompt di root remoto

    Cloud Code collega una sessione di debug per ogni container di cui è possibile eseguire il debug nell'applicazione.

    Ora puoi eseguire le stesse attività che normalmente esegui durante il debug del codice locale, come impostare i breakpoint ed eseguire il codice passo passo, su un cluster Kubernetes attivo.

    Per impostazione predefinita, quando salvi una modifica all'applicazione, Cloud Code esegue il redeployment dell'applicazione e configura una nuova sessione di debug. Puoi attivare/disattivare questa funzionalità con il flag watch nella configurazione di lancio del progetto.

  8. Per ispezionare le variabili e le informazioni sullo stack, utilizza la barra laterale di debug. Per interagire con la sessione di debug, utilizza la console di debug nel riquadro del debugger in basso.

  9. Al termine della sessione, puoi utilizzare i seguenti comandi del menu contestuale:

    • Apri log di deployment:apri i log dell'applicazione di un deployment specifico con Esplora log di Cloud Code.
    • Apri URL servizio:apri l'URL del servizio di applicazione di un servizio specifico in un browser web
  10. Se hai disattivato la modalità di visualizzazione nella configurazione di lancio e vuoi apportare modifiche all'applicazione, ricrearla e reimplementarla, nel riquadro Sessioni di sviluppo, metti in pausa l'azione di esecuzione e poi fai clic su Icona Riesegui la build ed esegui nuovamente il deployment Ricompila e reimplementa l'applicazione.

  11. Per terminare la sessione di debug, fai clic su Icona di interruzione del debug Interrompi nella barra degli strumenti di debug.

    Al termine della sessione di debug, tutte le risorse Kubernetes di cui è stato eseguito il deployment vengono eliminate dal cluster.

Dettagli configurazione

Cloud Code, basato su Skaffold, gestisce automaticamente i seguenti dettagli di configurazione per tutti i linguaggi supportati:

  • Esegui il port forwarding della porta di debug in modo che il debugger possa essere collegato.
  • Collega un debugger a uno o più container di debug nella tua applicazione. Se la tua applicazione ha più container di cui è possibile eseguire il debug (container il cui linguaggio è supportato dal debug di Cloud Code) configurati in skaffold.yaml, a ogni container di cui è possibile eseguire il debug è associato un debugger.
  • Mantenimento delle definizioni di mappatura delle origini tra le sessioni. Puoi personalizzare queste definizioni modificando direttamente il file .vscode/launch.json.

Cloud Code gestisce anche i seguenti dettagli di configurazione specifici per la lingua:

Node.js

Riscrivere l'entry point da chiamare:

node --inspect=localhost:9229

Python

Installazione del modulo ptvsd utilizzando un container di inizializzazione e riscrittura del punto di contatto da chiamare:

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

Vai

Installazione del debugger dlv utilizzando un contenitore Init e riscrittura dell'entrypoint in modo che la sessione di debugging avviata venga eseguita solo con un server di debug (in modalità headless), continui il processo sottoposto a debug all'avvio, accetti più connessioni client e ascolti su localhost:56268:

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

Java

Aggiunta di un ambiente JAVA_TOOLS_OPTIONS con la configurazione appropriata del protocollo JDWP (Java Debug Wire Protocol) in modo che l'agente di debug JDWP ascolti una connessione socket sulla porta 5005 e consenta alla VM di iniziare l'esecuzione prima del collegamento del debugger:

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

Per ulteriori dettagli sul debug basato su Skaffold, consulta la documentazione di skaffold debug.

Configura il contenitore

Per preparare il contenitore per il debug, segui le istruzioni per il linguaggio che stai utilizzando:

Node.js

  • Avvia l'applicazione Node.js con --inspect=<debugPort> dove debugPort proviene dalla configurazione dell'attacco. Ad esempio: CMD ["node", "--inspect=9229", "index.js"]

Python

  • Assicurati di avere installato il modulo ptvsd sulla tua macchina e nel tuo contenitore.
  • Avvia l'applicazione Python tramite ptvsd. Abbina la porta specificata al campo debugPort nella configurazione dell'attacco. Ad esempio:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]

Vai

  • Assicurati di avere installato il pacchetto dlv sulla tua macchina e nel tuo contenitore Go.
  • Avvia la tua applicazione Go tramite dlv debug.

    La porta specificata nel comando di avvio deve corrispondere al valore dell'attributo debugPort nella configurazione dell'attacco. Ad esempio:

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

    Suggerimento per la risoluzione dei problemi:durante il debug di un'applicazione Go, l'applicazione si arresta e attende l'attacco di un debugger. Collega un debugger per avviare il servizio.

Java

  • Assicurati che la JVM sia installata sulla tua macchina.
  • Avvia l'applicazione Java con le seguenti opzioni, dove debugPort proviene dalla configurazione dell'attacco.

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

    Ad esempio, per avviare l'applicazione Java in modalità di debug e ascoltare sulla porta debugPort per la connessione:

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

.NET Core

  • Assicurati di avere installato vsdbg, il debugger a riga di comando .NET Core di Microsoft, nel contenitore Kubernetes.

    Ad esempio:

    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

Configura la configurazione dell'attacco

Per eseguire l'attacco a un contenitore di cui è possibile eseguire il debug, devi disporre di una configurazione di attacco di tipo cloudcode.kubernetes.

Aggiungi un file .vscode/launch.json

Se il progetto non ha un file launch.json nella cartella .vscode, puoi aggiungerne uno utilizzando il riquadro di debug.

  1. Per accedere al riquadro di debug, fai clic su Icona di debug Esegui e debug nella barra delle attività.

  2. Seleziona Aggiungi configurazione dal menu a discesa.

  3. Seleziona Cloud Code: Kubernetes come ambiente.

    Impostazione di Cloud Code: Kubernetes come ambiente

  4. Seleziona l'opzione Collega al pod Kubernetes.

    Seleziona l&#39;opzione di configurazione di Kubernetes

  5. Seleziona il linguaggio di programmazione che stai utilizzando.

    Verrà creato e aperto un file launch.json per il progetto e verrà creata una configurazione di allegato.

  6. Aggiorna gli attributi di configurazione nel file launch.json in modo che corrispondano a quelli del tuo progetto. Per ulteriori informazioni sugli attributi di configurazione, consulta Attributi di configurazione.

Aggiungi una configurazione di attacco al file .vscode/launch.json

Per aggiungere una nuova configurazione di allegato a un file .vscode/launch.json esistente:

  1. Apri il file launch.json.
  2. Per richiamare Intellisense dello snippet, fai clic su Aggiungi configurazione.
  3. Per aggiungere una configurazione di attacco, seleziona lo snippet Cloud Code: esegui il collegamento al pod Kubernetes per il linguaggio in uso.
  4. Aggiorna gli attributi nella configurazione in modo che corrispondano a quelli del progetto. Per ulteriori informazioni sugli attributi di configurazione, consulta Attributi di configurazione.

Attributi di configurazione

Attributo Descrizione
debugPort Porta di debug utilizzata nel contenitore.
podSelector Insieme di coppie chiave-valore utilizzate per selezionare il pod di debug. Per ulteriori informazioni, consulta la guida sui selettori. Il seguente esempio mostra un podSelector tipico:

"podSelector": { "app": <deployment-name> }
localRoot Percorso della directory locale contenente il programma sottoposto a debug. Il valore predefinito è ${workspaceFolder}.
remoteRoot Percorso assoluto della directory remota contenente il programma sottoposto a debugging (nel contenitore Kubernetes).

Collega un debugger al pod Kubernetes

Cloud Code per VS Code supporta l'attacco di un debugger a un pod Kubernetes per Node.js, Python, Go, Java e .NET. Tutto ciò che ti serve è un container di debug e una configurazione di attacco di tipo cloudcode.kubernetes.

Per informazioni sulle differenze tra l'attacco a un pod Kubernetes e il debugging di un'applicazione Kubernetes, consulta Differenze tra l'attacco di un debugger a un pod e il debugging di un'applicazione Kubernetes.

Per collegare un debugger al pod Kubernetes:

  1. Per accedere al riquadro di debug, fai clic su Icona di debug Esegui e debug nella barra delle attività.
  2. Seleziona e avvia la configurazione premendo F5.

    • localhost:${debugPort} viene inoltrata a debugPort sul contenutore durante il debug.

    La sessione di debug è stata configurata correttamente. Puoi eseguire le attività che normalmente esegui durante il debug del codice locale, ad esempio impostare i breakpoint e eseguire il codice passo passo.

  3. Per ispezionare le variabili e le informazioni sullo stack, utilizza la barra laterale di debug. Per interagire con la sessione di debug, utilizza la console di debug nel riquadro del debugger in basso.

  4. Per terminare la sessione di debug, fai clic su Icona di interruzione del debug Interrompi nella barra degli strumenti di debug.

Differenza tra l'attacco di un debugger a un pod e il debug di un'applicazione Kubernetes

Collegamento a un pod Kubernetes Eseguire il debug di un'applicazione Kubernetes
Esegue il debug di un singolo pod Kubernetes. Esegui il debug di tutti i container di debug nell'applicazione.
L'applicazione deve essere in esecuzione nel pod Kubernetes prima del debug. Esegue l'applicazione sul cluster Kubernetes e collega il debugger.
Utilizza la configurazione (.vscode/launch.json) di tipo cloudcode.kubernetes e la richiesta attach. Utilizza la configurazione (.vscode/launch.json) di tipo cloudcode.kubernetes e la richiesta launch.
Per ulteriori informazioni, consulta la sezione Configurazioni di lancio e di attacco.
Configurazione di esempio:
{
  "name": "Attach to Kubernetes Pod (NodeJS)",
  "type": "cloudcode.kubernetes",
  "request": "attach",
  "language": "Node",
  "debugPort": 9229,
  "podSelector": {
     "app": "hello-world"
  },
  "localRoot": "${workspaceFolder}",
  "remoteRoot": "/app"
}
Configurazione di esempio:
{
  "name": "Run/Debug on Kubernetes",
  "type": "cloudcode.kubernetes",
  "request": "launch",
  "skaffoldConfig": "${workspaceFolder}/skaffold.yaml",
  "watch": true,
  "cleanUp": true,
  "portForward": true
}
Questa configurazione non può essere utilizzata per eseguire l'applicazione. Questa configurazione può essere utilizzata per eseguire o eseguire il debug dell'applicazione.
Questa configurazione è specifica per la lingua. Questa configurazione non è specifica per la lingua.
Nessun comando dedicato. Comando Esegui il debug su Kubernetes.
La modalità di visualizzazione non è disponibile, quindi dopo aver apportato le modifiche devi riavviare manualmente il debugger. La modalità di visualizzazione consente a Cloud Code di riavviare il debugger dopo aver salvato le modifiche.

Passaggi successivi

Richiedi assistenza

Per inviare feedback, segnala i problemi su GitHub o fai una domanda su Stack Overflow.