Debug delle applicazioni Kubernetes con Cloud Code for VS Code

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

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

Con il supporto del debug di Cloud Code, non devi completare la configurazione manuale come l'impostazione del port forwarding o dell'inserimento di argomenti di debug specifici per un linguaggio. Il debug richiede un'applicazione GKE predisposta per Cloud Code che include un file di configurazione skaffold.yaml e una configurazione di lancio di cloudcode.kubernetes.

Debug di un'applicazione GKE

Per iniziare a eseguire il debug della tua 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 richiesto, autentica le credenziali per eseguire ed eseguire il debug di un'applicazione in locale.

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

  5. Conferma se utilizzare l'attuale contesto Kubernetes in cui eseguire l'app (o passa a uno preferito).

  6. Se hai scelto un cluster remoto come contesto, quando richiesto, scegli un registro di immagini in cui eseguire il push delle immagini. Se usi Container Registry, puoi passare a un registro esistente o specificare il nome di un registro da creare. Se nel progetto sono presenti l'API Artifact Registry abilitata e almeno un repository Artifact Registry, puoi sfogliare e selezionare un repository Artifact Registry esistente.

    I seguenti esempi mostrano come specificare dove vengono archiviate le immagini container 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 aver eseguito l'autenticazione corretta se utilizzi un repository Docker Hub privato.
    Repository di container AWS (ECR) {aws_account_id}.dkr.ecr.{region}.amazonaws.com/{my-app}
    Registro Azure Container (ACR) {my_acr_name}.azurecr.io/{my-app}

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

    Per ulteriori informazioni, consulta la guida alla gestione del registro di immagini.

    Cloud Code crea i container, ne esegue il push al registro, applica le configurazioni Kubernetes al cluster e attende il lancio.

    Dopo l'implementazione, Cloud Code esegue automaticamente il port forwarding di tutte le porte dei container dichiarate alla tua macchina e visualizza gli URL nella finestra di output, in modo che tu possa sfogliare la tua applicazione pubblicata.

  7. Per ogni contenitore di cui è possibile eseguire il debug nell'applicazione, conferma o inserisci la directory nel contenitore 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 radice 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, come impostare i punti di interruzione e seguire le istruzioni per il codice su un cluster Kubernetes attivo.

    Per impostazione predefinita, quando salvi una modifica all'applicazione, 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 tuo progetto.

  8. 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 debugger del riquadro inferiore.

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

    • Apri log di deployment: apri i log delle applicazioni di un deployment specifico con lo strumento Esplora log di Cloud Code.
    • Apri URL servizio: apri l'URL del servizio dell'applicazione di un servizio specifico in un browser web
  10. Se hai disattivato la modalità smartwatch nella configurazione del lancio e vuoi apportare modifiche all'applicazione, ricrearla ed eseguirne nuovamente il deployment, nel riquadro Sessioni di sviluppo, metti in pausa l'azione di esecuzione e fai clic su Icona Ricrea ed esegui nuovamente il deployment Ricrea ed esegui nuovamente il deployment dell'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 della configurazione

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

  • Il port forwarding della porta di debug in modo che possa essere collegato il debugger.
  • Collegamento di un debugger a uno o più container di cui è possibile eseguire il debug nell'applicazione. Se l'applicazione ha più container di cui è possibile eseguire il debug (container il cui linguaggio è supportato dal debug di Cloud Code) configurati in skaffold.yaml, un debugger viene collegato a ogni contenitore di cui è possibile eseguire il debug.
  • Definizioni di mapping del codice sorgente tra sessioni; puoi personalizzare queste definizioni modificando direttamente il file .vscode/launch.json.

Cloud Code gestisce anche i seguenti dettagli di configurazione specifici del linguaggio:

Node.js

Riscrittura del punto di ingresso per richiamare:

node --inspect=localhost:9229

Python

Installa il modulo ptvsd utilizzando un container Init e riscrive il punto di ingresso per richiamare:

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

Go

