Esegui il deployment di uno strumento di scalabilità automatica distribuito per Cloud Spanner


Questo tutorial mostra come configurare l'infrastruttura dello strumento del gestore della scalabilità automatica per Cloud Spanner utilizzando una topologia di deployment distribuita. Nell'opzione di deployment presentata in questo tutorial, tutti i componenti del gestore della scalabilità automatica si trovano in un unico progetto, ad eccezione di Cloud Scheduler, dell'argomento Forwarder e della funzione corrispondente.

Questo tutorial è destinato ai team IT, operativi e di Site Reliability Engineering che vogliono ridurre i costi operativi e ottimizzare il costo dei deployment di Cloud Spanner. Il presente documento fa parte di una serie:

La topologia di deployment distribuita riunisce le seguenti caratteristiche vantaggiose dei deployment centralizzati e per progetto:

  • I team che possiedono le istanze Spanner, chiamati team delle applicazioni, gestiscono i parametri di configurazione del gestore della scalabilità automatica per le istanze con i job di Cloud Scheduler di loro proprietà.
  • Al di fuori dei parametri di configurazione, un team centrale gestisce il resto dell'infrastruttura del gestore della scalabilità automatica, riducendo al minimo l'overhead della gestione.

Architettura

Il seguente diagramma mostra l'architettura del gestore della scalabilità automatica in una topologia di deployment distribuito:

Topologia di deployment distribuito.

Per una spiegazione dei componenti del gestore della scalabilità automatica e di ciascuno dei passaggi numerati nel flusso degli eventi, vedi Scalabilità automatica di Cloud Spanner.

Funzione di forwarding

Cloud Scheduler può pubblicare messaggi solo negli argomenti dello stesso progetto. Pertanto, per la topologia distribuita, questo tutorial introduce un componente intermedio chiamato funzione Forwarder.

La funzione Forwarder prende i messaggi pubblicati in Pub/Sub da Cloud Scheduler, ne controlla la sintassi JSON e li inoltra all'argomento Poller Pub/Sub. L'argomento può appartenere a un progetto separato in Cloud Scheduler.

Il seguente diagramma mostra i componenti utilizzati per il meccanismo di inoltro:

Meccanismo di forwarding.

Come mostrato nel diagramma precedente, le istanze di Cloud Spanner si trovano nei progetti denominati Applicazione 1 e Applicazione 2:

  1. Cloud Scheduler è lo stesso progetto delle istanze Cloud Spanner.
  2. (2a) Cloud Scheduler pubblica i propri messaggi nell'argomento Forwarder nei progetti dell'Applicazione 1 e dell'Applicazione 2.

    (2b) La funzione Forwarder legge i messaggi dall'argomento Forwarder.

    (2c) La funzione Forwarder inoltra i messaggi all'argomento Polling che risiede nel progetto del gestore della scalabilità automatica.

  3. La funzione Poller legge i messaggi dall'argomento di polling e il processo continua, come descritto in Scalabilità automatica di Cloud Spanner.

Obiettivi

  • Esegui il deployment del gestore della scalabilità automatica utilizzando un modello di deployment distribuito.
  • Importa le istanze Cloud Spanner esistenti nello stato di Terraform.
  • Configura il gestore della scalabilità automatica.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Quando segui le istruzioni di questo tutorial, i costi associati al funzionamento dei componenti del gestore della scalabilità automatica devono essere pari a zero o prossimi a zero. Tuttavia, questa stima non include i costi per le istanze di Cloud Spanner. Per un esempio di come calcolare i costi delle istanze di Cloud Spanner, consulta Scalabilità automatica di Cloud Spanner.

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

In una topologia di deployment distribuita, oltre a un progetto del gestore della scalabilità automatica, devi impostare un secondo progetto, che in questo tutorial è denominato Progetto di applicazione. Il progetto di applicazione contiene le risorse dell'applicazione, tra cui Cloud Spanner. In questo tutorial puoi configurare e abilitare separatamente la fatturazione e le API per questi due progetti.

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

  2. In Cloud Shell, clona il seguente repository:

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. Esporta 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 del gestore della scalabilità automatica

In questa sezione preparerai il deployment del progetto che contiene tutta l'infrastruttura centralizzata del gestore della scalabilità automatica, ad eccezione di Cloud Scheduler.

  1. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  3. Abilita le API Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Cloud Spanner, Pub/Sub, Cloud Functions, and Cloud Build.

    Abilita le API

  4. In Cloud Shell, imposta le variabili di ambiente con l'ID del progetto del gestore della scalabilità automatica:

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. Imposta la regione e la zona e la località di App Engine (per Firestore) per l'infrastruttura del gestore della scalabilità automatica:

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. 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 nella tua infrastruttura.

  7. 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
    
  8. Crea un file delle chiavi dell'account di servizio:

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. 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 eseguirai il deployment dei componenti che costituiscono il gestore della scalabilità automatica utilizzando i file Terraform nelle seguenti directory:

