Questo tutorial descrive come eseguire il deployment di un'applicazione web containerizzata in un cluster Autopilot di Google Kubernetes Engine (GKE) e come utilizzare un database Google Spanner nel backend per archiviare i dati. L'applicazione di esempio gestisce una tabella di giocatori. Puoi aggiungere ed eliminare player tramite l'interfaccia grafica 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à.
Questo tutorial presuppone che tu abbia una conoscenza di base di Kubernetes.
Perché GKE e Spanner
In qualità di sviluppatore, potresti non voler dedicare tempo a comprendere la quantità di risorse di archiviazione e calcolo necessarie all'applicazione, a prevedere il consumo di RAM e CPU durante periodi di fluttuazione delle richieste o a preoccuparti di guasti delle applicazioni in caso di carico di picco.
Se utilizzi GKE Autopilot come servizio Kubernetes completamente gestito e Spanner come servizio di database completamente gestito, puoi sviluppare ed eseguire il deployment di app più velocemente su un'infrastruttura stabile che semplifica la configurazione e la gestione delle risorse. GKE Autopilot gestisce la configurazione e la scalabilità dell'infrastruttura per l'hosting delle app mediante l'aggiunta o la rimozione di nodi da o verso il cluster, in base ai requisiti in fase di runtime. Allo stesso modo, Spanner può fare lo scale out e lo scale in dinamicamente con intervento manuale minimo, poiché i requisiti di archiviazione o calcolo cambiano.
Ad esempio, supponiamo che tu stia lanciando il prossimo gioco di successo che prevedi diventerà virale e che attirerà quindi notevole traffico web durante la settimana del lancio. Spanner può aiutarti a gestire questa velocità effettiva in aumento offrendo la possibilità di aumentare, diminuire o riallocare all'istante le risorse di calcolo pur mantenendo la massima disponibilità delle applicazioni con GKE Autopilot.
Obiettivi
In questo tutorial imparerai a:
Crea un database Spanner che archivia un registro di player.
Esegui il deployment di un'app web di esempio denominata
hello-app-cloud-spanner
, con una Graphic User Interface.
La seguente tabella descrive le risorse Google Cloud che crei o utilizzi, le variabili con cui sono identificate e i relativi valori prescritti ai fini di questo tutorial:
Risorsa | Variabile | Valore |
---|---|---|
ID progetto Google Cloud | PROJECT_ID
|
L'ID progetto generato quando crei un progetto.
Esempio: |
Regione di computing | COMPUTE_REGION |
La regione di Compute Engine in cui vuoi creare l'istanza Spanner e il cluster GKE. Ti consigliamo di scegliere la regione più vicina alla posizione geografica dei 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 |
Account di servizio Kubernetes | KSA_NAME |
ksa-helloapp |
Account di servizio IAM | GSA_NAME |
gsa-helloapp |
ID progetto dell'account di servizio IAM | GSA_PROJECT |
Il tuo PROJECT_ID di Google Cloud. |
Ai fini di questo tutorial, consigliamo di creare nuove risorse, che semplificano l'eliminazione e non comportano rischi dopo aver eseguito il deployment dell'app di esempio. Tuttavia, se disponi di spazi dei nomi, account di servizio IAM e account di servizio Kubernetes, puoi utilizzarli.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
- Istanze di Compute Engine utilizzate da GKE
- Spanner
- Cloud Load Balancing
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina 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 gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
Abilita le API
Abilita le API Artifact Registry, Compute Engine, GKE, and IAM Service Account Credentials.
Configura Cloud Shell
In questo tutorial utilizzerai Cloud Shell per eseguire i comandi gcloud
e kubectl
. Cloud Shell è un ambiente shell per la gestione
delle risorse ospitate su Google Cloud. È preinstallato lo strumento a riga di comando Google Cloud CLI e kubectl.
In the Google Cloud console, activate Cloud Shell.
Si apre una sessione di Cloud Shell all'interno di un frame più in basso nella 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.
Grant roles to your user account. Run the following command once for each of the following
IAM roles:
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_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:[email protected]
. - Replace
ROLE
with each individual role.
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 a livello di regione 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, come la configurazione (a una o più regioni), la capacità di calcolo disponibile e lo spazio di archiviazione.
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 la federazione delle identità per i carichi di lavoro per GKE per accedere al tuo database in modo sicuro e gestibile.
Crea un cluster Autopilot denominato hello-cluster
. Nei cluster Autopilot è abilitata per impostazione predefinita la federazione delle identità per i carichi di lavoro per GKE.
gcloud container clusters create-auto CLUSTER_NAME \
--region=COMPUTE_REGION
Sostituisci quanto segue:
CLUSTER_NAME
:hello-cluster
COMPUTE_REGION
: l'area geografica di Compute Engine del cluster. Per questo tutorial, utilizza la stessa regione,us-west1
, in cui hai creato l'istanza Spanner. Ti consigliamo di creare l'istanza di Spanner e il cluster GKE Autopilot all'interno della 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 per l'utilizzo della federazione di Workload Identity per GKE
Configura il cluster per l'autenticazione in Google Cloud utilizzando la federazione delle identità di Workload per GKE prima di eseguire il deployment dell'app.
Recupera le credenziali per accedere al tuo cluster:
gcloud container clusters get-credentials CLUSTER_NAME \ --region=COMPUTE_REGION
Sostituisci quanto segue:
CLUSTER_NAME
:hello-cluster
COMPUTE_REGION
:us-west1
Questa operazione aggiorna un file
kubeconfig
con le credenziali e le informazioni sugli endpoint appropriate per puntarekubectl
al tuo cluster.Crea uno spazio dei nomi da utilizzare per l'account di servizio Kubernetes. Puoi anche utilizzare lo spazio dei nomi predefinito o qualsiasi spazio dei nomi esistente.
kubectl create namespace NAMESPACE
Sostituisci
NAMESPACE
conhello-namespace
, il nome del nuovo spazio dei nomi che stai creando.Crea un account di servizio Kubernetes per l'applicazione da utilizzare:
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
Crea un account di servizio IAM per l'applicazione:
gcloud iam service-accounts create GSA_NAME \ --project=GSA_PROJECT
Sostituisci quanto segue:
GSA_NAME
:gsa-helloapp
, il nome del nuovo account di servizio IAM che stai creando.GSA_PROJECT
: l'ID del tuo progetto Google Cloud. In questo tutorial, creerai l'account di servizio IAM nello stesso progetto Google Cloud in cui esegui il deployment dell'app di esempio. Di conseguenza,GSA_PROJECT
ePROJECT_ID
Google Cloud coincidono.
Aggiungi un'associazione 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
: l'ID del tuo progetto Google CloudGSA_NAME
:gsa-helloapp
Esempio:
gcloud projects add-iam-policy-binding my-gcp-project \ --member "serviceAccount:[email protected]" \ --role "roles/spanner.admin"
Consenti all'account di servizio Kubernetes di assumere l'identità dell'account di servizio IAM aggiungendo un'associazione di criteri IAM tra i due account di servizio. Questa associazione consente all'account di servizio Kubernetes di agire come account di servizio IAM, in modo che l'account di servizio Kubernetes possa leggere e scrivere su 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
: l'ID del tuo progetto Google CloudPROJECT_ID
: l'ID del tuo progetto Google CloudNAMESPACE
:hello-namespace
KSA_NAME
:ksa-helloapp
Esempio:
gcloud iam service-accounts add-iam-policy-binding [email protected] \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
Annota l'account di servizio Kubernetes con l'indirizzo email dell'account di servizio IAM. In questo modo, l'app di esempio può sapere quale account di servizio utilizzare per accedere ai servizi Google Cloud. Pertanto, quando l'app utilizza una qualsiasi libreria client standard delle API di Google per accedere ai servizi Google Cloud, utilizza quell'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
: l'ID del tuo 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
.
Clona l'app di esempio dal repository GitHub a Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
Avvia 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 dell'editor di Cloud Shell.
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.yaml
e aggiorna il camposerviceAccountName
sostituendo<KSA_NAME>
conksa-helloapp
, il nome del tuo account di servizio Kubernetes.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-spanner
Esegui il deployment dell'applicazione:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
Sostituisci
NAMESPACE
conhello-namespace
.Attendi che venga eseguito il deployment dell'applicazione con
STATUS
comeRunning
:kubectl get pods -n=NAMESPACE --watch
Sostituisci
NAMESPACE
conhello-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
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, raggiungibile tramite internet.
Esegui il deployment del bilanciatore del carico:
kubectl apply -f k8s/service.yaml -n=NAMESPACE
Sostituisci
NAMESPACE
conhello-namespace
.Controlla che ti venga assegnato un indirizzo IP esterno:
kubectl get service -n=NAMESPACE --watch
Sostituisci
NAMESPACE
conhello-namespace
.Dopo l'assegnazione, copia il campo
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 player.Puoi utilizzare la GUI dell'app per creare o eliminare i record dei giocatori, che vengono salvati nel database Spanner.
Esegui la query seguente 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 che hai 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, elimina le risorse GKE e Spanner.
Elimina risorse GKE
Elimina il servizio. Questa operazione consente di trovare il bilanciatore del carico di Google Cloud creato per il tuo servizio:
kubectl delete service hello-app-cloud-spanner -n=NAMESPACE
Sostituisci
NAMESPACE
conhello-namespace
.Eliminare il cluster GKE. Questa operazione elimina le risorse che costituiscono un cluster, ad esempio istanze di calcolo, dischi e risorse di rete:
gcloud container clusters delete CLUSTER_NAME --region=COMPUTE_REGION
Sostituisci quanto segue:
CLUSTER_NAME
:hello-cluster
COMPUTE_REGION
:us-west1
Elimina risorse Spanner
Elimina il database Spanner:
gcloud spanner databases delete hello-database --instance=hello-instance
Elimina l'istanza Spanner:
gcloud spanner instances delete hello-instance