Eseguire il deployment di un'app utilizzando GKE Autopilot e Spanner

Questo tutorial descrive come eseguire il deployment di un'applicazione web containerizzata in un cluster Google Kubernetes Engine (GKE) Autopilot e utilizzare un database Google Spanner nel backend per archiviare i dati. L'applicazione di esempio gestisce una tabella di giocatori. Puoi aggiungere ed eliminare giocatori tramite l'interfaccia utente grafica (GUI) dell'app.

Spanner è un servizio di database relazionale completamente gestito, scalabile orizzontalmente e distribuito a livello globale che fornisce transazioni ACID e semantica SQL senza compromettere le prestazioni e l'alta disponibilità.

Prima di leggere questa pagina, assicurati di avere familiarità con Kubernetes.

Perché GKE e Spanner

In qualità di sviluppatore, potresti non voler dedicare tempo a capire la quantità di risorse di archiviazione e di calcolo necessarie alla tua applicazione, a prevedere il consumo di RAM e CPU durante i periodi di domanda variabile o a preoccuparti di errori dell'applicazione in caso di picco di carico.

Utilizzando GKE Autopilot come servizio Kubernetes completamente gestito e Spanner come servizio di database completamente gestito, puoi sviluppare ed eseguire il deployment delle app più rapidamente su un'infrastruttura stabile che semplifica la configurazione e la gestione delle risorse. GKE Autopilot gestisce la configurazione e il scaling dell'infrastruttura per l'hosting della tua app aggiungendo o rimuovendo nodi dal cluster, in base ai requisiti in fase di runtime. Allo stesso modo, Spanner può fare lo scale out e verticalmente in modo dinamico con un intervento manuale minimo, man mano che cambiano i requisiti di archiviazione o di calcolo.

Ad esempio, supponiamo che tu stia per lanciare il prossimo gioco di successo che prevedi diventerà virale e quindi attirerà un traffico web elevato durante la settimana di lancio. Spanner può aiutarti a gestire questo aumento della velocità effettiva fornendo la possibilità di aumentare, diminuire o riallocare istantaneamente le risorse di calcolo mantenendo la massima disponibilità delle applicazioni con GKE Autopilot.

Configura Spanner

Per configurare Spanner, devi creare un'istanza Spanner e un database Spanner.

Creazione di un'istanza di Spanner

Un'istanza Spanner è un'allocazione di risorse utilizzata dai database Spanner creati in quell'istanza.

Crea un'istanza Spanner denominata hello-instance con una configurazione regionale e una capacità di calcolo di 100 unità di elaborazione.

gcloud spanner instances create hello-instance \
    --config=regional-COMPUTE_REGION \
    --description="Spanner sample instance" \
    --processing-units=100

Sostituisci COMPUTE_REGION con us-west1 per questo tutorial.

Creazione di un database Spanner

Un database Spanner include tabelle, viste e indici. Un database eredita le proprietà dall'istanza padre, ad esempio la configurazione (regionale o multiregionale), la capacità di calcolo e lo spazio di archiviazione disponibili.

Crea un database Spanner denominato hello-database con una tabella denominata Players utilizzando il dialetto GoogleSQL. Esegui la query seguente in Cloud Shell:

gcloud spanner databases create hello-database \
    --instance=hello-instance \
    --database-dialect=GOOGLE_STANDARD_SQL \
    --ddl="CREATE TABLE Players (
        PlayerUuid STRING(36) NOT NULL,
        FirstName STRING(1024),
        LastName STRING(1024),
        BirthDate DATE) PRIMARY KEY(PlayerUuid)"

Crea un cluster GKE Autopilot

Dopo aver configurato Spanner, crea un cluster Autopilot e utilizza Workload Identity Federation for GKE per accedere al tuo database in modo sicuro e gestibile.

Crea un cluster Autopilot denominato hello-cluster. I cluster Autopilot hanno la federazione delle identità per i carichi di lavoro per GKE abilitata per impostazione predefinita.

gcloud container clusters create-auto CLUSTER_NAME \
  --location=CONTROL_PLANE_LOCATION

