部署到 Compute Engine (original) (raw)


本指南介绍了如何使用 Cloud Build 和 Terraform 在 Compute Engine 代管式实例组 (MIG) 上执行零停机蓝/绿部署。

借助 Cloud Build,您可以自动执行各种开发者流程,包括构建和部署应用到各种 Google Cloud 运行时(例如 Compute Engine、Google Kubernetes EngineGKE EnterpriseCloud Run 函数)。

借助 Compute Engine MIG,您可以在多个相同的虚拟机 (VM) 上运行应用。您可以利用自动化 MIG 服务让您的工作负载具有可伸缩性和高可用性,这些服务包括自动伸缩、自动修复、区域(多可用区)部署和自动更新。您将学习如何使用蓝绿色持续部署模型,将用户流量从一个 MIG(蓝色)逐步转移到另一个 MIG(绿色),这两个 MIG 都在生产环境中运行。

设计概览

下图显示了本文档中所述代码示例使用的蓝绿部署模型:

蓝绿模式

概括来讲,此模型包含以下组件:

Blue 和 Green 虚拟机池以 Compute Engine MIG 的形式实现,外部 IP 地址使用外部 HTTP(s) 负载平衡器路由到 MIG 中的虚拟机。本文档中介绍的代码示例使用 Terraform 配置此基础架构。

下图展示了部署过程中发生的开发者操作:

开发者操作流程

在上图中,红色箭头表示您首次设置部署基础架构时发生的引导流程,蓝色箭头表示每次部署期间发生的 GitOps 流程。

如需设置此基础架构,您需要运行一个设置脚本,该脚本会启动引导流程并为 GitOps 流程设置组件。

设置脚本会执行一个 Cloud Build 流水线,该流水线会执行以下操作:

apply 触发器会附加到 Cloud Source Repositories 中名为 main.tfvars 的 Terraform 文件。此文件包含代表蓝色和绿色负载平衡器的 Terraform 变量。

如需设置部署,您需要更新 main.tfvars 文件中的变量。apply 触发器会运行 Cloud Build 流水线,该流水线会执行 tf_apply 并执行以下操作:

系统会手动触发 destroy 触发器,以删除 apply 触发器创建的所有资源。

目标

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 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.
  2. Install the Google Cloud CLI.
  3. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
  4. To initialize the gcloud CLI, run the following command:
    gcloud init
  5. 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.
  6. Make sure that billing is enabled for your Google Cloud project.
  7. Install the Google Cloud CLI.
  8. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
  9. To initialize the gcloud CLI, run the following command:
    gcloud init
  10. Create or select a Google Cloud project.
  1. Make sure that billing is enabled for your Google Cloud project.

测试

  1. 从 Google 代码示例库运行设置脚本:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)  
  1. 当设置脚本要求征求用户同意时,请输入 yes
    脚本会在几秒钟内运行完毕。
  2. 在 Google Cloud 控制台中,打开 Cloud Build 构建记录页面:
    打开“构建记录”页面
  3. 点击最新 build。
    您会看到 Build details(构建详情)页面,其中显示了一个包含三个构建步骤的 Cloud Build 流水线:第一个构建步骤会在 Cloud Source Repositories 中创建一个代码库,第二个构建步骤会将 GitHub 中示例代码库的内容克隆到 Cloud Source Repositories,第三个构建步骤会添加两个构建触发器。
  4. 打开 Cloud Source Repositories:
    打开 Cloud Source Repositories
  5. 在代码库列表中,点击 copy-of-gcp-mig-simple
    在页面底部的历史记录标签页中,您会看到一个提交,其描述为 A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git,由 Cloud Build 创建,用于创建名为 copy-of-gcp-mig-simple 的代码库。
  6. 打开 Cloud Build 的触发器页面:
    打开“触发器”页面

