In dieser Anleitung wird erläutert, wie Sie Blau/Grün-Bereitstellungen ohne Ausfallzeiten in verwalteten Compute Engine-Instanzgruppen (MIGs) mit Cloud Build und Terraform ausführen.
Mit Cloud Build können Sie eine Vielzahl von Entwicklerprozessen automatisieren. Dazu gehört auch das Erstellen und Bereitstellen von Anwendungen für verschiedene Google Cloud-Laufzeiten wie Compute Engine, Google Kubernetes Engine, GKE Enterprise und Cloud Functions.
Mit Compute Engine-MIGs können Sie Anwendungen auf mehreren identischen virtuellen Maschinen (VMs) ausführen. Sie können Ihre Arbeitslasten skalierbar und hochverfügbar machen, indem Sie automatisierte MIG-Dienste nutzen, darunter Autoscaling, automatische Reparatur, regionale Bereitstellung (in mehreren Zonen) und automatische Updates. Mit dem Blau/Grün-Modell für kontinuierliche Bereitstellung erfahren Sie, wie Sie den Nutzertraffic schrittweise von einer MIG (blau) zu einer anderen MIG (grün) übertragen, die beide in der Produktion ausgeführt werden.
Designübersicht
Das folgende Diagramm zeigt das Blau/Grün-Bereitstellungsmodell, das von dem in diesem Dokument beschriebenen Codebeispiel verwendet wird:
Auf übergeordneter Ebene umfasst dieses Modell die folgenden Komponenten:
- Zwei Compute Engine-VM-Pools: Blau und Grün.
- Drei externe HTTP(S)-Load-Balancer:
- Ein Blau/Grün-Load-Balancer, der Traffic von Endnutzern entweder an den Blau- oder Grün-Pool von VM-Instanzen weiterleitet.
- Ein blauer Load-Balancer, der Traffic von QA-Entwicklern und -Entwicklern an den Blue VM-Instanzpool weiterleitet.
- Ein grüner Load Balancer, der Traffic von QA-Entwicklern und -Entwicklern an den grünen Instanzpool weiterleitet.
- Zwei Nutzergruppen:
- Endnutzer, die Zugriff auf den Blau/Grün-Load-Balancer haben, der sie entweder auf den blauen oder den grünen Instanzpool verweist.
- QA-Entwickler und -Entwickler, die für Entwicklungs- und Testzwecke Zugriff auf beide Gruppen von Pools benötigen Sie können sowohl auf den blauen als auch auf den grünen Load-Balancer zugreifen, der sie jeweils zum blauen Instanzpool und zum grünen Instanzpool weiterleitet.
Die blauen und grünen VM-Pools sind als Compute Engine-MIGs implementiert und externe IP-Adressen werden mithilfe externer HTTP(s)-Load-Balancer an die VMs in der MIG weitergeleitet. Im in diesem Dokument beschriebenen Codebeispiel wird Terraform zur Konfiguration dieser Infrastruktur verwendet.
Das folgende Diagramm veranschaulicht die Entwicklervorgänge, die in der Bereitstellung ausgeführt werden:
Im obigen Diagramm stellen die roten Pfeile den Bootstrapping-Ablauf dar, der auftritt, wenn Sie die Bereitstellungsinfrastruktur zum ersten Mal einrichten. Die blauen Pfeile stellen den GitOps-Ablauf bei jeder Bereitstellung dar.
Zum Einrichten dieser Infrastruktur führen Sie ein Setupskript aus, das den Bootstrap-Prozess startet und die Komponenten für den GitOps-Ablauf einrichtet.
Das Setupskript führt eine Cloud Build-Pipeline aus, die die folgenden Vorgänge ausführt:
- In Cloud Source Repositories ein Repository mit dem Namen
copy-of-gcp-mig-simple
erstellen und den Quellcode aus dem GitHub-Beispiel-Repository in das Repository in Cloud Source Repositories kopieren - Es werden zwei Cloud Build-Trigger mit den Namen
apply
unddestroy
erstellt.
Der Trigger apply
ist an eine Terraform-Datei namens main.tfvars
in Cloud Source Repositories angehängt. Diese Datei enthält die Terraform-Variablen für die blauen und die grünen Load-Balancer.
Aktualisieren Sie die Variablen in der Datei main.tfvars
, um die Bereitstellung einzurichten.
Der Trigger apply
führt eine Cloud Build-Pipeline aus, die tf_apply
und die folgenden Vorgänge ausführt:
- Erstellt zwei Compute Engine-MIGs (eine für grün und eine für Blau), vier Compute Engine-VM-Instanzen (zwei für die grüne MIG und zwei für die blaue MIG), die drei Load-Balancer (blau, grün und der Splitter) und drei öffentliche IP-Adressen.
- Gibt die IP-Adressen aus, mit denen Sie die bereitgestellten Anwendungen in den blauen und grünen Instanzen sehen können.
Der Trigger zum Löschen wird manuell ausgelöst, um alle Ressourcen zu löschen, die vom Trigger „Anwenden“ erstellt wurden.
Lernziele
Verwenden Sie Cloud Build und Terraform, um externe HTTP(S)-Load-Balancer mit VM-Instanzgruppen-Back-Ends von Compute Engine einzurichten.
Blau/Grün-Bereitstellungen auf den VM-Instanzen ausführen
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweise
- Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
- Installieren Sie die Google Cloud CLI.
-
Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:
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.
-
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
- Installieren Sie die Google Cloud CLI.
-
Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:
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.
-
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
Testen
Führen Sie das Setup-Skript aus dem Codebeispiel-Repository von Google aus:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
Wenn das Einrichtungsskript die Nutzereinwilligung anfordert, geben Sie yes ein.
Die Ausführung des Skripts ist in wenigen Sekunden abgeschlossen.
Öffnen Sie in der Google Cloud Console die Cloud Build-Seite Build-Verlauf:
Klicken Sie auf den neuesten Build.
Auf der Seite Build-Details wird eine Cloud Build-Pipeline mit drei Build-Schritten angezeigt: Im ersten Build-Schritt wird ein Repository in Cloud Source Repositories erstellt, im zweiten Schritt wird der Inhalt des Beispiel-Repositorys in GitHub in Cloud Source Repositories geklont und im dritten Schritt werden zwei Build-Trigger hinzugefügt.
Öffnen Sie Cloud Source Repositories:
Klicken Sie in der Liste der Repositories auf
copy-of-gcp-mig-simple
.Auf dem Tab Verlauf unten auf der Seite sehen Sie einen Commit mit der Beschreibung
A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
, der von Cloud Build zum Erstellen eines Repositorys mit dem Namencopy-of-gcp-mig-simple
erstellt wurde.Öffnen Sie die Cloud Build-Seite Trigger:
Aktualisieren Sie die Datei
infra/main.tfvars
, um den Bereitstellungsprozess zu starten:Erstellen Sie in Ihrem Terminalfenster einen Ordner mit dem Namen
deploy-compute-engine
und rufen Sie ihn auf:mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
Klonen Sie das
copy-of-gcp-mig-simple
-Repo:gcloud source repos clone copy-of-mig-blue-green
Rufen Sie das geklonte Verzeichnis auf:
cd ./copy-of-mig-blue-green
Aktualisieren Sie
infra/main.tfvars
, um Blau durch Grün zu ersetzen:sed -i'' -e 's/blue/green/g' infra/main.tfvars
Fügen Sie die aktualisierte Datei hinzu:
git add .
Führen Sie mit der Datei ein Commit durch:
git commit -m "Promote green"
Übertragen Sie die Datei per Push:
git push
Wenn Sie Änderungen an
infra/main.tfvars
vornehmen, wird derapply
-Trigger ausgeführt, wodurch die Bereitstellung gestartet wird.
Öffnen Sie Cloud Source Repositories:
Klicken Sie in der Liste der Repositories auf
copy-of-gcp-mig-simple
.Sie sehen das Commit mit der Beschreibung
Promote green
unten auf der Seite auf dem Tab Verlauf.Öffnen Sie in der Google Cloud Console die Seite Build-Verlauf, um die Ausführung des Triggers
apply
anzusehen:Öffnen Sie die Seite Build-Details, indem Sie auf den ersten Build klicken.
Sie sehen die Triggerpipeline
apply
mit zwei Build-Schritten. Im ersten Build-Schritt wird „Terraform apply“ ausgeführt, um die Compute Engine- und Load-Balancing-Ressourcen für die Bereitstellung zu erstellen. Der zweite Build-Schritt gibt die IP-Adresse aus, unter der Sie die ausgeführte Anwendung sehen können.Öffnen Sie die IP-Adresse der grünen MIG in einem Browser. Es wird ein Screenshot wie der folgende angezeigt, der die Bereitstellung zeigt:
Rufen Sie die Seite Instanzgruppe von Compute Engine auf, um die blauen und die grünen Instanzgruppen zu sehen:
Öffnen Sie die Seite VM-Instanzen, um die vier VM-Instanzen zu sehen:
Öffnen Sie die Seite Externe IP-Adressen, um die drei Load-Balancer anzuzeigen:
Sie sehen zwei Build-Trigger mit den Namen apply
und destroy
. Der Trigger apply
ist an die Datei infra/main.tfvars
im Zweig main
angehängt. Dieser Trigger wird jedes Mal ausgeführt, wenn die Datei aktualisiert wird. Der Trigger destroy
ist ein manueller Trigger.
Code verstehen
Der Quellcode für dieses Codebeispiel enthält:
- Quellcode, der sich auf das Setup-Skript bezieht.
- Quellcode für die Cloud Build-Pipelines.
- Quellcode, der sich auf die Terraform-Vorlagen bezieht.
Einrichtungsskript
setup.sh
ist das Einrichtungsskript, das den Bootstrap-Prozess ausführt und die Komponenten für die Blau/Grün-Bereitstellung erstellt. Das Skript führt die folgenden Vorgänge aus:
- Aktiviert die Cloud Build, Resource Manager, Compute Engine und Cloud Source Repositories APIs.
- Gewährt dem Cloud Build-Dienstkonto in Ihrem Projekt die IAM-Rolle
roles/editor
. Diese Rolle ist erforderlich, damit Cloud Build die erforderlichen GitOps-Komponenten für die Bereitstellung erstellen und einrichten kann. - Gewährt dem Cloud Build-Dienstkonto in Ihrem Projekt die IAM-Rolle
roles/source.admin
. Diese Rolle ist erforderlich, damit das Cloud Build-Dienstkonto die Cloud Source Repositories in Ihrem Projekt erstellen und den Inhalt des Beispiel-GitHub-Repositorys in Ihre Cloud Source Repositories klonen kann. Generiert eine Cloud Build-Pipeline namens
bootstrap.cloudbuild.yaml
inline, die:- Erstellt ein neues Repository in Cloud Source Repositories.
- Der Quellcode wird aus dem GitHub-Beispiel-Repository in das neue Repository in Cloud Source Repositories kopiert.
- Erstellt die Build-Trigger zum Anwenden und Löschen.
Cloud Build-Pipelines
apply.cloudbuild.yaml
und destroy.cloudbuild.yaml
sind die Cloud Build-Konfigurationsdateien, die das Einrichtungsskript zum Einrichten der Ressourcen für den GitOps-Ablauf verwendet. apply.cloudbuild.yaml
enthält zwei Build-Schritte:
tf_apply build
-Build-Schritt, der die Funktiontf_install_in_cloud_build_step
aufruft, mit der Terraform installiert wird.tf_apply
, der die im GitOps-Ablauf verwendeten Ressourcen erstellt. Die Funktionentf_install_in_cloud_build_step
undtf_apply
sind inbash_utils.sh
definiert und im Build-Schritt wird der Befehlsource
verwendet, um sie aufzurufen.describe_deployment
-Build-Schritt, der die Funktiondescribe_deployment
aufruft, die die IP-Adressen der Load-Balancer ausgibt.
destroy.cloudbuild.yaml
ruft tf_destroy
auf. Dadurch werden alle von tf_apply
erstellten Ressourcen gelöscht.
Die Funktionen tf_install_in_cloud_build_step
, tf_apply
, describe_deployment
und tf_destroy
sind in der Datei bash_utils.sh
definiert.
Die Build-Konfigurationsdateien rufen die Funktionen mit dem Befehl source
auf.
Der folgende Code zeigt die Funktion tf_install_in_cloud_build_step
, die in bash_utils.sh
definiert ist. Die Build-Konfigurationsdateien rufen diese Funktion auf, um Terraform im laufenden Betrieb zu installieren. Es wird ein Cloud Storage-Bucket erstellt, um den Terraform-Status aufzuzeichnen.
Das folgende Code-Snippet zeigt die Funktion tf_apply
, die in bash_utils.sh
definiert ist. Zuerst wird terraform init
aufgerufen, um alle Module und benutzerdefinierten Bibliotheken zu laden. Anschließend wird terraform apply
ausgeführt, um die Variablen aus der Datei main.tfvars
zu laden.
Das folgende Code-Snippet zeigt die Funktion describe_deployment
, die in bash_utils.sh
definiert ist. Dabei wird gcloud compute addresses describe
verwendet, um die IP-Adressen der Load-Balancer anhand des Namens abzurufen und sie auszugeben.
Das folgende Code-Snippet zeigt die Funktion tf_destroy
, die in bash_utils.sh
definiert ist. Er ruft terraform init
auf, um alle Module und benutzerdefinierten Bibliotheken zu laden, und führt dann terraform destroy
aus, um die Terraform-Variablen zu entladen.
Terraform-Vorlagen
Sie finden alle Terraform-Konfigurationsdateien und -Variablen im Ordner copy-of-gcp-mig-simple/infra/
.
main.tf
: Dies ist die Terraform-Konfigurationsdatei.main.tfvars
: Diese Datei definiert die Terraform-Variablen.mig/
undsplitter/
: Diese Ordner enthalten die Module, die die Load-Balancer definieren. Der Ordnermig/
enthält die Terraform-Konfigurationsdatei, die die MIG für die blauen und grünen Load-Balancer definiert. Die blauen und grünen MIGs sind identisch. Daher werden sie einmal definiert und für die blauen und die grünen Objekte instanziiert. Die Terraform-Konfigurationsdatei für den Splitter-Load-Balancer befindet sich im Ordnersplitter/
.
Das folgende Code-Snippet zeigt den Inhalt von infra/main.tfvars
. Es enthält drei Variablen: zwei Variablen, die bestimmen, welche Anwendungsversion in den blauen und grünen Pools bereitgestellt wird, und eine Variable für die aktive Farbe: Blau oder Grün. Änderungen an dieser Datei lösen die Bereitstellung aus.
Das folgende Code-Snippet stammt von infra/main.tf
. In diesem Snippet gilt:
- Für das Google Cloud-Projekt ist eine Variable definiert.
- Google ist als Terraform-Anbieter festgelegt.
- Für den Namespace ist eine Variable definiert. Allen von Terraform erstellten Objekten wird diese Variable vorangestellt, sodass mehrere Versionen der Anwendung im selben Projekt bereitgestellt werden können und die Objektnamen nicht miteinander kollidieren.
- Die Variablen
MIG_VER_BLUE
,MIG_VER_BLUE
undMIG_ACTIVE_COLOR
sind die Bindungen für die Variablen in der Dateiinfra/main.tfvars
.
Das folgende Code-Snippet aus infra/main.tf
zeigt die Instanziierung des Splitter-Moduls. In diesem Modul wird die aktive Farbe verwendet, damit der Splitter-Load-Balancer weiß, welche MIG die Anwendung bereitstellen soll.
Das folgende Code-Snippet aus infra/main.tf
definiert zwei identische Module für blaue und grüne MIGs. Es berücksichtigt die Farbe, das Netzwerk und das Subnetzwerk, die im Splitter-Modul definiert sind.
Die Datei splitter/main.tf
definiert die Objekte, die für die Splitter-MIG erstellt werden. Das folgende Code-Snippet von splitter/main.tf
enthält die Logik zum Wechseln zwischen der grünen und der blauen MIG. Unterstützt wird sie vom Dienst google_compute_region_backend_service
, der Traffic an zwei Back-End-Regionen weiterleiten kann: var.instance_group_blue
oder var.instance_group_green
.
capacity_scaler
definiert, welcher Anteil des Traffics weitergeleitet wird.
Mit dem folgenden Code werden 100% des Traffics an die angegebene Farbe weitergeleitet. Sie können diesen Code jedoch für das Canary-Deployment so aktualisieren, dass der Traffic an eine Teilmenge der Nutzer weitergeleitet wird.
Die Datei mig/main.tf
definiert die Objekte, die zu den blauen und grünen MIGs gehören. Das folgende Code-Snippet aus dieser Datei definiert die Compute Engine-Instanzvorlage, die zum Erstellen der VM-Pools verwendet wird. In dieser Instanzvorlage ist das Attribut „Terraform-Lebenszyklus“ auf create_before_destroy
festgelegt.
Das liegt daran, dass Sie beim Aktualisieren der Version des Pools die Vorlage nicht zum Erstellen der neuen Version der Pools verwenden können, wenn sie noch von der vorherigen Version des Pools verwendet wird. Wenn jedoch die ältere Version des Pools vor dem Erstellen der neuen Vorlage gelöscht wird, sind die Pools eine gewisse Zeit lang inaktiv. Um dieses Szenario zu vermeiden, legen wir den Terraform-Lebenszyklus auf create_before_destroy
fest, sodass die neuere Version eines VM-Pools erstellt wird, bevor die ältere Version gelöscht wird.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Einzelne Ressourcen löschen
Löschen Sie die Compute Engine-Ressourcen, die vom Apply-Trigger erstellt wurden:
Öffnen Sie die Cloud Build-Seite Trigger:
Suchen Sie in der Tabelle Trigger die Zeile, die dem Löschen-Trigger entspricht, und klicken Sie auf Ausführen. Wenn der Trigger die Ausführung abgeschlossen hat, werden die vom apply-Trigger erstellten Ressourcen gelöscht.
Löschen Sie die beim Bootstrapping erstellten Ressourcen. Führen Sie dazu den folgenden Befehl in Ihrem Terminalfenster aus:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/teardown.sh)
Projekt löschen
Google Cloud-Projekt löschen:
gcloud projects delete PROJECT_ID