1. 目标
在本教程中,您将创建三个名为“preview”“canary”和“prod”的 GKE 集群。然后,创建与每个集群对应的 Cloud Deploy 目标,以及一个 Cloud Deploy 流水线,该流水线将定义在这些目标中执行部署的步骤序列。
部署流程将由 cloudbuild 流水线触发,该流水线将创建 Cloud Deploy 版本并在预览集群中执行部署。确认预览版部署成功且运行正常后,您需要在 Canary 集群中手动提升版本。在生产集群中发布版本需要获得批准,您需要在 Cloud Deploy 界面中批准生产流水线,最后发布该版本。
本教程的目标可分解为以下步骤:
- 准备工作区
- 定义 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。在获得批准之前,此类资源将无法推广到生产环境目标平台。您需要拥有 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 渲染搭配使用。
- 应用流水线
gcloud beta deploy apply --file deploy/pipeline.yaml
4. 开发阶段
随着应用的开发,自动化 CICD 工具链将构建和存储资源。执行以下命令可使用 skaffold 构建应用,并存储资产以便使用 Cloud Deploy 进行部署。您的 CICD 流程会针对每个应用 build 执行此步骤。
- 使用 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 控制台中的示例应用流水线
- 确认 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 创建生产目标时,将标记 requireApproval 指定为 true。这将强制要求在正式版中提升时获得批准。
- 使用以下命令将 Canary 版本提升到生产环境
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- 前往 Google Cloud 控制台中的示例应用流水线
- 请注意黄色指示器显示“1 个待处理”。
此消息表示有版本已加入队列,准备部署到生产环境,但需要经过审核和审批。
- 点击黄色通知下方的“查看”按钮。
- 在下一个屏幕上,再次点击“审核”以进入正式版审批界面
- (可选)查看清单差异以查看更改。在本例中,是一个全新的文件。
- 点击“批准”按钮
- 返回“sample-app”流水线页面,您会看到发布到正式版的进度。
查看正式版
与其他环境一样,您可以在部署完成后按照以下步骤查看部署情况。
- 在 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
结束端口转发。