Sostituisci quanto segue:

  • CLUSTER_NAME: hello-cluster
  • CONTROL_PLANE_LOCATION: la regione di Compute Engine del control plane del cluster. Per questo tutorial, utilizza la stessa regione, us-west1, in cui hai creato l'istanza Spanner. Ti consigliamo di creare l'istanza Spanner e il cluster GKE Autopilot nella stessa regione per ridurre la latenza.

La creazione del cluster può richiedere fino a 8-10 minuti.

L'output è simile al seguente:

NAME: hello-cluster
LOCATION: us-west1
MASTER_VERSION: 1.26.5-gke.1200
MASTER_IP: 192.0.2.1
MACHINE_TYPE: e2-medium
NODE_VERSION: 1.26.5-gke.1200
NUM_NODES: 3
STATUS: RUNNING

Configura il cluster in modo che utilizzi la federazione delle identità per i carichi di lavoro per GKE

Configura il cluster per l'autenticazione a Google Cloud utilizzando Workload Identity Federation for GKE prima di eseguire il deployment dell'app.

  1. Ottieni le credenziali per accedere al tuo cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
      --location=CONTROL_PLANE_LOCATION
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: hello-cluster
    • CONTROL_PLANE_LOCATION: us-west1

    In questo modo, un file kubeconfig viene aggiornato con le credenziali e le informazioni sull'endpoint appropriate per indirizzare kubectl al tuo cluster.

  2. Crea uno spazio dei nomi da utilizzare per il account di servizio Kubernetes. Puoi anche utilizzare lo spazio dei nomi predefinito o qualsiasi spazio dei nomi esistente.

    kubectl create namespace NAMESPACE
    

    Sostituisci NAMESPACE con hello-namespace, il nome del nuovo spazio dei nomi che stai creando.

  3. Crea un account di servizio Kubernetes da utilizzare per la tua applicazione:

    kubectl create serviceaccount KSA_NAME \
      --namespace NAMESPACE
    

    Sostituisci quanto segue:

    • KSA_NAME: ksa-helloapp, il nome del nuovo account di servizio Kubernetes che stai creando.
    • NAMESPACE: hello-namespace
  4. Crea un account di servizio IAM per la tua applicazione:

    gcloud iam service-accounts create GSA_NAME \
      --project=GSA_PROJECT
    

    Sostituisci quanto segue:

    • GSA_NAME: gsa-helloapp, il nome del nuovoaccount di serviziot IAM che stai creando.
    • GSA_PROJECT: il tuo ID progetto Google Cloud. In questo tutorial, creerai il service account IAM nello stesso progetto Google Cloud in cui esegui il deployment dell'app di esempio. Pertanto, GSA_PROJECT eGoogle Cloud PROJECT_ID sono uguali.
  5. Aggiungi un binding dei criteri IAM per il tuo account di servizio IAM per leggere e scrivere in Spanner:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/spanner.admin"
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto Google Cloud
    • GSA_NAME: gsa-helloapp

    Esempio:

    gcloud projects add-iam-policy-binding my-gcp-project \
      --member "serviceAccount:gsa-helloapp@my-gcp-project.iam.gserviceaccount.com" \
      --role "roles/spanner.admin"
  6. Consenti al service account Kubernetes di rappresentare l'account di servizio IAM aggiungendo un'associazione dei criteri IAM tra i due service account. Questa associazione consente al account di servizio Kubernetes di agire come account di servizio IAM, in modo che possa leggere e scrivere in Spanner.

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    Sostituisci quanto segue:

    • GSA_NAME: gsa-helloapp
    • GSA_PROJECT: il tuo ID progetto Google Cloud
    • PROJECT_ID: il tuo ID progetto Google Cloud
    • NAMESPACE: hello-namespace
    • KSA_NAME: ksa-helloapp

    Esempio:

    gcloud iam service-accounts add-iam-policy-binding gsa-helloapp@my-gcp-project.iam.gserviceaccount.com \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
  7. Annota il account di servizio Kubernetes con l'indirizzo email del account di servizio IAM. In questo modo, l'app di esempio sa quale account di servizio utilizzare per accedere ai servizi Google Cloud . Pertanto, quando l'app utilizza librerie client API di Google standard per accedere ai servizi Google Cloud , utilizza questo account di servizio IAM.

    kubectl annotate serviceaccount KSA_NAME \
      --namespace NAMESPACE \
      iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
    

    Sostituisci quanto segue:

    • KSA_NAME: ksa-helloapp
    • NAMESPACE: hello-namespace
    • GSA_NAME: gsa-helloapp
    • GSA_PROJECT: il tuo ID progetto Google Cloud

    Esempio:

    kubectl annotate serviceaccount ksa-helloapp \
      --namespace hello-namespace \
      iam.gke.io/gcp-service-account=gsa-helloapp@my-gcp-project.iam.gserviceaccount.com

