1. 目标
在本教程中,您将创建三个 GKE 集群,分别命名为 preview、canary 和 prod。然后,为每个集群创建一个 Cloud Deploy 目标,并创建一个 Cloud Deploy 流水线,用于定义在这些目标中执行部署的步骤顺序。
部署流程将由 cloudbuild 流水线触发,该流水线将创建 Cloud Deploy 版本并在预览集群中执行部署。验证预览中的部署成功且按预期运行后,您将手动提升 Canary 集群中的版本。提升 prod 集群中的版本需要获得批准,您将在 Cloud Deploy 界面中批准 prod 流水线,最后提升该版本。
本教程的目标可以分解为以下步骤:
- 准备工作区
- 定义 Cloud Deploy 目标
- 定义 Cloud Deploy 流水线
- 创建版本
- 提升部署
- 批准生产环境版本
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用 计划的条件。
2. 平台设置
准备工作区
我们将在此处设置运行本教程所需的环境。完成此步骤后,我们将创建一个 GKE 集群,我们可以在其中运行部署。
- 设置 gcloud 配置默认值
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- 克隆代码库
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- 设置环境变量
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- 启用 API
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- 创建 GKE 集群
`gcloud container clusters create preview \`
--zone=us-central1-a --async
`gcloud container clusters create canary \`
--zone=us-central1-b --async
`gcloud container clusters create prod \`
--zone=us-central1-c
定义 Cloud Deploy 目标
- 使用 Cloud Shell 中的以下命令在 deploy 目录中创建一个名为 preview.yaml 的文件:
cat <<EOF >deploy/preview.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: preview
annotations: {}
labels: {}
description: Target for preview environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview
EOF
As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
- 使用 Cloud Shell 中的以下命令在 deploy 目录中创建一个名为 canary.yaml 的文件:
cat <<EOF >deploy/canary.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: canary
annotations: {}
labels: {}
description: Target for canary environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary
EOF
- 使用 Cloud Shell 中的以下命令在 deploy 目录中创建一个名为 prod.yaml 的文件:
cat <<EOF >deploy/prod.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: prod
annotations: {}
labels: {}
description: Target for prod environment
requireApproval: true
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod
EOF
请注意,标记 requireApproval 设置为 true。在获得批准之前,这将不允许提升到 prod 目标。您需要 roles/clouddeploy.approver 角色才能批准版本。
- 创建部署目标
`gcloud config set deploy/region us-central1`
gcloud beta deploy apply --file deploy/preview.yaml
gcloud beta deploy apply --file deploy/canary.yaml
gcloud beta deploy apply --file deploy/prod.yaml
3. 应用创建
在创建新应用时,通常会设置 CICD 流水线来执行自动构建、集成测试和部署。以下步骤被视为新应用设置过程的一部分。每个新应用都将配置一个部署流水线。
定义 Cloud Deploy 流水线
- 使用 Cloud Shell 中的以下命令在 deploy 目录中创建一个名为 pipeline.yaml 的文件:
cat <<EOF >>deploy/pipeline.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: DeliveryPipeline
metadata:
name: sample-app
labels:
`app: sample-app`
description: delivery pipeline
serialPipeline:
stages:
- targetId: preview
`profiles:`
`- preview`
- targetId: canary
`profiles:`
`- canary`
- targetId: prod
`profiles:`
`- prod`
EOF
As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.
serialPipeline 标记包含一个名为 stages 的标记,该标记是将此交付流水线配置为要部署到的所有目标的列表。
targetId 用于标识要用于交付流水线此阶段的特定目标。该值是目标定义中的 metadata.name 属性。
profiles 是来自 skaffold.yaml 的零个或零个以上 Skaffold 配置文件名称的列表。Cloud Deploy 在创建版本时将配置文件与 skaffold render 搭配使用。
- 应用流水线
gcloud beta deploy apply --file deploy/pipeline.yaml
4. 开发阶段
在开发应用时,自动 CICD 工具链将构建和存储资产。执行以下命令以使用 skaffold 构建应用,并存储资产以使用 Cloud Deploy 进行部署。对于每个应用 build,此步骤将由您的 CICD 流程执行。
- 使用 skaffold 构建和存储应用
skaffold build \
--file-output=artifacts.json \
--default-repo gcr.io/$PROJECT_ID \
--push=true
5. 发布阶段
在 CICD 流程结束时(通常是在为生产环境标记代码时),您将通过调用 cloud deploy release
命令来启动发布流程。稍后,在部署经过验证和批准后,您将通过自动流程或手动批准来提升和批准操作,从而将版本移至各个目标环境。
创建版本
在本教程中,我们之前创建了 Cloud Deploy 文件,以了解 Cloud Deploy 的工作原理。为了进行演示,我们创建了相同的 Cloud Deploy 文件,并将其推送到包含示例 Go 应用的 GitHub 代码库,我们将使用 Cloud Deploy 来发布该应用。
export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')
gcloud beta deploy releases create \
sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--description="Release demo" \
--build-artifacts=artifacts.json \
--annotations="release-id=rel-${REL_TIMESTAMP}"
查看版本
创建 Cloud Deploy 版本后,它会自动在第一个目标(即预览)中发布。
- 前往 Google Cloud 控制台中的 <Cloud Deploy>
- 点击“sample-app”
在此界面上,您将看到流水线的图形表示。
- 确认预览框左侧有一个绿色轮廓,这意味着该版本已部署到该环境。
- (可选)点击界面下部“版本详情”下的版本名称,查看有关版本的其他详细信息
- 验证版本是否成功部署了应用,请在 Cloud Shell 中运行以下命令
gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- 点击界面右上角的网页预览图标。
- 选择端口 8080 上的“预览”
这会将您带到一个新页面,其中显示“Hello World!”消息。
- 在终端中使用
ctrl+c结束端口转发。
提升版本
现在,您的版本已部署到流水线中的第一个目标(预览版),您可以将其提升到下一个目标(Canary 版)。运行以下命令以开始该流程。
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
查看版本提升
- 前往 Google Cloud 控制台中的 sample-app 流水线
- 确认 Canary 框左侧有一个绿色轮廓,这意味着该版本已部署到该环境。
- 通过创建到应用的隧道来验证应用是否已正确部署
gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- 点击界面右上角的网页预览图标。
- 选择端口 8080 上的“预览”
这会将您带到一个新页面,其中显示“Hello World!”消息。
- 在终端中使用
ctrl+c结束端口转发。
批准生产环境版本
请注意,我们在通过 prod.yaml 创建 prod 目标时,将标记 requireApproval 指定为 true。这将强制要求批准才能在 prod 中提升。
- 使用以下命令将 Canary 版本提升到生产环境
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- 前往 Google Cloud 控制台中的 sample-app 流水线
- 请注意,黄色指示器显示“1 pending”。
此消息表示有一个版本已排队等待部署到生产环境,但需要审核和批准。
- 点击黄色通知下方的“审核”按钮。
- 在下一个界面中,再次点击“审核”以访问生产环境的批准界面
- (可选)查看清单差异以查看更改。在本例中,这是一个全新的文件。
- 点击“批准”按钮
- 返回 示例应用 流水线页面,您将在其中看到版本到生产环境的提升正在进行中。
查看生产环境版本
与其他环境一样,您可以在部署完成后按照以下步骤查看部署。
- 在 Cloud Shell 中运行以下命令以创建端口转发
gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- 点击界面右上角的网页预览图标。
- 选择端口 8080 上的“预览”
这会将您带到一个新页面,其中显示“Hello World!”消息。
- 在终端中使用
ctrl+c结束端口转发。