Eseguire il debug delle applicazioni Kubernetes in Cloud Code per Cloud Shell

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.

Grazie al supporto del debug di Cloud Code, non devi completare la configurazione manuale, ad esempio impostare l'inoltro delle porte o inserire argomenti di debug specifici per la lingua. Il debug richiede un'applicazione GKE pronta per Cloud Code che includa un file di configurazione skaffold.yaml e una configurazione di avvio 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 Selezione rapida visualizzato, seleziona Debug su Kubernetes.

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

  4. Conferma se utilizzare il contesto Kubernetes attuale per eseguire l'app (o passare a uno preferito).

  5. Se hai scelto un cluster remoto come contesto, quando ti viene richiesto, scegli un registro di immagini a cui eseguire il push delle immagini.

    Se il tuo progetto ha l'API Artifact Registry abilitata e almeno un repository Artifact Registry, puoi sfogliare e selezionare un repository Artifact Registry esistente.

    Gli esempi seguenti mostrano come specificare dove vengono archiviate le immagini container per alcuni registri comuni:

    Artifact Registry REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME
    Docker Hub docker.io/ACCOUNT
    Assicurati di essere autenticato correttamente se utilizzi un repository Docker Hub privato.

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

    Per maggiori informazioni, consulta la guida alla gestione del registro delle immagini.

    Cloud Code crea i container, li invia al registro, applica le configurazioni Kubernetes al cluster e attende il rollout.

    Dopo l'implementazione, Cloud Code esegue automaticamente il port forwarding di tutte le porte del container dichiarate sulla tua macchina e mostra gli URL nella finestra di output in modo che tu possa sfogliare l'applicazione live.

  6. Per ogni container di cui è possibile eseguire il debug nell'applicazione, conferma o inserisci la directory nel container remoto in cui si trova il programma di cui vuoi 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 svolgi normalmente durante il debug del codice locale, ad esempio impostare punti di interruzione ed eseguire il codice passo passo, su un cluster Kubernetes live.

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

  7. Per esaminare 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 inferiore del debugger.

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

    • Apri i log di deployment:apri i log dell'applicazione di un deployment specifico con Esplora log di Cloud Code.
    • Apri URL servizio:apre l'URL del servizio dell'applicazione di un servizio specifico in un browser web
  9. Se hai disattivato la modalità di osservazione nella configurazione di avvio e vuoi apportare modifiche all'applicazione e ricompilarla e rieseguire il deployment dell'applicazione, nel riquadro Sessioni di sviluppo, metti in pausa l'azione di esecuzione e poi fai clic su Icona Ricrea ed esegui nuovamente il deployment Ricompila e riesegui il deployment dell'applicazione.

  10. 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:

  • Port forwarding della porta di debug in modo che il debugger possa essere collegato.
  • Collegamento di un debugger a uno o più container di cui è possibile eseguire il debug nell'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, viene collegato un debugger a ogni container di cui è possibile eseguire il debug.
  • 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 della lingua:

Node.js

Riscrivere l'entry point per richiamare:

node --inspect=localhost:9229

Python

Installazione del modulo ptvsd utilizzando un container init e riscrivendo il punto di ingresso per richiamare:

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

Go

Installazione del debugger dlv utilizzando un contenitore di inizializzazione e riscrivendo il punto di ingresso in modo che la sessione di debug avviata venga eseguita solo con un server di debug (in modalità headless), continui il processo di cui è stato eseguito il 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

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

  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 di collegamento. Ad esempio: CMD ["node", "--inspect=9229", "index.js"]

Python

  • Assicurati di aver installato il modulo ptvsd sulla tua macchina e nel tuo container.
  • Avvia l'applicazione Python tramite ptvsd. Corrisponde alla porta specificata al campo debugPort nella configurazione di collegamento. Ad esempio:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]

Go

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

    La porta specificata nel comando iniziale deve corrispondere al valore dell'attributo debugPort nella configurazione di collegamento. 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 interromperà e attenderà 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 di collegamento.

    -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 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 aver installato vsdbg, il debugger della 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 di collegamento

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

Aggiungi un file .vscode/launch.json

Se il tuo progetto non ha un file launch.json nella cartella .vscode, puoi aggiungerne uno utilizzando il pannello Debug.

  1. Per passare al riquadro Debug, fai clic su Icona di debug 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 a pod Kubernetes.

    Seleziona l&#39;opzione di configurazione di Kubernetes

  5. Seleziona il linguaggio di programmazione che stai utilizzando.

    In questo modo viene creato e aperto un file launch.json per il tuo progetto e viene creata una configurazione di collegamento.

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

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

Per aggiungere una nuova configurazione di collegamento 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 collegamento, seleziona lo snippet Cloud Code: Attach to Kubernetes Pod per la lingua che stai utilizzando.
  4. Aggiorna gli attributi nella configurazione in modo che corrispondano a quelli del tuo progetto. Per saperne di più sugli attributi di configurazione, consulta Attributi di configurazione.

Attributi di configurazione

Attributo Descrizione
debugPort Porta di debug utilizzata sul container.
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 tipico podSelector:

"podSelector": { "app": <deployment-name> }
localRoot Percorso della directory locale contenente il programma di cui viene eseguito il debug. Il valore predefinito è ${workspaceFolder}.
remoteRoot Percorso assoluto della directory remota contenente il programma di cui viene eseguito il debug (nel container Kubernetes).

Collega un debugger al pod Kubernetes

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

Per informazioni su come il collegamento a un pod Kubernetes differisce dal debug di un'applicazione Kubernetes, consulta Come il collegamento di un debugger a un pod differisce dal debug di un'applicazione Kubernetes.

Per collegare un debugger al pod Kubernetes, esegui le seguenti attività:

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

    • localhost:${debugPort} viene inoltrata alla porta debugPort sul container durante il debug.

    La sessione di debug è stata configurata correttamente. Puoi eseguire le attività che normalmente esegui durante il debug del codice locale, come impostare punti di interruzione ed eseguire il codice passo passo.

  3. Per esaminare 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 inferiore del debugger.

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

Differenze tra il collegamento di un debugger a un pod e il debug di un'applicazione Kubernetes

Collegati a un pod Kubernetes Eseguire il debug di un'applicazione Kubernetes
Esegue il debug di un singolo pod Kubernetes. Esegue il debug di tutti i container di cui è possibile eseguire il 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, vedi Configurazioni di avvio e collegamento.
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 Debug on Kubernetes.

Passaggi successivi