使用 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.pnga99b7ace416376c4.pngbd84a6d3004737c5.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. 在部署目录中创建一个名为 preview.yaml 的文件,并在 Cloud Shell 中运行以下命令:

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. 在部署目录中创建一个名为 canary.yaml 的文件,并在 Cloud Shell 中运行以下命令:

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. 在部署目录中创建一个名为 prod.yaml 的文件,并在 Cloud Shell 中运行以下命令:

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. 在部署目录中创建一个名为 pipeline.yaml 的文件,并在 Cloud Shell 中运行以下命令:

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 搭配使用。

  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 控制台中的 sample-app 流水线
  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 控制台中的 sample-app 流水线
  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 结束端口转发。