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 dei 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 affidabilità.
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 lo scale in 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 del throughput fornendo la possibilità di aumentare, diminuire o riallocare istantaneamente le risorse di calcolo mantenendo comunque la massima disponibilità delle applicazioni con GKE Autopilot.
Obiettivi
In questo tutorial imparerai a:
Crea un database Spanner che memorizzi un registro dei giocatori.
Esegui il deployment di un'app web di esempio chiamata
hello-app-cloud-spanner, con un'interfaccia utente grafica.
La tabella seguente descrive le risorse Google Cloud che crei o utilizzi, le variabili con cui vengono identificate e i valori prescritti per lo scopo di questo tutorial:
| Risorsa | Variabile | Valore |
|---|---|---|
| ID progettoGoogle Cloud | PROJECT_ID
|
L'ID progetto generato quando crei un progetto.
Esempio: |
| Regione di Compute | COMPUTE_REGION |
La regione Compute Engine in cui vuoi creare l'istanza Spanner e il cluster GKE. Ti consigliamo di scegliere una regione più vicina alla posizione geografica dei tuoi clienti, ma per questo tutorial utilizza |
| Istanza Spanner | - | hello-instance |
| Database Spanner | - | hello-database |
| Cluster GKE Autopilot | CLUSTER_NAME |
hello-cluster |
| Spazio dei nomi Kubernetes | NAMESPACE |
hello-namespace |
| Service account Kubernetes | KSA_NAME |
ksa-helloapp |
| Service account IAM | GSA_NAME |
gsa-helloapp |
| ID progetto del account di servizio IAM | GSA_PROJECT |
Il tuo Google Cloud PROJECT_ID. |
Ai fini di questo tutorial, ti consigliamo di creare nuove risorse, il che rende l'eliminazione facile e senza rischi dopo aver eseguito il deployment dell'app di esempio. Tuttavia, se hai spazi dei nomi, service account IAM e service account Kubernetes esistenti, puoi utilizzarli.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
- Compute Engine instances used by GKE
- Spanner
- Cloud Load Balancing
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.
Prima di iniziare
Assicurati di completare i seguenti prerequisiti:
Seleziona o crea un progetto
Puoi utilizzare un progetto esistente o crearne uno nuovo per questo tutorial.
- Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Abilita le API
Abilita le API Artifact Registry, Compute Engine, GKE e IAM Service Account Credentials.
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere
i ruoli.
Configura Cloud Shell
In questo tutorial utilizzi Cloud Shell per eseguire i comandi gcloud e kubectl. Cloud Shell è un ambiente shell per la gestione delle risorse ospitate su Google Cloud. È preinstallato con Google Cloud CLI e lo strumento a riga di comando kubectl.
Nella console Google Cloud , attiva Cloud Shell.
Una sessione di Cloud Shell si apre in un frame nella parte inferiore della console.
Prima di eseguire i comandi in questo tutorial, assicurati che il progetto predefinito sia impostato sull'ID progetto in cui vuoi eseguire il deployment dell'app di esempio. Se non è già impostato, esegui questo comando in Cloud Shell:
gcloud config set project PROJECT_ID
Sostituisci PROJECT_ID con il tuo ID progetto.
Concedi ruoli IAM
Assicurati che il tuo account Google Cloud disponga dei ruoli IAM richiesti per questo tutorial.
Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti
ruoli IAM:
roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto.USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio:myemail@example.com.ROLE: il ruolo IAM che concedi al tuo account utente.
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à dalla relativa 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 seguente query 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 Workload Identity Federation for GKE abilitata per impostazione predefinita.
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION
Sostituisci quanto segue:
CLUSTER_NAME:hello-clusterCONTROL_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 Workload Identity Federation for GKE
Configura il cluster per l'autenticazione a Google Cloud utilizzando Workload Identity Federation for GKE prima di eseguire il deployment dell'app.
Ottieni le credenziali per accedere al tuo cluster:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONSostituisci quanto segue:
CLUSTER_NAME:hello-clusterCONTROL_PLANE_LOCATION:us-west1
In questo modo, un file
kubeconfigviene aggiornato con le credenziali e le informazioni sull'endpoint appropriate per indirizzarekubectlal tuo cluster.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 NAMESPACESostituisci
NAMESPACEconhello-namespace, il nome del nuovo spazio dei nomi che stai creando.Crea un account di servizio Kubernetes da utilizzare per la tua applicazione:
kubectl create serviceaccount KSA_NAME \ --namespace NAMESPACESostituisci quanto segue:
KSA_NAME:ksa-helloapp, il nome del nuovo account di servizio Kubernetes che stai creando.NAMESPACE:hello-namespace
Crea un account di servizio IAM per la tua applicazione:
gcloud iam service-accounts create GSA_NAME \ --project=GSA_PROJECTSostituisci quanto segue:
GSA_NAME:gsa-helloapp, il nome del nuovoaccount di serviziot IAM che stai creando.GSA_PROJECT: il tuo Google Cloud ID progetto. In questo tutorial, creerai il service account IAM nello stesso progetto Google Cloud in cui esegui il deployment dell'app di esempio. Pertanto,GSA_PROJECTeGoogle CloudPROJECT_IDsono uguali.
Aggiungi un binding dei criteri IAM per il 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 Google Cloud ID progettoGSA_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"
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-helloappGSA_PROJECT: il tuo Google Cloud ID progettoPROJECT_ID: il tuo Google Cloud ID progettoNAMESPACE:hello-namespaceKSA_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]"
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 l'account di servizio IAM.
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.comSostituisci quanto segue:
KSA_NAME:ksa-helloappNAMESPACE:hello-namespaceGSA_NAME:gsa-helloappGSA_PROJECT: il tuo Google Cloud ID progetto
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.
Clona l'app di esempio dal repository GitHub in Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.gitAvvia l'editor di Cloud Shell facendo clic su
Apri editor sulla barra degli strumenti della finestra del terminale.Per saperne di più, consulta la panoramica dell'interfaccia di Cloud Shell Editor.
Apri il riquadro Explorer dell'editor di Cloud Shell e vai alla directory
kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.Apri il file
deployment.yamle aggiorna il camposerviceAccountNamesostituendo<KSA_NAME>conksa-helloapp, il nome del tuo account di servizio Kubernetes.
Figura 1. Aggiorna il nome del account di servizio Kubernetes nel file di deployment. Chiudi l'editor di Cloud Shell e torna al terminale Cloud Shell.
Nel terminale Cloud Shell, vai alla directory
hello-app-cloud-spanner:cd kubernetes-engine-samples/databases/hello-app-cloud-spannerEsegui il deployment dell'applicazione:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACESostituisci
NAMESPACEconhello-namespace.Attendi il deployment dell'applicazione con
STATUScomeRunning:kubectl get pods -n=NAMESPACE --watchSostituisci
NAMESPACEconhello-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 3m15sPremi 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.
Esegui il deployment del bilanciatore del carico:
kubectl apply -f k8s/service.yaml -n=NAMESPACESostituisci
NAMESPACEconhello-namespace.Controlla che venga assegnato un indirizzo IP esterno:
kubectl get service -n=NAMESPACE --watchSostituisci
NAMESPACEconhello-namespace.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.Puoi utilizzare la GUI dell'app per creare o eliminare i record dei giocatori, che vengono salvati nel database Spanner.
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
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Il modo più semplice per evitare la fatturazione è eliminare il progetto creato per questo tutorial.
Elimina un progetto Google Cloud :
gcloud projects delete PROJECT_ID
Se hai eliminato il progetto, la pulizia è completata. Se non hai eliminato il progetto, procedi con l'eliminazione delle risorse GKE e Spanner.
Elimina risorse GKE
Elimina il servizio. Questa operazione annulla l'assegnazione del bilanciatore del carico Google Cloud creato per il tuo servizio:
kubectl delete service hello-app-cloud-spanner -n=NAMESPACESostituisci
NAMESPACEconhello-namespace.Elimina il cluster GKE. Questa operazione elimina le risorse che costituiscono un cluster, come le istanze di calcolo, i dischi e le risorse di rete:
gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
Elimina risorse Spanner
Elimina il database Spanner:
gcloud spanner databases delete hello-database --instance=hello-instanceElimina l'istanza Spanner:
gcloud spanner instances delete hello-instance
Passaggi successivi
- Scopri come creare un cluster GKE per l'installazione di Agones.
- Scopri le best practice per l'utilizzo di Spanner come database per videogiochi.
- Scopri come eseguire il deployment di un database PostgreSQL a disponibilità elevata su GKE.
- Scopri le best practice per il deployment dei database su GKE.