本指南介绍如何在 Cloud SQL 上执行零停机的蓝绿部署, 使用 Cloud Build 和 Terraform。
Cloud Build 可让您自动执行各种开发者流程 包括构建应用并将其部署到各种 Google Cloud 运行时 例如 Compute Engine Google Kubernetes Engine, GKE Enterprise、 和 Cloud Functions。
Compute Engine MIG: 在多个相同的虚拟机 (VM) 上运行应用。您可以将 利用自动化 MIG,创建具有可伸缩性和高可用性的工作负载 服务,包括:自动扩缩、自动修复、区域级(多可用区) 部署和自动更新使用蓝绿持续部署 模型,您将学习如何从一个 MIG 逐步转移用户流量(蓝色) 另一个 MIG(绿色),这两个 MIG 都在生产环境中运行。
设计概览
下图显示了代码使用的蓝绿部署模型 示例:
概括来讲,此模型包括以下组成部分:
- 两个 Compute Engine 虚拟机池:蓝色和绿色。
- 三个外部 HTTP(S) 负载平衡器:
<ph type="x-smartling-placeholder">
- </ph>
- 一个蓝/绿负载均衡器,用于将流量从最终用户路由到 虚拟机实例的蓝色池或绿色池
- 一个蓝色负载均衡器,用于路由来自质量检查工程师和 蓝色虚拟机实例池
- 一个绿色负载均衡器,用于路由来自质量检查工程师和 Green 实例池的开发者。
- 两组用户:
<ph type="x-smartling-placeholder">
- </ph>
- 有权访问蓝绿负载均衡器的最终用户, 蓝绿实例池中的实例。
- 需要访问以下两组池的质量检查工程师和开发者: 用于开发和测试目的他们可以访问蓝色和 绿色负载平衡器,这些负载平衡器将其路由到蓝色实例组和 分别为绿色实例池。
蓝色和绿色虚拟机池是以 Compute Engine MIG 的形式实现的, 外部 IP 地址使用外部 HTTP(s) 路由到 MIG 中的虚拟机 负载平衡器本文档中介绍的代码示例使用 Terraform 来 配置此基础设施
下图说明了 部署:
在上图中,红色箭头表示 首次设置部署基础架构时就会发生。 蓝色箭头表示每个部署期间发生的 GitOps 流程。
要设置此基础架构,您需要运行用于启动引导加载程序的设置脚本。 处理并设置 GitOps 流程的组件。
设置脚本会执行 Cloud Build 流水线,该流水线会执行 以下操作:
- 在 Cloud Source Repositories 中创建代码库
名为
copy-of-gcp-mig-simple
,并从 GitHub 复制源代码 将示例代码库添加到 Cloud Source Repositories 中的代码库。 - 创建两个 Cloud Build 触发器(名为
apply
和destroy
。
apply
触发器附加到名为 main.tfvars
的 Terraform 文件,
Cloud Source Repositories此文件包含代表
蓝色和绿色的负载平衡器
如需设置部署,您需要更新 main.tfvars
文件中的变量。
apply
触发器运行 Cloud Build 流水线,用于执行
tf_apply
,并执行以下操作:
- 创建两个 Compute Engine MIG(一个用于绿色,一个用于蓝色), Compute Engine 虚拟机实例(两个用于绿色 MIG,两个用于蓝色 MIG 三个负载平衡器(蓝色、绿色和分流器),三个 公共 IP 地址
- 输出可用于查看已部署的 IP 地址 蓝绿实例中的实例。
销毁触发器会手动触发,以删除由 应用触发器。
目标
使用 Cloud Build 和 Terraform 设置外部 HTTP(S) 负载 与 Compute Engine 虚拟机实例组后端关联的负载平衡器。
在虚拟机实例上执行蓝绿部署。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
- 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.
-
- 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.
-
测试
从 Google 代码示例代码库中运行设置脚本:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
当设置脚本请求用户同意时,请输入 yes。
脚本将在几秒钟内完成运行。
在 Google Cloud 控制台中,打开 Cloud Build 构建记录 页面:
点击最新的 build。
您将看到构建详情页面,其中显示了一个 Cloud Build 包含三个构建步骤的流水线:第一个构建步骤在 Cloud Source Repositories 中,第二步会克隆 复制到 Cloud Source Repositories 构建触发器。
打开 Cloud Source Repositories:
在代码库列表中,点击
copy-of-gcp-mig-simple
。在页面底部的历史记录标签页中,您将看到一项包含 说明
A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
使用 Cloud Build 创建名为copy-of-gcp-mig-simple
。打开 Cloud Build 触发器页面:
如需开始部署过程,请更新
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 控制台中执行以下操作:点击第一个构建以打开构建详情页面。
您将看到包含两个构建步骤的
apply
触发器流水线。第一个 构建步骤,执行 Terraform 应用,以创建 Compute Engine 并加载 为部署平衡资源第二步是输出 您可查看应用的运行情况的 IP 地址。在浏览器中打开与绿色 MIG 对应的 IP 地址。您会看到 类似于以下所示部署的屏幕截图:
转到 Compute Engine 实例组页面,查看蓝色的 绿色实例组:
打开虚拟机实例页面,查看四个虚拟机实例:
打开外部 IP 地址页面,查看三个负载平衡器:
您将看到两个名为 apply
和 destroy
的构建触发器。apply
触发器
已附加到 main
分支中的 infra/main.tfvars
文件。此触发器
每当文件更新时都会执行。destroy
触发器是手动的
触发。
了解代码
此代码示例的源代码包括:
- 与设置脚本相关的源代码。
- 与 Cloud Build 流水线相关的源代码。
- 与 Terraform 模板相关的源代码。
设置脚本
setup.sh
是运行引导过程并创建
蓝绿部署的组件该脚本会执行以下操作
操作:
- 启用 Cloud Build、Resource Manager Compute Engine API 和 Cloud Source Repositories API。
- 将
roles/editor
IAM 角色授予 Cloud Build 服务账号。此角色是 创建及设置必要的 用于部署的 GitOps 组件。 - 将
roles/source.admin
IAM 角色授予 Cloud Build 服务账号。此角色是 创建 Cloud Build 服务账号所需的 在项目中使用 Cloud Source Repositories 并克隆示例的内容 添加到 Cloud Source Repositories 生成名为
bootstrap.cloudbuild.yaml
,以便:- 在 Cloud Source Repositories 中创建新的代码库。
- 将示例 GitHub 代码库中的源代码复制到 在 Cloud Source Repositories 中新建代码库
- 创建应用和销毁构建触发器。
Cloud Build 流水线
apply.cloudbuild.yaml
和 destroy.cloudbuild.yaml
是
设置脚本用来设置
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
命令调用函数。
以下代码展示了函数 tf_install_in_cloud_build_step
,
在 bash_utils.sh
中定义。构建配置文件会调用此函数
即时安装 Terraform它会创建一个 Cloud Storage 存储桶
记录 Terraform 状态。
以下代码段显示了 tf_apply
中定义的函数
bash_utils.sh
。它首先调用 terraform init
,以加载所有模块并
然后运行 terraform apply
从自定义库中加载变量,
main.tfvars
文件。
以下代码段显示了函数 describe_deployment
,
在 bash_utils.sh
中定义。它使用 gcloud compute addresses describe
提取
并使用名称输出负载平衡器的 IP 地址
以下代码段显示了 tf_destroy
中定义的函数
bash_utils.sh
。它会调用 terraform init
,后者会加载所有模块和自定义
库,然后运行 terraform destroy
以卸载 Terraform 变量。
Terraform 模板
您会在
copy-of-gcp-mig-simple/infra/
文件夹。
main.tf
:这是 Terraform 配置文件main.tfvars
:此文件定义 Terraform 变量。mig/
和splitter/
:这些文件夹包含定义 负载平衡器mig/
文件夹包含 Terraform 配置文件 为 Blue 和 Green 负载平衡器定义 MIG。The Blue and 绿色 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
中的以下代码段显示了
分流器模块。此模块会采用当前颜色,以便拆分器加载
负载平衡器知道要部署应用的 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
定义要路由的流量。
以下代码会将所有流量路由到指定颜色, 可以针对 Canary 部署更新此代码,以便将流量路由到 用户。
mig/main.tf
文件定义了与蓝色和绿色相关的对象
MIG。此文件中的以下代码段定义了 Compute Engine
用于创建虚拟机池的实例模板。请注意,此实例
将 Terraform 生命周期属性设为 create_before_destroy
。
这是因为,在更新池的版本时,您不能使用
模板,用于在
池的旧版本但是,如果旧版池
在新模板创建之前被销毁
池就停止了为了避免这种情况,我们将 Terraform 生命周期设为
create_before_destroy
,以便先创建较新版本的虚拟机池
在旧版本被销毁之前
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除各个资源
删除应用触发器创建的 Compute Engine 资源:
打开 Cloud Build 触发器页面:
在触发器表中,找到与 destroy 对应的行 触发器,然后点击运行。触发器执行完毕后, 由 apply 触发器创建的资源会被删除。
通过运行以下命令删除引导期间创建的资源 命令:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/teardown.sh)
删除项目
删除 Google Cloud 项目:
gcloud projects delete PROJECT_ID