L'installazione del debugger dlv utilizzando un container Init e la riscrittura del punto di ingresso in modo che la sessione di debug avviata venga eseguita solo con un server di debug (in modalità headless), il processo di debug continua all'avvio, l'accettazione di più connessioni client e l'ascolto all'indirizzo 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 JDWP (Java Debug Wire Protocol) appropriata, in modo che l'agente di debug JDWP rilevi 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 maggiori 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 la lingua che utilizzi:

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 che il modulo ptvsd sia installato sulla macchina e nel container.
  • Avvia l'applicazione Python tramite ptvsd. Abbina la porta specificata al campo debugPort nella configurazione di collegamento. Ad esempio:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]
    

Go

  • Assicurati che il pacchetto dlv sia installato sulla tua macchina e nel contenitore Go.
  • Avvia l'applicazione Go tramite dlv debug.

    La porta specificata nel comando di avvio 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 verrà arrestata e attenderà il collegamento di un debugger. Collega un debugger per l'avvio del servizio.

Java

  • Assicurati che JVM sia installato sulla tua macchina.
  • Avvia l'applicazione Java con le opzioni seguenti, 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 la connessione sulla porta debugPort:

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

.NET Core

  • Assicurati che nel tuo container Kubernetes sia installato vsdbg, il debugger della riga di comando .NET Core di Microsoft.

    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

Imposta la configurazione del collegamento

Per eseguire il collegamento a un container di cui è possibile eseguire il debug, devi avere una configurazione di collegamento di tipo cloudcode.kubernetes.

Aggiungi un file .vscode/launch.json

Se la cartella .vscode del progetto non contiene un file launch.json, puoi aggiungerne uno utilizzando il riquadro Debug.

  1. Per accedere al riquadro Debug, fai clic su Icona 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'opzione di configurazione di Kubernetes

  5. Seleziona il linguaggio di programmazione che stai utilizzando.

    Verrà creato e aperto un file launch.json del progetto e viene creata una configurazione di allegato per te.

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

Aggiungi una configurazione di allegato 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 lo snippet Intellisense, fai clic su Aggiungi configurazione.
  3. Per aggiungere una configurazione di collegamento, seleziona lo snippet Cloud Code: Attach to Kubernetes Pod per il linguaggio che stai utilizzando.
  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 sul container.
podSelector Set di coppie chiave-valore utilizzate per selezionare il pod di debug. Per maggiori informazioni, consulta la guida sui selettori. Il seguente esempio mostra un valore tipico di podSelector:

"podSelector": { "app": <deployment-name> }
localRoot Percorso della directory locale contenente il programma di cui è in corso il debug. Il valore predefinito è ${workspaceCartella}.
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 for VS Code supporta il collegamento di un debugger a un pod Kubernetes per Node.js, Python, Go, Java e .NET. Tutto ciò di cui hai bisogno è un container di cui è possibile eseguire il debug e una configurazione di collegamento di tipo cloudcode.kubernetes.

Per informazioni sulle differenze tra il collegamento a un pod Kubernetes e il debug di un'applicazione Kubernetes, consulta Differenze tra il collegamento di un debugger a un pod e il debug di un'applicazione Kubernetes.

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

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

    • localhost:${debugPort} viene port forwarding a debugPort nel container durante il debug.

    La sessione di debug è stata configurata correttamente. Puoi eseguire le attività normalmente eseguite durante il debug del codice locale, ad esempio impostare i punti di interruzione e seguire la procedura dettagliata.

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

  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

Collega a un pod Kubernetes 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 configuration (.vscode/launch.json) di tipo cloudcode.kubernetes e richiesta attach. Utilizza configuration (.vscode/launch.json) di tipo cloudcode.kubernetes e richiesta launch.
Per saperne di più, consulta Confronto tra configurazioni di lancio 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 l'applicazione o per eseguirne il debug.
Questa configurazione è specifica per la lingua. Questa configurazione non è specifica per la lingua.
Nessun comando dedicato. Comando Debug su Kubernetes.
La modalità Watch non è disponibile, quindi dopo aver apportato le modifiche è necessario riavviare il debugger manualmente. 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 problemi su GitHub o fai una domanda su Stack Overflow.