Esegui il deployment dell'app di esempio nel cluster

Ora che hai configurato GKE e Spanner con i servizi e l'autenticazione necessari, puoi eseguire il deployment dell'app di esempio hello-app-cloud-spanner.

  1. Clona l'app di esempio dal repository GitHub in Cloud Shell:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  2. Avvia l'editor di Cloud Shell facendo clic su Pulsante Editor di codice Apri editor sulla barra degli strumenti della finestra del terminale.

    Per ulteriori informazioni, consulta la panoramica dell'interfaccia dell'editor di Cloud Shell.

  3. Apri il riquadro Explorer dell'editor di Cloud Shell e vai alla directory kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.

  4. Apri il file deployment.yaml e aggiorna il campo serviceAccountName sostituendo <KSA_NAME> con ksa-helloapp, il nome del tuo account di servizio Kubernetes.

    Modifica il file YAML per aggiornare KSA_NAME.
    Figura 1. Aggiorna il nome del account di servizio Kubernetes nel file di deployment.
  5. Chiudi l'editor di Cloud Shell e torna al terminale Cloud Shell.

  6. Nel terminale Cloud Shell, vai alla directory hello-app-cloud-spanner:

    cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
    
  7. Esegui il deployment dell'applicazione:

    kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
    

    Sostituisci NAMESPACE con hello-namespace.

  8. Attendi il deployment dell'applicazione con STATUS come Running:

    kubectl get pods -n=NAMESPACE --watch
    

    Sostituisci NAMESPACE con hello-namespace.

    L'output è simile al seguente:

    NAME                                       READY   STATUS              RESTARTS   AGE
    hello-app-cloud-spanner-765c9b8779-lfcrc   0/1     ContainerCreating   0          87s
    hello-app-cloud-spanner-765c9b8779-lfcrc   1/1     Running             0          3m15s
    
  9. Premi Ctrl+C sulla tastiera per tornare al prompt dei comandi ed eseguire altri comandi.

Esporre l'app di esempio su internet

Per esporre un servizio Kubernetes all'esterno del cluster, crea un servizio di tipo LoadBalancer. Questo tipo di servizio genera un indirizzo IP del bilanciatore del carico esterno per i tuoi pod, raggiungibili tramite internet.

  1. Esegui il deployment del bilanciatore del carico:

    kubectl apply -f k8s/service.yaml -n=NAMESPACE
    

    Sostituisci NAMESPACE con hello-namespace.

  2. Controlla che venga assegnato un indirizzo IP esterno:

    kubectl get service -n=NAMESPACE --watch
    

    Sostituisci NAMESPACE con hello-namespace.

  3. Una volta assegnato, copia EXTERNAL-IP (ad esempio, 203.0.113.0) e aprilo in un browser. Si apre un'interfaccia web che mostra e gestisce il database dei giocatori.

  4. Puoi utilizzare la GUI dell'app per creare o eliminare i record dei giocatori, che vengono salvati nel database Spanner.

    Aggiungi o elimina giocatori.
    Figura 2. Crea o elimina giocatori nel registro.

    Esegui la seguente query per verificare se il database Spanner è stato aggiornato con le tue voci:

    gcloud spanner databases execute-sql hello-database \
      --instance=hello-instance \
      --sql="SELECT * FROM Players LIMIT 10"
    

    L'output è simile al seguente:

    PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3
    FirstName: John
    LastName: Smith
    BirthDate: 1997-07-12
    
    PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e
    FirstName: Jane
    LastName: Doe
    BirthDate: 2013-07-12