您会看到两个名为 applydestroy 的构建触发器。apply 触发器附加到 main 分支中的 infra/main.tfvars 文件。每当文件更新时,系统都会执行此触发器。destroy 触发器是一种手动触发器。

  1. 如需开始部署流程,请更新 infra/main.tfvars 文件:
    1. 在终端窗口中,创建一个名为 deploy-compute-engine 的文件夹并进入该文件夹:
    mkdir ~/deploy-compute-engine  
    cd ~/deploy-compute-engine  
    1. 克隆 copy-of-gcp-mig-simple 代码库:
    gcloud source repos clone copy-of-mig-blue-green  
    1. 进入克隆的目录:
    cd ./copy-of-mig-blue-green  
    1. 更新 infra/main.tfvars,将蓝色替换为绿色:
    sed -i'' -e 's/blue/green/g' infra/main.tfvars  
    1. 添加更新后的文件:
    git add .  
    1. 提交此文件:
    git commit -m "Promote green"  
    1. 推送文件:
    git push  

    infra/main.tfvars 进行更改会触发 apply 触发器的执行,从而启动部署。

  2. 打开 Cloud Source Repositories:
    打开 Cloud Source Repositories
  3. 在代码库列表中,点击 copy-of-gcp-mig-simple
    您会在页面底部的历史记录标签页中看到说明为 Promote green 的提交。
  4. 如需查看 apply 触发器的执行情况,请打开 Google Cloud 控制台中的构建记录页面:
    打开“构建记录”页面
  5. 点击第一个 build 以打开构建详情页面。
    您会看到包含两个构建步骤的 apply 触发器流水线。第一个构建步骤会执行 Terraform apply 命令,为部署创建 Compute Engine 和负载均衡资源。第二个构建步骤会输出 IP 地址,您可以在其中查看正在运行的应用。
  6. 在浏览器中打开与绿色 MIG 对应的 IP 地址。您将看到类似于以下屏幕截图的显示部署信息:
    部署
  7. 前往 Compute Engine 的实例组页面,查看“蓝色”和“绿色”实例组:
    打开“实例组”页面
  8. 打开虚拟机实例页面,查看四个虚拟机实例:
    打开“虚拟机实例”页面
  9. 打开外部 IP 地址页面,查看三个负载平衡器:
    打开“外部 IP 地址”页面

了解代码

此代码示例的源代码包括:

设置脚本

setup.sh 是运行引导流程并为蓝绿部署创建组件的设置脚本。该脚本会执行以下操作:

Cloud Build 流水线

apply.cloudbuild.yamldestroy.cloudbuild.yaml 是设置脚本用于为 GitOps 流程设置资源的 Cloud Build 配置文件。apply.cloudbuild.yaml 包含两个构建步骤:

destroy.cloudbuild.yaml 调用 tf_destroy,后者会删除 tf_apply 创建的所有资源。

函数 tf_install_in_cloud_build_steptf_applydescribe_deploymenttf_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 配置文件和变量。

以下代码段显示了 infra/main.tfvars 的内容。它包含三个变量:两个用于确定要将哪个应用版本部署到蓝色和绿色池,以及一个用于表示活动颜色的变量:蓝色或绿色。对此文件所做的更改会触发部署。

以下是 infra/main.tf 中的代码段。在此代码段中:

infra/main.tf 中的以下代码段展示了分屏器模块的实例化。此模块会接受活动颜色,以便拆分器负载平衡器知道将应用部署到哪个 MIG。

infra/main.tf 中的以下代码段为蓝色和绿色 MIG 定义了两个完全相同的模块。它接受分屏器模块中定义的颜色、网络和子网。

文件 splitter/main.tf 定义了为分屏器 MIG 创建的对象。以下是 splitter/main.tf 中的代码段,其中包含在绿色 MIG 和蓝色 MIG 之间切换的逻辑。该网址由服务 google_compute_region_backend_service 提供支持,该服务可以将流量路由到两个后端区域:var.instance_group_bluevar.instance_group_greencapacity_scaler 用于定义要路由的流量大小。

以下代码会将 100% 的流量路由到指定的颜色,但您可以更新此代码以进行 Canary 部署,将流量路由到部分用户。

文件 mig/main.tf 定义了与蓝色和绿色 MIG 相关的对象。该文件中的以下代码段定义了用于创建虚拟机池的 Compute Engine 实例模板。请注意,此实例模板将 Terraform 生命周期属性设置为 create_before_destroy。这是因为,在更新池版本时,如果模板仍在旧版池中使用,您将无法使用该模板创建新版池。但是,如果在创建新模板之前销毁了旧版池,则池会在一段时间内处于停用状态。为避免这种情况,我们将 Terraform 生命周期设置为 create_before_destroy,以便先创建较新版本的虚拟机池,然后再销毁旧版本。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除各个资源

  1. 删除应用触发器创建的 Compute Engine 资源:
    1. 打开 Cloud Build 的触发器页面:
      打开“触发器”页面
    2. 触发器表中,找到与销毁触发器对应的行,然后点击运行。触发器执行完毕后,apply 触发器创建的资源将被删除。
  2. 在终端窗口中运行以下命令,删除引导期间创建的资源:
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

后续步骤