Questa guida spiega come eseguire deployment blu/verdi senza tempi di inattività su Gruppi di istanze gestite (MIG) di Compute Engine utilizzando Cloud Build e Terraform.
Cloud Build ti consente di automatizzare una serie di processi per gli sviluppatori, tra cui la creazione e il deployment di applicazioni su vari Google Cloud runtime come Compute Engine, Google Kubernetes Engine, GKE Enterprise e funzioni Cloud Run.
I gruppi di istanze gestite Compute Engine ti consentono di utilizzare le applicazioni su più macchine virtuali (VM) identiche. Puoi rendere i tuoi carichi di lavoro scalabili e ad alta disponibilità sfruttando i servizi MIG automatizzati, tra cui: scalabilità automatica, riparazione automatica, deployment regionale (più zone) e aggiornamento automatico. Utilizzando il modello di deployment continuo blu/verde, scoprirai come trasferire gradualmente il traffico utente da un gruppo di istanze gestite (MIG) (blu) a un altro gruppo di istanze gestite (MIG) (verde), entrambi in esecuzione in produzione.
Panoramica del design
Il seguente diagramma mostra il modello di implementazione blue/green utilizzato dall'esempio di codice descritto in questo documento:
In linea generale, questo modello include i seguenti componenti:
- Due pool di VM Compute Engine: blu e verde.
- Tre bilanciatori del carico HTTP(S) esterni:
- Un bilanciatore del carico blu/verde che instrada il traffico dagli utenti finali al pool blu o verde di istanze VM.
- Un bilanciatore del carico Blue che instrada il traffico dagli sviluppatori e dai tecnici QA al pool di istanze VM Blue.
- Un bilanciatore del carico verde che instrada il traffico dagli sviluppatori e dai tecnici QA al pool di istanze verdi.
- Due insiemi di utenti:
- Utenti finali che hanno accesso al bilanciatore del carico blu/verde, che li indirizza al pool di istanze blu o verde.
- Ingegneri QA e sviluppatori che richiedono l'accesso a entrambi i set di pool per scopi di sviluppo e test. Possono accedere sia ai bilanciatori del carico blu che a quelli verdi, che li indirizzano rispettivamente al pool di istanze blu e al pool di istanze verdi.
I pool di VM blu e verdi sono implementati come MIG di Compute Engine e gli indirizzi IP esterni vengono instradati nelle VM del MIG utilizzando bilanciatori del carico HTTP(s) esterni. Il codice di esempio descritto in questo documento utilizza Terraform per configurare questa infrastruttura.
Il seguente diagramma illustra le operazioni dello sviluppatore che si verificano nel deployment:
Nel diagramma sopra, le frecce rosse rappresentano il flusso di bootstrap che si verifica quando configuri l'infrastruttura di deployment per la prima volta, mentre le frecce blu rappresentano il flusso GitOps che si verifica durante ogni deployment.
Per configurare questa infrastruttura, esegui uno script di configurazione che avvia il processo di bootstrap e configura i componenti per il flusso GitOps.
Lo script di configurazione esegue una pipeline Cloud Build che esegue le seguenti operazioni:
- Crea un repository in Cloud Source Repositories chiamato
copy-of-gcp-mig-simple
e copia il codice sorgente dal repository di esempio GitHub al repository in Cloud Source Repositories. - Crea due trigger di Cloud Build denominati
apply
edestroy
.
L'attivatore apply
è associato a un file Terraform denominato main.tfvars
in Cloud Source Repositories. Questo file contiene le variabili Terraform che rappresentano i bilanciatori del carico blu e verde.
Per configurare il deployment, aggiorna le variabili nel file main.tfvars
.
L'attivatore apply
esegue una pipeline Cloud Build che esegue tf_apply
ed esegue le seguenti operazioni:
- Crea due gruppi di istanze gestite di Compute Engine (uno per il gruppo verde e uno per il gruppo blu), quattro istanze VM Compute Engine (due per il gruppo verde e due per il gruppo blu), i tre bilanciatori del carico (blu, verde e lo splitter) e tre indirizzi IP pubblici.
- Stampa gli indirizzi IP che puoi utilizzare per visualizzare le applicazioni di cui è stato eseguito il deployment nelle istanze blu e verde.
L'attivatore di eliminazione viene attivato manualmente per eliminare tutte le risorse create dall'attivatore di applicazione.
Obiettivi
Utilizza Cloud Build e Terraform per configurare bilanciatori del carico HTTP(S) esterni con backend di gruppi di istanze VM di Compute Engine.
Esegui deployment blu/verdi sulle istanze VM.
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.
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
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
Prova
Esegui lo script di configurazione dal repository di esempi di codice di Google:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
Quando lo script di configurazione richiede il consenso dell'utente, inserisci yes.
Lo script termina l'esecuzione in pochi secondi.
Nella console Google Cloud, apri la pagina Cronologia di compilazione di Cloud Build:
Fai clic sull'ultima build.
Viene visualizzata la pagina Dettagli build, che mostra una pipeline Cloud Build con tre passaggi di compilazione: il primo passaggio di compilazione crea un repository in Cloud Source Repositories, il secondo clona i contenuti del repository di esempio in GitHub in Cloud Source Repositories e il terzo aggiunge due trigger di compilazione.
Apri Cloud Source Repositories:
Nell'elenco dei repository, fai clic su
copy-of-gcp-mig-simple
.Nella scheda Cronologia in fondo alla pagina, vedrai un commit con la descrizione
A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
eseguito da Cloud Build per creare un repository denominatocopy-of-gcp-mig-simple
.Apri la pagina Trigger di Cloud Build:
Per avviare la procedura di deployment, aggiorna il file
infra/main.tfvars
:Nella finestra del terminale, crea e vai a una cartella denominata
deploy-compute-engine
:mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
Clona il repository
copy-of-gcp-mig-simple
:gcloud source repos clone copy-of-mig-blue-green
Vai alla directory clonata:
cd ./copy-of-mig-blue-green
Aggiorna
infra/main.tfvars
per sostituire il blu con il verde:sed -i'' -e 's/blue/green/g' infra/main.tfvars
Aggiungi il file aggiornato:
git add .
Esegui il commit del file:
git commit -m "Promote green"
Esegui il push del file:
git push
Le modifiche apportate a
infra/main.tfvars
attivano l'esecuzione dell'attivatoreapply
, che avvia il deployment.
Apri Cloud Source Repositories:
Nell'elenco dei repository, fai clic su
copy-of-gcp-mig-simple
.Vedrai il commit con la descrizione
Promote green
nella scheda Cronologia nella parte inferiore della pagina.Per visualizzare l'esecuzione dell'attivatore
apply
, apri la pagina Cronologia di Build nella console Google Cloud:Apri la pagina Dettagli build facendo clic sulla prima build.
Vedrai la pipeline di attivazione
apply
con due passaggi di compilazione. Il primo passaggio di compilazione esegue Terraform apply per creare le risorse Compute Engine e di bilanciamento del carico per il deployment. Il secondo passaggio di compilazione stampa l'indirizzo IP su cui puoi vedere l'applicazione in esecuzione.Apri l'indirizzo IP corrispondente al MIG verde in un browser. Vedrai uno screenshot simile al seguente che mostra il deployment:
Vai alla pagina Gruppo di istanze di Compute Engine per visualizzare i gruppi di istanze blu e verde:
Apri la pagina Istanze VM per visualizzare le quattro istanze VM:
Apri la pagina Indirizzi IP esterni per visualizzare i tre bilanciatori del carico:
Vedrai due trigger di compilazione denominati apply
e destroy
. L'attivatore apply
è associato al file infra/main.tfvars
nel ramo main
. Questo attivatore viene eseguito ogni volta che il file viene aggiornato. L'attivatore destroy
è un attivatore manualmente.
Nozioni di base sul codice
Il codice sorgente di questo esempio di codice include:
- Codice sorgente relativo allo script di configurazione.
- Codice sorgente relativo alle pipeline Cloud Build.
- Codice sorgente relativo ai modelli Terraform.
Script di configurazione
setup.sh
è lo script di configurazione che esegue il processo di bootstrap e crea i componenti per il deployment blu/verde. Lo script esegue le seguenti operazioni:
- Abilita le API Cloud Build, Resource Manager, Compute Engine e Cloud Source Repositories.
- Concedi il ruolo IAM
roles/editor
all'account di servizio Cloud Build nel tuo progetto. Questo ruolo è obbligatorio per consentire a Cloud Build di creare e configurare i componenti GitOps necessari per il deployment. - Concedi il ruolo IAM
roles/source.admin
all'account di servizio Cloud Build nel tuo progetto. Questo ruolo è necessario per consentire all'account di servizio Cloud Build di creare i repository Cloud Source Repositories nel progetto e clonare i contenuti del repository GitHub di esempio nei tuoi repository Cloud Source Repositories. Genera una pipeline Cloud Build in linea denominata
bootstrap.cloudbuild.yaml
che:- Crea un nuovo repository in Cloud Source Repositories.
- Copia il codice sorgente dal repository GitHub di esempio al nuovo repository in Cloud Source Repositories.
- Crea gli trigger di build di applicazione ed eliminazione.
Pipeline Cloud Build
apply.cloudbuild.yaml
e destroy.cloudbuild.yaml
sono i
file di configurazione di Cloud Build utilizzati dallo script di configurazione per configurare le
risorse per il flusso GitOps. apply.cloudbuild.yaml
contiene due passaggi di compilazione:
- Il passaggio di compilazione
tf_apply build
che chiama la funzionetf_install_in_cloud_build_step
, che installa Terraform.tf_apply
che crea le risorse utilizzate nel flusso GitOps. Le funzionitf_install_in_cloud_build_step
etf_apply
sono definite inbash_utils.sh
e il passaggio di compilazione utilizza il comandosource
per chiamarle. describe_deployment
Passaggio di compilazione che chiama la funzionedescribe_deployment
che stampa gli indirizzi IP dei bilanciatori del carico.
destroy.cloudbuild.yaml
chiama tf_destroy
che elimina tutte le risorse
create da tf_apply
.
Le funzioni tf_install_in_cloud_build_step
, tf_apply
,
describe_deployment
e tf_destroy
sono definite nel file bash_utils.sh
.
I file di configurazione della build utilizzano il comando source
per chiamare le funzioni.
Il codice seguente mostra la funzione tf_install_in_cloud_build_step
definita in bash_utils.sh
. I file di configurazione di compilazione chiamano questa funzione per installare Terraform al volo. Viene creato un bucket Cloud Storage per registrare lo stato di Terraform.
Il seguente snippet di codice mostra la funzione tf_apply
definita in bash_utils.sh
. Innanzitutto chiama terraform init
che carica tutti i moduli e le librerie personalizzate, quindi esegue terraform apply
per caricare le variabili dal file main.tfvars
.
Il seguente snippet di codice mostra la funzione describe_deployment
definita in bash_utils.sh
. Utilizza gcloud compute addresses describe
per recuperare
gli indirizzi IP dei bilanciatori del carico utilizzando il nome e li stampa.
Il seguente snippet di codice mostra la funzione tf_destroy
definita in bash_utils.sh
. Chiama terraform init
che carica tutti i moduli e le librerie personalizzate, quindi esegue terraform destroy
che scarica le variabili Terraform.
Modelli Terraform
Troverai tutti i file e le variabili di configurazione di Terraform nella
copy-of-gcp-mig-simple/infra/
.
main.tf
: questo è il file di configurazione Terraformmain.tfvars
: questo file definisce le variabili Terraform.mig/
esplitter/
: queste cartelle contengono i moduli che definiscono i bilanciatori del carico. La cartellamig/
contiene il file di configurazione Terraform che definisce il MIG per i bilanciatori del carico blu e verde. I MIG blu e verde sono identici, pertanto vengono definiti una volta e messi in istanza per gli oggetti blu e verde. Il file di configurazione Terraform per il bilanciatore del carico dello splitter si trova nella cartellasplitter/
.
Il seguente snippet di codice mostra i contenuti di infra/main.tfvars
. Contiene tre variabili: due che determinano la versione dell'applicazione da eseguire nel pool blu e verde e una variabile per il colore attivo: blu o verde. Le modifiche a questo file attivano il deployment.
Di seguito è riportato uno snippet di codice di infra/main.tf
. In questo snippet:
- Viene definita una variabile per il progetto Google Cloud.
- Google è impostato come provider Terraform.
- Viene definita una variabile per lo spazio dei nomi. A tutti gli oggetti creati da Terraform viene preposto questo prefisso in modo che più versioni dell'applicazione possano essere implementate nello stesso progetto e i nomi degli oggetti non entrino in conflitto tra loro.
- Le variabili
MIG_VER_BLUE
,MIG_VER_BLUE
eMIG_ACTIVE_COLOR
sono le associazioni per le variabili nel fileinfra/main.tfvars
.
Il seguente snippet di codice di infra/main.tf
mostra l'istanziazione del modulo splitter. Questo modulo acquisisce il colore attivo in modo che il bilanciatore del carico dello splitter sappia in quale MIG eseguire il deployment dell'applicazione.
Il seguente snippet di codice di infra/main.tf
definisce due moduli identici per i gruppi di istanze gestite blu e verdi. Prende il colore, la rete e la subnet
che sono definiti nel modulo dello splitter.
Il file splitter/main.tf
definisce gli oggetti creati per il gruppo di istanze gestite dello splitter. Di seguito è riportato uno snippet di codice di splitter/main.tf
che contiene la logica per passare dal MIG verde a quello blu. È supportato dal servizio google_compute_region_backend_service
, che può indirizzare il traffico a due regioni di backend: var.instance_group_blue
o var.instance_group_green
.
capacity_scaler
definisce la quantità di traffico da instradare.
Il seguente codice indirizzi il 100% del traffico al colore specificato, ma puoi aggiornarlo per il deployment canary in modo da indirizzare il traffico a un sottoinsieme di utenti.
Il file mig/main.tf
definisce gli oggetti relativi ai MIG blu e verdi. Il seguente snippet di codice di questo file definisce il modello di istanza Compute Engine utilizzato per creare i pool di VM. Tieni presente che questo
modello di istanza ha la proprietà del ciclo di vita Terraform impostata su create_before_destroy
.
Questo perché, quando aggiorni la versione del pool, non puoi utilizzare il
modello per creare la nuova versione dei pool se è ancora in uso dalla
versione precedente del pool. Tuttavia, se la versione precedente del pool viene distrutta prima della creazione del nuovo modello, ci sarà un periodo di tempo in cui i pool non saranno disponibili. Per evitare questo scenario, abbiamo impostato il ciclo di vita di Terraform su
create_before_destroy
in modo che la versione più recente di un pool di VM venga creata prima
prima che la versione precedente venga eliminata.
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 singole risorse
Elimina le risorse Compute Engine create dall'attivatore di applicazione:
Apri la pagina Trigger di Cloud Build:
Nella tabella Attivatori, individua la riga corrispondente all'attivatore destroy e fai clic su Esegui. Al termine dell'esecuzione dell'attivatore, le risorse create dall'attivatore apply vengono eliminate.
Elimina le risorse create durante l'inizializzazione eseguendo il seguente comando nella finestra del terminale:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/teardown.sh)
Elimina il progetto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Passaggi successivi
- Scopri di più sugli attivatori di compilazione.
- Scopri come visualizzare la provenienza della build.