Directory Contenuti della directory
terraform/ Configurazione di primo livello, che include ciascuna delle opzioni di deployment e i moduli riutilizzabili.
terraform/cloud-functions/distributed/autoscaler-project/ Configurazione per il progetto in cui si trova il gestore della scalabilità automatica. Delega al modulo Gestore della scalabilità automatica.
terraform/modules/autoscaler-functions Configurazione delle funzioni Cloud Functions per pollice e scaler e argomenti Pub/Sub.
  1. In Cloud Shell, imposta l'ID progetto, la regione, la zona e la località 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}"
    
  2. Cambia la directory nella directory del progetto scaler di Terraform e inizializzala:

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. 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 del provider Google Terraform. In questo caso, riprova con il comando seguente:

    terraform apply -parallelism=1
    

Preparazione del progetto dell'applicazione

In questa sezione, nel progetto che contiene le istanze di Spanner, preparerai il deployment dell'argomento e della funzione Cloud Scheduler e del forwardinger.

  1. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  3. Abilita le API Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Cloud Spanner, Pub/Sub, Cloud Functions, and Cloud Build.

    Abilita le API

  4. In Cloud Shell, imposta le variabili di ambiente con l'ID del progetto di applicazione:

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. Imposta la regione e la zona e la località di App Engine per il progetto di applicazione:

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. Crea un account di servizio per Terraform da utilizzare per creare le risorse nella tua infrastruttura:

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. 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
    
  8. Crea un file delle chiavi dell'account di servizio:

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. Crea un'applicazione per abilitare Cloud Scheduler:

    gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
    

    Non è necessario creare un database Firestore perché lo stato è archiviato nel progetto del gestore della scalabilità automatica.

Esegui il deployment dell'infrastruttura del progetto dell'applicazione

I componenti Terraform che compongono il progetto dell'applicazione si trovano nelle seguenti directory:

In questa sezione utilizzerai i file Terraform per eseguire il deployment dei componenti che compongono il progetto dell'applicazione.

  1. In Cloud Shell, imposta l'ID progetto, la regione, la zona e la località 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}"
    
  2. Imposta l'ID progetto in cui è archiviato lo stato del gestore della scalabilità automatica:

    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.

  3. Se vuoi creare una nuova istanza Spanner per testare il gestore della scalabilità automatica, 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é hai già un'istanza che il gestore della scalabilità automatica può monitorare, imposta il nome dell'istanza nella variabile seguente:

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    Per saperne di più su come impostare Terraform per gestire l'istanza di Spanner, consulta Importazione delle istanze Spanner

  4. Cambia la directory nella directory Terraform del progetto app e inizializzala:

    cd "${APP_DIR}"
    terraform init
    
  5. Crea l'infrastruttura nel progetto di applicazione:

    terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}"
    terraform apply -parallelism=2
    

    Verifica che l'elenco di risorse da creare per 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 del provider Google Terraform. In questo caso, riprova con il comando seguente:

    terraform apply -parallelism=1
    

Autorizza la pubblicazione di Forwarder Cloud Functions nell'argomento Poller

  1. In Cloud Shell, torna alla directory di progetto Autoscaler terraform 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}"
    
  2. Imposta le variabili Terraform per gli account di servizio Forwarder. Aggiorna e aggiungi i tuoi account di servizio in base alle esigenze:

     export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]'
      terraform apply -parallelism=2
    

    Verifica che l'elenco di risorse da creare per 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 del provider Google Terraform. In questo caso, riprova con il comando seguente:

    terraform apply -parallelism=1.
    

Verifica del deployment

Quando l'infrastruttura per il gestore della scalabilità automatica è pronta, puoi configurarne i parametri. Per scoprire di più, vedi Configurare il gestore della scalabilità automatica.

Poiché in questo tutorial crei un deployment distribuito, i log hanno le seguenti proprietà:

  • I log delle funzioni Poller e Scaler vengono visualizzati in Esplora log per il progetto Autoscaler.
  • I log sugli errori di sintassi nella configurazione JSON del payload di Cloud Scheduler vengono visualizzati in Esplora log per ciascun progetto di applicazione. Ciò consente al team responsabile di una specifica istanza di Cloud Spanner di risolvere i problemi di configurazione in modo indipendente.

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

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi