Containerizzare un'app Kotlin Spring Boot ed eseguirne il deployment su Cloud Run

Google offre un potente strumento di creazione di immagini con cui puoi creare e pubblicare facilmente un'immagine container Docker ottimizzata per le app Java in pochissimo tempo senza Docker o Dockerfile. Google Cloud rende serverless anche i container con Cloud Run, una piattaforma di computing gestita che scala automaticamente i tuoi container stateless. In questo codelab, vedrai come è facile containerizzare la tua app Spring Boot Kotlin, pubblicare su Container Registry ed eseguire l'immagine su Google Cloud in modo fluido!

Questo codelab ti spiega nei dettagli come configurare una semplice app in Kotlin, mediante la dimostrazione dell'utilizzo di servizi e strumenti di Google Cloud, tra cui Jib, Container Registry e Cloud Run.

Prerequisiti

  • Dimestichezza con gli strumenti e il linguaggio di programmazione Java
  • Conoscenza degli editor di testo standard di Linux, ad esempio Vim, Emacs e nano

In questo lab proverai a:

  • Configurare un'app Spring Bott Kotlin.
  • Crea un'immagine Docker ottimizzata.
  • Pubblica l'immagine in Container Registry.
  • Esegui l'app containerizzata su Cloud Run.

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, come Google Chrome

Configurazione automatica dell'ambiente

  1. Accedi a Cloud Console e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o G Suite, devi crearne uno.

Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome sopra riportato è già stato utilizzato e non funzionerà per te). Vi verrà fatto riferimento più avanti in questo codelab come PROJECT_ID.

  1. Il prossimo passaggio consiste nell'attivare la fatturazione in Cloud Console per poter utilizzare le risorse Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare più di qualche euro, ma potrebbe essere di più se decidi di utilizzare più risorse o se le lasci in esecuzione.

I nuovi utenti di Google Cloud sono idonei per una prova senza costi di 300$.

Cloud Shell

Google Cloud può essere gestito da remoto dal tuo laptop, ma in questo codelab utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione su Google Cloud.

Attiva Cloud Shell

  1. In Cloud Console, fai clic su Attiva Cloud Shell .

Se non hai mai avviato Cloud Shell prima d'ora, ti verrà proposto uno schermo intermedio (below the fold) che descrive quello che è. In tal caso, fai clic su Continua (e non lo vedrai più). Ecco come si presenta la schermata una tantum:

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

Questa macchina virtuale è dotata di tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro in questo codelab, se non tutto, può essere svolto con un browser o con Chromebook.

Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].
  1. Genera una nuova app Spring Boot con Spring Initializr.
$ curl https://start.spring.io/starter.tgz \
    -d language=kotlin \
    -d dependencies=web \
    -d baseDir=kotlin-jib-cloud-run | tar -xzvf -

Tieni presente che Initializr aggiungerà automaticamente spring-boot-starter-web alle tue dipendenze in pom.xml dell'app modello.

  1. Passa alla directory dell'app modello.
$ cd kotlin-jib-cloud-run
  1. Crea ed esegui l'app utilizzando Maven.
$ ./mvnw -DskipTests spring-boot:run
  1. Una volta avviata l'app, l'app inizierà ad ascoltare la porta 8080. Fai clic su Anteprima web nella barra degli strumenti di Cloud Shell e seleziona Anteprima sulla porta 8080 per accedere all'app.

  1. Dovresti ricevere una risposta 404 perché l'app non fa ancora nulla. Interrompi l'app con Control+C.
  1. Crea la seguente classe Controller nel pacchetto dimostrativo:
$ vi src/main/kotlin/com/example/demo/Controller.kt
    or
$ nano src/main/kotlin/com/example/demo/Controller.kt

src/main/kotlin/com/example/demo/Controller.kt

package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class Controller {
  
  @GetMapping("/")
  fun saySomething(): String {
    return "Kotlin app on Cloud Run, containerized by Jib!"
  }
}
  1. Ricrea ed esegui l'app.
