使用 Cloud Deploy 发布

1. 目标

在本教程中,您将创建三个名为“preview”“canary”和“prod”的 GKE 集群。然后,创建与每个集群对应的 Cloud Deploy 目标,以及一个 Cloud Deploy 流水线,该流水线将定义在这些目标中执行部署的步骤序列。

部署流程将由 cloudbuild 流水线触发,该流水线将创建 Cloud Deploy 版本并在预览集群中执行部署。确认预览版部署成功且运行正常后,您需要在 Canary 集群中手动提升版本。在生产集群中发布版本需要获得批准,您需要在 Cloud Deploy 界面中批准生产流水线,最后发布该版本。

本教程的目标可分解为以下步骤:

  • 准备工作区
  • 定义 Cloud Deploy 目标
  • 定义 Cloud Deploy 流水线
  • 创建版本
  • 提升部署级别
  • 批准生产版本

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

2. 平台设置

准备工作区

我们将在此处设置运行本教程所需的环境。完成此步骤后,我们将创建一个 GKE 集群,以便在其中运行部署。

  1. 设置 gcloud 配置默认值

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. 克隆代码库

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. 设置环境变量

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. 启用 API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. 创建 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 目标

  1. 在 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.
  1. 在 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

  1. 在 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 角色才能批准发布版本。

  1. 创建部署目标
         `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 流水线

  1. 在 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 渲染搭配使用。

  1. 应用流水线

gcloud beta deploy apply --file deploy/pipeline.yaml

4. 开发阶段

随着应用的开发,自动化 CICD 工具链将构建和存储资源。执行以下命令可使用 skaffold 构建应用,并存储资产以便使用 Cloud Deploy 进行部署。您的 CICD 流程会针对每个应用 build 执行此步骤。

  1. 使用 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 版本后,系统会自动在第一个目标(即预览版)中发布该版本。

  1. 前往 Google Cloud 控制台中的<Cloud Deploy>
  2. 点击“sample-app”

您会在此屏幕上看到流水线的图形表示。

  1. 确认预览框左侧显示绿色轮廓,这表示该版本已部署到该环境。
  2. 如需查看有关该版本的其他详细信息,请点击屏幕底部“版本详情”下方的版本名称
  3. 验证该版本是否已成功部署应用,请在 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

  1. 点击屏幕右上角的“网页预览”图标。
  2. 选择“在端口 8080 上预览”

这会将您转到一个显示“Hello World!”消息的新页面

  1. 在终端中使用 ctrl+c 结束端口转发。

提升版本

现在,您的版本已部署到流水线中的第一个目标(预览版),您可以将其提升到下一个目标(Canary 版)。运行以下命令以开始该过程。

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

查看版本促销活动

  1. 前往 Google Cloud 控制台中的示例应用流水线
  2. 确认 Canary 版框左侧显示了绿色轮廓,这表示该版本已部署到该环境。
  3. 通过创建指向该应用的隧道来验证该应用是否已正确部署

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

  1. 点击屏幕右上角的“网页预览”图标。
  2. 选择“在端口 8080 上预览”

这会将您转到一个显示“Hello World!”消息的新页面

  1. 在终端中使用 ctrl+c 结束端口转发。

批准正式版

请记得,我们通过 prod.yaml 创建生产目标时,将标记 requireApproval 指定为 true。这将强制要求在正式版中提升时获得批准。

  1. 使用以下命令将 Canary 版本提升到生产环境

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. 前往 Google Cloud 控制台中的示例应用流水线
  2. 请注意黄色指示器显示“1 个待处理”。

此消息表示有版本已加入队列,准备部署到生产环境,但需要经过审核和审批。

  1. 点击黄色通知下方的“查看”按钮。
  2. 在下一个屏幕上,再次点击“审核”以进入正式版审批界面
  3. (可选)查看清单差异以查看更改。在本例中,是一个全新的文件。
  4. 点击“批准”按钮
  5. 返回“sample-app”流水线页面,您会看到发布到正式版的进度。

查看正式版

与其他环境一样,您可以在部署完成后按照以下步骤查看部署情况。

  1. 在 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

  1. 点击屏幕右上角的“网页预览”图标。
  2. 选择“在端口 8080 上预览”

这会将您转到一个显示“Hello World!”消息的新页面

  1. 在终端中使用 ctrl+c 结束端口转发。