Questo tutorial mostra come configurare l'infrastruttura dello strumento Autoscaler per Spanner utilizzando una topologia di deployment distribuita. Nell'opzione di deployment presentata in questo tutorial, tutti i componenti di Autoscaler si trovano in un unico progetto, ad eccezione di Cloud Scheduler, dell'argomento Forwarder e della relativa funzione.
Questo tutorial è rivolto ai team IT, Operations e Site Reliability Engineering che vogliono ridurre gli overhead operativi e ottimizzare il costo dei loro implementazioni di Spanner. Questo documento fa parte di una serie:
- Spanner con scalabilità automatica
- Esegui il deployment di uno strumento di scalabilità automatica per progetto o centralizzato per Spanner
- Esegui il deployment di uno strumento di gestione della scalabilità automatica distribuito per Spanner (questo documento)
La topologia di deployment distribuito riunisce le seguenti funzionalità vantaggiose sia dei deployment per progetto sia di quelli centralizzati:
- I team che possiedono le istanze Spanner, chiamati team di applicazioni, gestiscono i parametri di configurazione di Autoscaler per le proprie istanze con i job Cloud Scheduler di loro proprietà.
- A parte i parametri di configurazione, un team centrale gestisce il resto dell'infrastruttura di Autoscaler, riducendo al minimo il sovraccarico di gestione.
Architettura
Il seguente diagramma mostra l'architettura di Autoscaler in una topologia di deployment distribuita:
Per una spiegazione dei componenti di Autoscaler e di ciascuno dei passaggi numerati nel flusso di eventi, consulta Scalabilità automatica di Spanner.
Funzione di inoltro
Cloud Scheduler può pubblicare messaggi solo negli argomenti dello stesso progetto, pertanto per la topologia distribuita questo tutorial introduce un componente intermedio chiamato funzione di inoltro.
La funzione Forwarder prende i messaggi pubblicati su Pub/Sub da Cloud Scheduler, controlla la loro sintassi JSON e li inoltra all'argomento Pub/Sub Poller. L'argomento può appartenere a un progetto distinto da Cloud Scheduler.
Il seguente diagramma mostra i componenti utilizzati per il meccanismo di inoltro:
Come mostrato nel diagramma precedente, le istanze Spanner si trovano nei progetti Application 1 e Application 2:
- Cloud Scheduler è lo stesso progetto delle istanze Spanner.
(2a) Cloud Scheduler pubblica i suoi messaggi nell'argomento Forwarder nei progetti Application 1 e Application 2.
(2b) La funzione Forwarder legge i messaggi dall'argomento Forwarder.
(2c) La funzione Forwarder inoltra i messaggi allo argomento Polling nel progetto Autoscaler.
La funzione di polling legge i messaggi dall'argomento di polling e il processo continua, come descritto in Autoscaling Spanner.
Obiettivi
- Esegui il deployment di Autoscaler utilizzando un modello di deployment distribuito.
- Importa le istanze Spanner esistenti nello stato di Terraform.
- Configura Autoscaler.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Se segui le istruzioni di questo tutorial, i costi associati all'utilizzo dei componenti di Autoscaler dovrebbero essere nulli o quasi. Tuttavia, questa stima non include i costi per le istanze Spanner. Per un esempio di come calcolare i costi delle istanze Spanner, consulta Scalabilità automatica di Spanner.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
In una topologia di deployment distribuito, oltre a un progetto Autoscaler, devi configurare un secondo progetto, denominato in questo tutorial Progetto di applicazione. Il progetto dell'applicazione contiene le risorse dell'applicazione, incluso Spanner. In questo tutorial, configurerai e abiliterai la fatturazione e le API per questi due progetti separatamente.
-
In the Google Cloud console, activate Cloud Shell.
In Cloud Shell, clona il seguente repository:
git clone https://github.com/cloudspannerecosystem/autoscaler
Esporta le variabili per le directory di lavoro:
export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project" export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
Preparazione del progetto Autoscaler
In questa sezione prepari il deployment del progetto che contiene tutta l'infrastruttura di Autoscaler centralizzata, ad eccezione di Cloud Scheduler.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Make sure that billing is enabled for your Google Cloud project.
Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.
In Cloud Shell, imposta le variabili di ambiente con l'ID del progetto Autoscaler:
export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
Imposta la regione e la zona e la località App Engine (per Firestore) per l'infrastruttura di Autoscaler:
export AUTO_SCALER_REGION=us-central1 export AUTO_SCALER_ZONE=us-central1-c export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
Crea un account di servizio:
gcloud iam service-accounts create terraformer --display-name "Terraform service account"
Terraform utilizza questo account per creare tutte le risorse della tua infrastruttura.
Assegna il ruolo di proprietario del progetto all'account di servizio:
gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \ --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/owner
Crea un file della chiave dell'account di servizio:
gcloud iam service-accounts keys create \ --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
Se il tuo progetto non ha ancora un'istanza Firestore, creane una:
gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}" gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
Deployment del gestore della scalabilità automatica
In questa sezione, esegui il deployment dei componenti che costituiscono Autoscaler utilizzando i file Terraform nelle seguenti directory:
Directory | Contenuti della directory |
---|---|
terraform/ |
Configurazione di primo livello, che include tutte le opzioni di deployment e i moduli riutilizzabili. |
|
Configurazione per il progetto in cui si trova il gestore della scalabilità automatica. Delega al modulo Autoscaler. |
terraform/modules/autoscaler-functions |
Configurazione delle funzioni Cloud Run di Polling e Scaler e degli argomenti Pub/Sub. |
In Cloud Shell, imposta l'ID progetto, la regione, la zona e la posizione di App Engine nelle variabili di ambiente Terraform corrispondenti:
export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}" export TF_VAR_region="${AUTO_SCALER_REGION}" export TF_VAR_zone="${AUTO_SCALER_ZONE}" export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
Cambia la directory in quella del progetto scaler di Terraform e inizializzala:
cd "${AUTOSCALER_DIR}" terraform init
Crea l'infrastruttura del gestore della scalabilità automatica:
terraform apply -parallelism=2
Dopo aver verificato le risorse, digita
yes
quando richiesto.Quando esegui questo comando in Cloud Shell, potresti visualizzare il seguente messaggio di errore:
"Error: cannot assign requested address"
Questo errore è un problema noto nel provider Google di Terraform. In questo caso, riprova con il seguente comando:
terraform apply -parallelism=1
Preparazione del progetto dell'applicazione
In questa sezione, nel progetto che contiene le istanze Spanner, prepari il deployment dell'argomento e della funzione Cloud Scheduler e Forwarder.
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Make sure that billing is enabled for your Google Cloud project.
Enable the Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.
In Cloud Shell, imposta le variabili di ambiente con l'ID del progetto dell'applicazione:
export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID gcloud config set project "${APP_PROJECT_ID}"
Imposta la regione e la zona e la località App Engine per il progetto dell'applicazione:
export APP_REGION=us-central1 export APP_ZONE=us-central1-c export APP_APP_ENGINE_LOCATION=us-central
Crea un account di servizio da utilizzare da Terraform per creare le risorse nella tua infrastruttura:
gcloud iam service-accounts create terraformer --display-name "Terraform service account"
Assegna il ruolo di proprietario del progetto(
roles/owner
) all'account di servizio:gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \ --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/owner
Crea un file della chiave dell'account di servizio:
gcloud iam service-accounts keys create \ --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" "${APP_DIR}/key.json"
Crea un'applicazione per abilitare Cloud Scheduler:
gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
Non è necessario creare un database Firestore perché lo stato viene archiviato nel progetto Autoscaler.
Esegui il deployment dell'infrastruttura del progetto dell'applicazione
I componenti Terraform che costituiscono il progetto dell'applicazione si trovano nelle seguenti directory:
terraform/
: configurazione di primo livello, che include tutte le opzioni di implementazione e i moduli riutilizzabili.terraform/distributed/app-project/
: configurazione per il progetto dell'applicazione in cui si trova Spanner. Utilizza i seguenti moduli:terraform/modules/scheduler/
: configurazione di Cloud Scheduler per attivare l'esecuzione di polling.terraform/modules/spanner/
: Configurazione del database Spannerterraform/modules/forwarder/
: configurazione delle funzioni Cloud Run del forwarder.
In questa sezione utilizzi i file Terraform per eseguire il deployment dei componenti che costituiscono il progetto dell'applicazione.
In Cloud Shell, imposta l'ID progetto, la regione, la zona e la posizione di App Engine nelle variabili di ambiente Terraform corrispondenti:
export TF_VAR_project_id="${APP_PROJECT_ID}" export TF_VAR_region="${APP_REGION}" export TF_VAR_zone="${APP_ZONE}" export TF_VAR_location="${APP_APP_ENGINE_LOCATION}"
Imposta l'ID progetto in cui è archiviato lo stato dell'autoscalabilità:
export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
Lo stato del gestore della scalabilità automatica include i timestamp in cui sono stati attivati gli eventi di scalabilità per ogni istanza.
Se vuoi creare una nuova istanza Spanner per testare Autoscaler, imposta la seguente variabile:
export TF_VAR_terraform_spanner=true
L'istanza Spanner creata da Terraform è denominata
autoscale-test
.Se non vuoi creare una nuova istanza Spanner perché ne hai già una da monitorare con Autoscaler, imposta il nome dell'istanza nella seguente variabile:
export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
Per saperne di più su come configurare Terraform per gestire l'istanza Spanner, consulta Importare le istanze Spanner
Cambia la directory in quella del progetto dell'app
Terraform
e inizializzala:cd "${APP_DIR}" terraform init
Crea l'infrastruttura nel progetto dell'applicazione:
terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}" terraform apply -parallelism=2
Verifica che l'elenco delle risorse da creare con Terraform sia corretto, quindi digita
yes
quando richiesto.Quando esegui questo comando in Cloud Shell, potresti visualizzare il seguente messaggio di errore:
"Error: cannot assign requested address"
Questo errore è un problema noto nel provider Google di Terraform. In questo caso, riprova con il comando seguente:
terraform apply -parallelism=1
Autorizza le funzioni Cloud Run del forwarder a pubblicare nell'argomento del poller
In Cloud Shell, torna alla directory del progetto Terraform di Autoscaler e assicurati che le variabili Terraform siano impostate correttamente:
cd "${AUTOSCALER_DIR}" export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}" export TF_VAR_region="${AUTO_SCALER_REGION}" export TF_VAR_zone="${AUTO_SCALER_ZONE}" export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
Imposta le variabili Terraform per gli account di servizio del forwarder. Aggiorna e aggiungi gli account di servizio come richiesto:
export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]' terraform apply -parallelism=2
Verifica che l'elenco delle risorse da creare da Terraform sia corretto, quindi digita
yes
quando richiesto.Quando esegui questo comando in Cloud Shell, potresti visualizzare il seguente messaggio di errore:
"Error: cannot assign requested address"
Questo errore è un problema noto nel provider Google di Terraform. In questo caso, riprova con il comando seguente:
terraform apply -parallelism=1.
Verifica del deployment
Quando l'infrastruttura per l'autoscalabilità è pronta, puoi configurarne i parametri. Per saperne di più, consulta Configurare il gestore della scalabilità automatica.
Poiché in questo tutorial crei un deployment distribuito, i log hanno le seguenti proprietà:
- I log delle funzioni di Polling e Scaler vengono visualizzati in Esplora log per il progetto Autoscaler.
- I log relativi agli errori di sintassi nella configurazione JSON del payload di Cloud Scheduler vengono visualizzati in Esplora log per ogni progetto di applicazione. In questo modo, il team responsabile di un'istanza Spanner specifica può risolvere autonomamente i problemi di configurazione.
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Passaggi successivi
- Scopri di più sull'architettura di Autoscaler.
- Scopri come implementare Autoscaler in modalità per progetto o centralizzata.
- Scopri di più sulle soglie consigliate di Spanner.
- Scopri di più sulle metriche di utilizzo della CPU e sulle metriche di latenza di Spanner.
- Scopri di più sulle best practice per la progettazione dello schema di Spanner.
- Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.