$ ./mvnw spring-boot:run
  1. Controlla di nuovo l'app utilizzando Anteprima web. Questa volta dovresti vedere il messaggio "Kotlin app on Cloud Run, containerized by Jib!". Interrompi l'app con Control+C.

Con Jib puoi containerizzare la tua app in modo ottimizzato senza Docker e pubblicarla in qualsiasi Container Registry.

  1. Prima di procedere, devi attivare l'API Container Registry. Questa operazione deve essere eseguita una sola volta per progetto per rendere accessibile l'API.
$ gcloud services enable containerregistry.googleapis.com
  1. Esegui Jib per creare un'immagine Docker e pubblicarla in Container Registry.
$ ./mvnw com.google.cloud.tools:jib-maven-plugin:1.8.0:build \
    -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/kotlin-jib-cloud-run

Infine, verrà visualizzato il seguente messaggio che indica che l'app è containerizzata e ne è stato eseguito il push a Container Registry.

[INFO] Built and pushed image as gcr.io/PROJECT_ID/kotlin-jib-cloud-run
...
[INFO] BUILD SUCCESS

Se viene visualizzato un errore, controlla se $GOOGLE_CLOUD_PROJECT è impostato correttamente sull'ID progetto di Google Cloud (PROJECT_ID).

  1. Prima di procedere, controlla se l'immagine è stata pubblicata correttamente. Torna a Cloud Console, fai clic sul menu di navigazione e seleziona Container Registry.

L'immagine sarà pubblicata.

Cloud Run porta il serverless ai container, scalando automaticamente i tuoi container stateless.

  1. Fai di nuovo clic su Menu di navigazione e seleziona Cloud Run.

Se è la prima volta che accedi a Cloud Run, vedrai la seguente finestra di dialogo per la configurazione una tantum. Se viene visualizzato, fai clic su Inizia a utilizzare Cloud Run.

  1. Nella pagina di Cloud Run, fai clic su Create Service (Crea servizio).

  1. Nella schermata successiva, fai clic su Seleziona in corrispondenza di Origine. L'origine è l'immagine che vuoi eseguire su Cloud Run.

  1. La finestra di dialogo mostra l'immagine creata in precedenza. Seleziona l'immagine e fai clic su Continua.

  1. Ti mancano pochi clic per eseguire il deployment dell'app. In Deployment platform, scegli Cloud Run (completamente gestito) per rendere il servizio completamente gestito su Google Cloud. Scegli un'area geografica appropriata per la tua località, seleziona Consenti chiamate non autenticate e fai clic su Crea. Ecco fatto.

Al termine del deployment dell'immagine, nella pagina Cloud Run verrà visualizzato un URL per accedere all'app. Dai un'occhiata!

e il messaggio che vuoi vedere nell'app.

Kotlin app on Cloud Run, containerized by Jib!

Ecco fatto. In futuro, se dovrai eseguire il deployment di nuove versioni dell'app, potrai farlo facendo clic su Esegui il deployment di una nuova revisione nella pagina.

  1. Per ripulire il tuo ambiente, devi eliminare l'app di cui hai eseguito il deployment su Cloud Run e l'immagine pubblicata in Container Registry. Vai a Cloud Run, seleziona l'app e fai clic su Elimina.

  1. Allo stesso modo, vai alla pagina Container Registry ed elimina l'immagine.

Complimenti! Hai containerizzato la tua app Spring Boot Kotlin ed ne hai eseguito il deployment su Cloud Run.

Con Jib hai creato un'immagine container ottimizzata senza che Docker sia installato o scrive un Dockerfile e lo hai pubblicato su Container Registry. Jib ottimizza la creazione delle immagini, in modo che chiunque non abbia una conoscenza approfondita di Docker può containerizzare le app Java in modo rapido ed efficiente. Dopodiché, con pochi clic, hai eseguito il deployment dell'app in Cloud Run per iniziare a gestirla in un attimo.

Scopri di più