本指南說明如何使用 Cloud Build 和 Terraform,在 Compute Engine 代管執行個體群組 (MIG) 上執行零停機藍/綠部署作業。
您可以使用 Cloud Build 自動化各種開發人員程序,包括在 Google Cloud 各種執行階段 (例如 Compute Engine、Google Kubernetes Engine、GKE Enterprise 和 Cloud Run 函式) 上建構及部署應用程式。
Compute Engine MIG 可讓您在多個相同的虛擬機器 (VM) 上執行應用程式。您可以利用自動調度資源、自動修復、區域 (多可用區) 部署以及自動更新等自動化 MIG 服務,讓工作負載具有可擴充性和高可用性。您將透過藍/綠持續部署模型,瞭解如何將使用者流量逐漸從一個 MIG (藍色) 轉移至另一個 MIG (綠色),兩者皆在實際工作環境中執行。
設計總覽
下圖顯示本文件所述程式碼範例使用的藍/綠部署模型:
整體來說,這個模型包含下列元件:
- 兩個 Compute Engine VM 集區:藍色和綠色。
- 三個外部 HTTP(S) 負載平衡器:
- 藍/綠負載平衡器,可將使用者流量路由至藍色或綠色集區的 VM 執行個體。
- Blue 負載平衡器,可將 QA 工程師和開發人員的流量路由至 Blue VM 執行個體資源池。
- 綠色負載平衡器,可將 QA 工程師和開發人員的流量轉送至綠色執行個體集區。
- 兩組使用者:
- 可存取藍綠負載平衡器的使用者,這會將他們導向藍色或綠色執行個體集區。
- 品質確保工程師和開發人員,他們需要存取這兩組資源池,以便進行開發和測試。這些執行個體可以存取藍色和綠色負載平衡器,並分別將其路由至藍色執行個體集區和綠色執行個體集區。
藍色和綠色 VM 資源池會做為 Compute Engine MIG 實作,並使用外部 HTTP(s) 負載平衡器,將外部 IP 位址轉送至 MIG 中的 VM。本文件所述的程式碼範例會使用 Terraform 設定此基礎架構。
下圖說明部署期間發生的開發人員作業:
在上圖中,紅色箭頭代表首次設定部署基礎架構時發生的引導流程,而藍色箭頭則代表每次部署作業期間發生的 GitOps 流程。
如要設定這項基礎架構,請執行設定指令碼,啟動引導程序,並設定 GitOps 流程的元件。
設定指令碼會執行 Cloud Build 管道,執行下列作業:
- 在 Cloud Source Repositories 中建立名為
copy-of-gcp-mig-simple
的存放區,並將原始碼從 GitHub 範例存放區複製到 Cloud Source Repositories 中的存放區。 - 建立兩個名為
apply
和destroy
的 Cloud Build 觸發條件。
apply
觸發條件會附加至 Cloud Source Repositories 中名為 main.tfvars
的 Terraform 檔案。這個檔案包含代表藍色和綠色負載平衡器的 Terraform 變數。
如要設定部署作業,請更新 main.tfvars
檔案中的變數。apply
觸發事件會執行 Cloud Build 管道,執行 tf_apply
並執行下列作業:
- 建立兩個 Compute Engine MIG (一個綠色、一個藍色)、四個 Compute Engine VM 執行個體 (兩個綠色 MIG 和兩個藍色 MIG)、三個負載平衡器 (藍色、綠色和分割器) 和三個公用 IP 位址。
- 列印 IP 位址,您可以使用這些 IP 位址查看藍色和綠色執行個體中已部署的應用程式。
手動觸發 destroy 觸發條件,藉此刪除 apply 觸發條件建立的所有資源。
目標
使用 Cloud Build 和 Terraform 設定具備 Compute Engine VM 執行個體群組後端的外部 HTTP(S) 負載平衡器。
在 VM 執行個體上執行藍綠部署。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
完成本文件所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱「清除所用資源」。
事前準備
- 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.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
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.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
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.
立即體驗
從 Google 程式碼範例存放區執行設定指令碼:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
當設定指令碼要求使用者同意時,請輸入「yes」。
指令碼會在幾秒鐘內執行完畢。
在 Google Cloud 控制台中,開啟 Cloud Build 的「Build history」(建構歷史記錄) 頁面:
按一下最新版本。
您會看到「Build details」頁面,其中顯示 Cloud Build 管道,其中包含三個建構步驟:第一個建構步驟會在 Cloud Source Repositories 中建立存放區,第二個步驟會將 GitHub 中範例存放區的內容複製到 Cloud Source Repositories,第三個步驟會新增兩個建構觸發條件。
開啟 Cloud Source Repositories:
在存放區清單中,按一下
copy-of-gcp-mig-simple
。在頁面底部的「History」分頁中,您會看到一個提交,其說明為
A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
,由 Cloud Build 建立名為copy-of-gcp-mig-simple
的存放區。開啟 Cloud Build「Triggers」(觸發條件) 頁面:
如要開始部署程序,請更新
infra/main.tfvars
檔案:在終端機視窗中,建立名為
deploy-compute-engine
的資料夾並前往該資料夾:mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
複製
copy-of-gcp-mig-simple
存放區:gcloud source repos clone copy-of-mig-blue-green
前往複製的目錄:
cd ./copy-of-mig-blue-green
更新
infra/main.tfvars
,將藍色替換為綠色:sed -i'' -e 's/blue/green/g' infra/main.tfvars
新增更新後的檔案:
git add .
修訂檔案:
git commit -m "Promote green"
推送檔案:
git push
變更
infra/main.tfvars
會觸發apply
觸發事件的執行,進而啟動部署作業。
開啟 Cloud Source Repositories:
在存放區清單中,按一下
copy-of-gcp-mig-simple
。您會在頁面底部的「歷史記錄」分頁中,看到描述為
Promote green
的提交記錄。如要查看
apply
觸發事件的執行情形,請在 Google Cloud 控制台中開啟「Build history」(建構歷史記錄) 頁面:按一下第一個版本,開啟「Build details」(建構作業詳細資料) 頁面。
您會看到
apply
觸發管道,其中包含兩個建構步驟。第一個建構步驟會執行 Terraform apply,為部署作業建立 Compute Engine 和負載平衡資源。第二個建構步驟會列印 IP 位址,讓您查看應用程式執行情形。在瀏覽器中開啟綠色 MIG 對應的 IP 位址。您會看到類似下方的螢幕截圖,顯示部署作業:
前往 Compute Engine 的「Instance group」(執行個體群組) 頁面,查看藍色和綠色的執行個體群組:
開啟「VM 執行個體」頁面,查看四個 VM 執行個體:
開啟「外部 IP 位址」頁面,查看三個負載平衡器:
您會看到兩個名為 apply
和 destroy
的建構觸發事件。apply
觸發事件會附加至 main
分支中的 infra/main.tfvars
檔案。每當檔案更新時,系統就會執行這個觸發條件。destroy
觸發條件是手動觸發條件。
瞭解程式碼
這個程式碼範例的原始碼包含:
- 與設定指令碼相關的原始碼。
- 與 Cloud Build 管道相關的原始碼。
- 與 Terraform 範本相關的原始碼。
設定指令碼
setup.sh
是設定指令碼,可執行啟動程序,並建立藍/綠部署的元件。指令碼會執行下列作業:
- 啟用 Cloud Build、Resource Manager、Compute Engine 和 Cloud Source Repositories API。
- 將
roles/editor
身分與存取權管理角色授予專案中的 Cloud Build 服務帳戶。這個角色是 Cloud Build 建立及設定部署作業所需的必要 GitOps 元件。 - 將
roles/source.admin
身分與存取權管理角色授予專案中的 Cloud Build 服務帳戶。Cloud Build 服務帳戶必須具備這個角色,才能在專案中建立 Cloud Source Repositories,並將範例 GitHub 存放區的內容複製到 Cloud Source Repositories。 產生名為
bootstrap.cloudbuild.yaml
的內嵌 Cloud Build 管道,其功能如下:- 在 Cloud Source Repositories 中建立新的存放區。
- 將原始碼從 GitHub 範例存放區複製到 Cloud Source Repositories 中的新存放區。
- 建立套用和刪除自動建構觸發條件。
Cloud Build 管道
apply.cloudbuild.yaml
和 destroy.cloudbuild.yaml
是 Cloud Build 設定檔,可讓設定指令碼為 GitOps 流程設定資源。apply.cloudbuild.yaml
包含兩個建構步驟:
tf_apply build
建構步驟會呼叫tf_install_in_cloud_build_step
函式,以便安裝 Terraform。tf_apply
,用於建立 GitOps 流程中使用的資源。tf_install_in_cloud_build_step
和tf_apply
函式是在bash_utils.sh
中定義,而建構步驟會使用source
指令來呼叫這些函式。describe_deployment
建構步驟會呼叫describe_deployment
函式,該函式會列印負載平衡器的 IP 位址。
destroy.cloudbuild.yaml
會呼叫 tf_destroy
,刪除 tf_apply
建立的所有資源。
函式 tf_install_in_cloud_build_step
、tf_apply
、describe_deployment
和 tf_destroy
是在檔案 bash_utils.sh
中定義。建構設定檔會使用 source
指令呼叫函式。
以下程式碼顯示在 bash_utils.sh
中定義的函式 tf_install_in_cloud_build_step
。建構設定檔會呼叫這個函式,以便即時安裝 Terraform。它會建立 Cloud Storage 值區,用於記錄 Terraform 狀態。
以下程式碼片段顯示在 bash_utils.sh
中定義的函式 tf_apply
。它會先呼叫 terraform init
來載入所有模組和自訂程式庫,然後執行 terraform apply
來從 main.tfvars
檔案載入變數。
以下程式碼片段顯示在 bash_utils.sh
中定義的函式 describe_deployment
。它會使用 gcloud compute addresses describe
擷取負載平衡器的 IP 位址,並將這些位址列印出來。
以下程式碼片段顯示在 bash_utils.sh
中定義的函式 tf_destroy
。它會呼叫 terraform init
來載入所有模組和自訂程式庫,然後執行 terraform destroy
來卸載 Terraform 變數。
Terraform 範本
您會在 copy-of-gcp-mig-simple/infra/
資料夾中找到所有 Terraform 設定檔和變數。
main.tf
:這是 Terraform 設定檔main.tfvars
:這個檔案會定義 Terraform 變數。mig/
和splitter/
:這些資料夾包含定義負載平衡器的模組。mig/
資料夾包含 Terraform 設定檔,其中定義了藍色和綠色負載平衡器的 MIG。藍色和綠色 MIG 相同,因此只需定義一次,並為藍色和綠色物件例項化。分離器負載平衡器的 Terraform 設定檔位於splitter/
資料夾中。
以下程式碼片段顯示 infra/main.tfvars
的內容。其中包含三個變數:兩個用於決定要將哪個應用程式版本部署至藍色和綠色集區,以及一個用於代表有效顏色的變數:藍色或綠色。變更這個檔案會觸發部署作業。
以下是 infra/main.tf
的程式碼片段。在這個程式碼片段中:
- 系統會為 Google Cloud 專案定義變數。
- Google 已設為 Terraform 供應器。
- 變數會為命名空間定義。Terraform 建立的所有物件都會加上這個變數做為前置字串,這樣就能在同一個專案中部署多個應用程式版本,且物件名稱不會彼此衝突。
- 變數
MIG_VER_BLUE
、MIG_VER_BLUE
和MIG_ACTIVE_COLOR
是infra/main.tfvars
檔案中變數的繫結。
infra/main.tf
的以下程式碼片段顯示了 splitter 模組的例項化。這個模組會擷取有效顏色,讓分割器負載平衡器知道要部署哪個 MIG 應用程式。
以下 infra/main.tf
程式碼片段會為藍色和綠色 MIG 定義兩個相同的模組。它會接收分離器模組中定義的顏色、網路和子網路。
splitter/main.tf
檔案定義為分割器 MIG 建立的物件。以下是 splitter/main.tf
中的程式碼片段,其中包含切換綠色和藍色 MIG 的邏輯。該服務由 google_compute_region_backend_service
服務支援,可將流量轉送至兩個後端區域:var.instance_group_blue
或 var.instance_group_green
。capacity_scaler
定義要轉送的流量比例。
以下程式碼會將 100% 的流量導向指定的顏色,但您可以更新此 Canary 部署程式碼,將流量導向部分使用者。
檔案 mig/main.tf
定義了與藍色和綠色 MIG 相關的物件。這個檔案中的程式碼片段定義了用於建立 VM 資源池的 Compute Engine 執行個體範本。請注意,這個執行個體範本的 Terraform 生命週期屬性已設為 create_before_destroy
。這是因為在更新集區版本時,如果舊版集區仍在使用該範本,您就無法使用該範本建立新版集區。不過,如果舊版集區在建立新範本前遭到刪除,集區就會暫時無法使用。為避免這種情況,我們將 Terraform 生命週期設為 create_before_destroy
,以便先建立較新版本的 VM 資源池,再刪除舊版。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
刪除個別資源
刪除由套用觸發條件所建立的 Compute Engine 資源:
開啟 Cloud Build「Triggers」(觸發條件) 頁面:
在「Triggers」表格中找出對應於「destroy」觸發事件的資料列,然後按一下「Run」。觸發事件執行完畢後,apply 觸發事件建立的資源就會刪除。
在終端機視窗中執行下列指令,刪除啟動期間建立的資源:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/teardown.sh)
刪除專案
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID