arrow_back

使用 Google Cloud Deploy 实现持续交付

登录 加入
访问 700 多个实验和课程

使用 Google Cloud Deploy 实现持续交付

实验 1 小时 30 分钟 universal_currency_alt 5 个积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

GSP1079

Google Cloud 自学实验的徽标

概览

Google Cloud Deploy 是一项托管式服务,可按指定推送序列自动将您的应用交付到一系列目标环境。如果您要部署更新后的应用,则需要创建一个版本,其生命周期由交付流水线管理。

在本实验中,您将使用 Google Cloud Deploy 创建交付流水线。然后,您将为基础应用创建一个版本,并通过一系列 Google Kubernetes Engine (GKE) 目标来推送应用部署。

示例应用是一个简单的 Web 应用,用于监听端口、提供 HTTP 响应代码并添加日志条目。本实验改编自 Google 发布的一篇教程:https://cloud.google.com/deploy/docs/tutorials

目标

在本实验中,您将学习如何执行以下任务:

  • 使用 Skaffold 将容器映像部署到 Google Cloud Artifact Registry
  • 创建 Google Cloud Deploy 交付流水线
  • 为交付流水线创建版本
  • 通过交付流水线中的目标推送应用部署

设置

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:

    • “打开 Google Cloud 控制台”按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在“实验详细信息”窗格中找到“用户名”。

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在“实验详细信息”窗格中找到“密码”。

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标和“搜索”字段

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

  2. 在弹出的窗口中执行以下操作:

    • 继续完成 Cloud Shell 信息窗口中的设置。
    • 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。

如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权

输出:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南

任务 1. 设置变量

  • 声明各种命令将使用的环境变量:
export PROJECT_ID=$(gcloud config get-value project) export REGION={{{ project_0.default_region | "Region" }}} gcloud config set compute/region $REGION

任务 2. 创建三个 GKE 集群

在此任务中,您将创建三个 GKE 集群,这些集群将是交付流水线的目标。

创建三个 GKE 集群,分别表示交付流水线的三个目标:

  • test(测试)
  • staging(预演)
  • prod(生产)
  1. 启用 Google Kubernetes Engine API:
gcloud services enable \ container.googleapis.com \ clouddeploy.googleapis.com
  1. 创建三个 GKE 集群:
gcloud container clusters create test --node-locations={{{project_0.default_zone|"zone"}}} --num-nodes=1 --async gcloud container clusters create staging --node-locations={{{project_0.default_zone|"zone"}}} --num-nodes=1 --async gcloud container clusters create prod --node-locations={{{project_0.default_zone|"zone"}}} --num-nodes=1 --async
  1. 检查这三个集群的状态:
gcloud container clusters list --format="csv(name,status)"

输出

name,status prod,PROVISIONING staging,PROVISIONING test,RUNNING

创建集群可能需要几分钟时间。您无需等待集群准备就绪,可以先继续实验。

点击检查我的进度以验证是否完成了以下目标: 创建三个 GKE 集群

任务 3. 准备 Web 应用容器映像

在此任务中,您将在 Artifact Registry 中创建一个仓库,用于保存 Web 应用的容器映像。

  1. 启用 Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
  1. 创建用于保存容器映像的 web-app 仓库:
gcloud artifacts repositories create web-app \ --description="Image registry for tutorial web app" \ --repository-format=docker \ --location=$REGION

点击检查我的进度以验证是否完成了以下目标: 创建 web-app 仓库

任务 4. 构建容器映像并将其部署到 Artifact Registry

在此任务中,您将克隆包含 Web 应用的 Git 代码库,并将应用的容器映像部署到 Artifact Registry。

准备应用配置

  1. 将实验代码库克隆到您的主目录:
cd ~/ git clone https://github.com/GoogleCloudPlatform/cloud-deploy-tutorials.git cd cloud-deploy-tutorials git checkout c3cae80 --quiet cd tutorials/base
  1. 创建 skaffold.yaml 配置:
envsubst < clouddeploy-config/skaffold.yaml.template > web/skaffold.yaml cat web/skaffold.yaml

现在,web 目录包含 skaffold.yaml 配置文件,其中提供了 Skaffold 构建应用容器映像的说明。此配置描述了以下各项。

构建部分配置了以下内容:

  • 要构建的两个容器映像(制品)
  • 用于构建映像的 Google Cloud Build 项目

deploy 部分配置将工作负载部署到集群所需的 Kubernetes 清单。

portForward 配置用于为部署定义 Kubernetes 服务。

输出

apiVersion: skaffold/v2beta7 kind: Config build: artifacts: - image: leeroy-web context: leeroy-web - image: leeroy-app context: leeroy-app googleCloudBuild: projectId: {{project-id}} deploy: kubectl: manifests: - leeroy-web/kubernetes/* - leeroy-app/kubernetes/* portForward: - resourceType: deployment resourceName: leeroy-web port: 8080 localPort: 9000 注意:如需查看这些文件,请使用 vi、emacs、nano 或 Cloud Shell 代码编辑器(点击 Cloud Shell 中的打开编辑器图标)。

构建 Web 应用

skaffold 工具将负责将代码库提交到 Cloud Build。

  1. 启用 Cloud Build API:
gcloud services enable cloudbuild.googleapis.com
  1. 创建一个 Cloud Storage 存储桶,供 Cloud Build 存储源代码和日志。
gsutil mb -p $PROJECT_ID gs://${PROJECT_ID}_cloudbuild
  1. 运行 skaffold 命令来构建应用,并将容器映像部署到之前创建的 Artifact Registry 仓库。
cd web skaffold build --interactive=false \ --default-repo $REGION-docker.pkg.dev/$PROJECT_ID/web-app \ --file-output artifacts.json cd ..
  1. Skaffold 构建完成后,检查 Artifact Registry 中是否包含容器映像。
gcloud artifacts docker images list \ $REGION-docker.pkg.dev/$PROJECT_ID/web-app \ --include-tags \ --format yaml

为便于阅读,使用 --format yaml 参数,以 YAML 格式返回输出结果。输出应如下所示:

输出

--- createTime: '2022-01-14T02:07:54.995807Z' package: us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-app tags: '9181623' updateTime: '2022-01-14T02:07:54.995807Z' version: sha256:6af6a0a72d13dd6597c0fc0191f697e2da2c3892d1bf8e87a3df8d96612e1495 --- createTime: '2022-01-14T02:07:53.629263Z' package: us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-web tags: '9181623' updateTime: '2022-01-14T02:07:53.629263Z' version: sha256:a0179673d1876f205875b223557c83162e56e91c5e3313f5e99465a224adb6c9

默认情况下,Skaffold 会将映像的标记设为相关的 git 标记(如果有的话)。您可以在通过 skaffold 命令创建的 artifacts.json 文件中找到类似信息。

Skaffold 会生成 web/artifacts.json 文件,其中包含已部署映像的详细信息:

cat web/artifacts.json | jq

输出

{ "builds": [ { "imageName": "leeroy-web", "tag": "us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-web:9181623@sha256:a0179673d1876f205875b223557c83162e56e91c5e3313f5e99465a224adb6c9" }, { "imageName": "leeroy-app", "tag": "us-central1-docker.pkg.dev/{{project-id}}/web-app/leeroy-app:9181623@sha256:6af6a0a72d13dd6597c0fc0191f697e2da2c3892d1bf8e87a3df8d96612e1495" } ]

点击检查我的进度以验证是否完成了以下目标: 构建容器映像并将其部署到 Artifact Registry

任务 5. 创建交付流水线

在此任务中,您将设置交付流水线。

  1. 启用 Google Cloud Deploy API:
gcloud services enable clouddeploy.googleapis.com
  1. 使用 delivery-pipeline.yaml 文件创建 delivery-pipeline 资源:
gcloud config set deploy/region $REGION cp clouddeploy-config/delivery-pipeline.yaml.template clouddeploy-config/delivery-pipeline.yaml gcloud beta deploy apply --file=clouddeploy-config/delivery-pipeline.yaml
  1. 验证交付流水线已创建:
gcloud beta deploy delivery-pipelines describe web-app

将显示类似如下所示的交付流水线输出:

输出

Unable to get target test Unable to get target staging Unable to get target prod Delivery Pipeline: createTime: '2021-08-16T14:03:18.294884547Z' description: web-app delivery pipeline etag: 2539eacd7f5c256d name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app serialPipeline: stages: - targetId: test - targetId: staging - targetId: prod uid: eb0601aa03ac4b088d74c6a5f13f36ae updateTime: '2021-08-16T14:03:18.680753520Z' Targets: []

请注意输出结果的前三行。交付流水线目前引用了三个尚未创建的目标环境。在下一个任务中,您将创建这些目标。

点击检查我的进度以验证是否完成了以下目标: 创建交付流水线

任务 6. 配置部署目标

创建三个交付流水线目标,每个 GKE 集群对应一个目标。

确保集群已准备就绪

现在,这三个 GKE 集群应该都在运行,但最好还是验证一下。

  • 运行以下命令,获取集群的状态:
gcloud container clusters list --format="csv(name,status)"

所有三个集群都应处于“RUNNING”(正在运行)状态,如下面的输出所示。如果集群尚未标记为“RUNNING”,请重试上述命令,直到其状态变为“RUNNING”为止。

输出

name,status prod,RUNNING staging,RUNNING test,RUNNING

所有集群的状态都变为“RUNNING”后,继续实验。

为每个集群创建上下文

使用以下命令获取每个集群的凭据,并创建一个易于使用的 kubectl 上下文,以便稍后引用这些集群:

CONTEXTS=("test" "staging" "prod") for CONTEXT in ${CONTEXTS[@]} do gcloud container clusters get-credentials ${CONTEXT} --region ${REGION} kubectl config rename-context gke_${PROJECT_ID}_${REGION}_${CONTEXT} ${CONTEXT} done

在每个集群中创建一个命名空间

使用以下命令在每一个集群内创建一个 Kubernetes 命名空间 (web-app):

for CONTEXT in ${CONTEXTS[@]} do kubectl --context ${CONTEXT} apply -f kubernetes-config/web-app-namespace.yaml done

应用将部署到 (web-app) 命名空间。

创建交付流水线目标

  1. 为每个目标提交目标定义:
for CONTEXT in ${CONTEXTS[@]} do envsubst < clouddeploy-config/target-$CONTEXT.yaml.template > clouddeploy-config/target-$CONTEXT.yaml gcloud beta deploy apply --file clouddeploy-config/target-$CONTEXT.yaml done

目标在 yaml 文件中定义。每个目标都会配置该目标相关的集群信息。test 和 staging 目标配置基本相同。

  1. 显示 test 目标的相关详细信息:
cat clouddeploy-config/target-test.yaml

输出

apiVersion: deploy.cloud.google.com/v1beta1 kind: Target metadata: name: test description: test cluster gke: cluster: projects/{{project-id}}/locations/us-central1/clusters/test

prod 目标略有不同,因为需要获得批准(请参阅输出中的 requireApproval 设置),才能将版本推送到集群。

  1. 显示 prod 目标的详细信息:
cat clouddeploy-config/target-prod.yaml

输出

apiVersion: deploy.cloud.google.com/v1beta1 kind: Target metadata: name: prod description: prod cluster requireApproval: true gke: cluster: projects/{{project-id}}/locations/us-central1/clusters/prod
  1. 验证是否已创建三个目标(test、staging、prod):
gcloud beta deploy targets list

交付流水线的所有 Google Cloud Deploy 目标均已创建。

点击检查我的进度以验证是否完成了以下目标: 配置部署目标

任务 7. 创建版本

在此任务中,您将创建应用的版本。

Google Cloud Deploy 版本是与特定交付流水线关联的一个或多个容器映像的特定版本。版本创建完成后,可以通过多个目标(推送序列)推送该版本。此外,创建版本后,系统会使用 skaffold 渲染您的应用,并将输出保存为时间点引用,以在该版本存续期间使用。

由于这是应用的第一个版本,可以将其命名为 web-app-001

  1. 运行以下命令,创建版本:
gcloud beta deploy releases create web-app-001 \ --delivery-pipeline web-app \ --build-artifacts web/artifacts.json \ --source web/

--build-artifacts 参数引用了 skaffold 之前创建的 artifacts.json 文件。--source 参数引用了 skaffold.yaml 所在的应用源目录。

创建版本后,版本会自动发布到流水线中的第一个目标(除非需要批准,这一点我们将在本实验的后续步骤中介绍)。

  1. 如需确认测试目标是否已部署您的应用,请运行以下命令:
gcloud beta deploy rollouts list \ --delivery-pipeline web-app \ --release web-app-001

输出

--- approvalState: DOES_NOT_NEED_APPROVAL createTime: '2021-08-16T14:05:21.961604Z' deployEndTime: '2021-08-16T14:06:35.278604Z' deployStartTime: '2021-08-16T14:06:22.420091744Z' deployingBuild: projects/{{project-id}}/locations/us-central1/builds/4815b788-ec5e-4185-9141-a5b57c71b001 enqueueTime: '2021-08-16T14:06:21.760830Z' etag: 5cb7b6c342b5f29b name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app/releases/web-app-001/rollouts/web-app-001-to-test-0001 state: SUCCESS targetId: test uid: cccd9525d3a0414fa60b2771036841d9

请注意,版本首次发布需要几分钟时间,因为 Google Cloud Deploy 会在版本创建时渲染所有目标的清单。GKE 集群可能还需要几分钟时间来提供部署所需的资源。

如果您在上一个命令的输出中没有看到 state: SUCCESS,请等待并定期重新运行该命令,直到发布完成为止。

  1. 运行以下命令,确认您的应用已部署到 test GKE 集群:
kubectx test kubectl get all -n web-app

输出

NAME READY STATUS RESTARTS AGE pod/leeroy-app-5547cf9d9b-rgc2l 1/1 Running 0 3m27s pod/leeroy-web-6768b49c46-w7vt9 1/1 Running 0 3m27s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/leeroy-app ClusterIP None <none> 50051/TCP 3m28s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/leeroy-app 1/1 1 1 3m28s deployment.apps/leeroy-web 1/1 1 1 3m28s NAME DESIRED CURRENT READY AGE replicaset.apps/leeroy-app-5547cf9d9b 1 1 1 3m28s replicaset.apps/leeroy-web-6768b49c46 1 1 1 3m28s

点击检查我的进度以验证是否完成了以下目标: 创建版本

任务 8. 将应用推送到 staging

在此任务中,您将把应用从 test 推送到 staging 目标。

  1. 将应用推送到 staging 目标:
gcloud beta deploy releases promote \ --delivery-pipeline web-app \ --release web-app-001

在推送开始之前,系统会提示您继续。

  • 按 Enter 键接受默认值 (Y = yes)。
  1. 如需确认 staging 目标是否已部署您的应用,请运行以下命令:
gcloud beta deploy rollouts list \ --delivery-pipeline web-app \ --release web-app-001

查看输出

找到标有 targetId: staging 的部分。与之前一样,如果您在上一个命令的输出中没有看到“state: SUCCEEDED”,您需要等待片刻并定期重新运行该命令,直到发布完成为止。

输出

--- approvalState: DOES_NOT_NEED_APPROVAL createTime: '2022-01-05T02:19:32.539468Z' deployEndTime: '2022-01-05T02:19:45.970949Z' deployStartTime: '2022-01-05T02:19:33.111948770Z' deployingBuild: projects/743805075658/locations/us-central1/builds/2316517c-3a2f-4cd3-80ad-6d133b653746 etag: 1109b802ff586df5 name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app/releases/web-app-001/rollouts/web-app-001-to-staging-0001 state: SUCCEEDED targetId: staging uid: 80a35a5f044844708d2050f8c556e07e

点击检查我的进度以验证是否完成了以下目标: 将应用推送到 staging

任务 9. 将应用推送到 prod

在此任务中,您将再次推送应用,同时也需要提供批准。

  1. 将应用推送到 prod 目标:
gcloud beta deploy releases promote \ --delivery-pipeline web-app \ --release web-app-001

在推送开始之前,系统会提示您继续。

  • 按 Enter 键接受默认值 (Y = yes)。
  1. 如需查看 prod 目标的状态,请运行以下命令:
gcloud beta deploy rollouts list \ --delivery-pipeline web-app \ --release web-app-001

在输出中,请注意 approvalStateNEEDS_APPROVAL,而状态为 PENDING_APPROVAL

输出

--- approvalState: NEEDS_APPROVAL createTime: '2021-08-16T14:12:07.466989Z' etag: 6e9303e5a1b04084 name: projects/{{project-id}}/locations/us-central1/deliveryPipelines/web-app/releases/web-app-001/rollouts/web-app-001-to-prod-0001 state: PENDING_APPROVAL targetId: prod uid: a5c7d6007fee4d80904d49142581aaa7
  1. 使用以下命令批准发布:
gcloud beta deploy rollouts approve web-app-001-to-prod-0001 \ --delivery-pipeline web-app \ --release web-app-001

在开始推送之前,系统会提示您批准发布。

  • 按 Enter 键接受默认值 (Y = yes)。
  1. 如需确认 prod 目标是否已部署您的应用,请运行以下命令:
gcloud beta deploy rollouts list \ --delivery-pipeline web-app \ --release web-app-001

与之前的发布一样,找到目标 (targetId: prod) 的条目,并检查发布是否已完成 (state: SUCCEEDED)。定期重新运行该命令,直到发布完成。

  1. 使用 kubectl 检查已部署应用的状态:
kubectx prod kubectl get all -n web-app

点击检查我的进度以验证是否完成了以下目标: 将应用推送到 prod

恭喜!

恭喜!在本实验中,您学习了如何使用 Google Cloud Deploy 创建交付流水线。您为一个基本应用创建了发布版本,并通过一系列 Google Kubernetes Engine (GKE) 目标推送了应用。您首先将应用部署到测试目标,然后将其推送到预演目标,最后推送到生产目标。现在,您可以使用 Cloud Deploy 创建持续交付流水线了!

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

本手册的最后更新时间:2025 年 5 月 15 日

本实验的最后测试时间:2025 年 5 月 15 日

版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。