GSP1079

概览
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 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在“实验详细信息”窗格中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在“实验详细信息”窗格中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 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 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 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(生产)
- 启用 Google Kubernetes Engine API:
gcloud services enable \
container.googleapis.com \
clouddeploy.googleapis.com
- 创建三个 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
- 检查这三个集群的状态:
gcloud container clusters list --format="csv(name,status)"
输出
name,status
prod,PROVISIONING
staging,PROVISIONING
test,RUNNING
创建集群可能需要几分钟时间。您无需等待集群准备就绪,可以先继续实验。
点击检查我的进度以验证是否完成了以下目标:
创建三个 GKE 集群
任务 3. 准备 Web 应用容器映像
在此任务中,您将在 Artifact Registry 中创建一个仓库,用于保存 Web 应用的容器映像。
- 启用 Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
- 创建用于保存容器映像的 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。
准备应用配置
- 将实验代码库克隆到您的主目录:
cd ~/
git clone https://github.com/GoogleCloudPlatform/cloud-deploy-tutorials.git
cd cloud-deploy-tutorials
git checkout c3cae80 --quiet
cd tutorials/base
- 创建
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。
- 启用 Cloud Build API:
gcloud services enable cloudbuild.googleapis.com
- 创建一个 Cloud Storage 存储桶,供 Cloud Build 存储源代码和日志。
gsutil mb -p $PROJECT_ID gs://${PROJECT_ID}_cloudbuild
- 运行 skaffold 命令来构建应用,并将容器映像部署到之前创建的 Artifact Registry 仓库。
cd web
skaffold build --interactive=false \
--default-repo $REGION-docker.pkg.dev/$PROJECT_ID/web-app \
--file-output artifacts.json
cd ..
- 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. 创建交付流水线
在此任务中,您将设置交付流水线。
- 启用 Google Cloud Deploy API:
gcloud services enable clouddeploy.googleapis.com
- 使用
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
- 验证交付流水线已创建:
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) 命名空间。
创建交付流水线目标
- 为每个目标提交目标定义:
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 目标配置基本相同。
- 显示 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
设置),才能将版本推送到集群。
- 显示 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
- 验证是否已创建三个目标(test、staging、prod):
gcloud beta deploy targets list
交付流水线的所有 Google Cloud Deploy 目标均已创建。
点击检查我的进度以验证是否完成了以下目标:
配置部署目标
任务 7. 创建版本
在此任务中,您将创建应用的版本。
Google Cloud Deploy 版本是与特定交付流水线关联的一个或多个容器映像的特定版本。版本创建完成后,可以通过多个目标(推送序列)推送该版本。此外,创建版本后,系统会使用 skaffold 渲染您的应用,并将输出保存为时间点引用,以在该版本存续期间使用。
由于这是应用的第一个版本,可以将其命名为 web-app-001
。
- 运行以下命令,创建版本:
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 所在的应用源目录。
创建版本后,版本会自动发布到流水线中的第一个目标(除非需要批准,这一点我们将在本实验的后续步骤中介绍)。
- 如需确认测试目标是否已部署您的应用,请运行以下命令:
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
,请等待并定期重新运行该命令,直到发布完成为止。
- 运行以下命令,确认您的应用已部署到 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 目标。
- 将应用推送到 staging 目标:
gcloud beta deploy releases promote \
--delivery-pipeline web-app \
--release web-app-001
在推送开始之前,系统会提示您继续。
- 按 Enter 键接受默认值 (Y = yes)。
- 如需确认 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
在此任务中,您将再次推送应用,同时也需要提供批准。
- 将应用推送到 prod 目标:
gcloud beta deploy releases promote \
--delivery-pipeline web-app \
--release web-app-001
在推送开始之前,系统会提示您继续。
- 按 Enter 键接受默认值 (Y = yes)。
- 如需查看 prod 目标的状态,请运行以下命令:
gcloud beta deploy rollouts list \
--delivery-pipeline web-app \
--release web-app-001
在输出中,请注意 approvalState
为 NEEDS_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
- 使用以下命令批准发布:
gcloud beta deploy rollouts approve web-app-001-to-prod-0001 \
--delivery-pipeline web-app \
--release web-app-001
在开始推送之前,系统会提示您批准发布。
- 按 Enter 键接受默认值 (Y = yes)。
- 如需确认 prod 目标是否已部署您的应用,请运行以下命令:
gcloud beta deploy rollouts list \
--delivery-pipeline web-app \
--release web-app-001
与之前的发布一样,找到目标 (targetId: prod
) 的条目,并检查发布是否已完成 (state: SUCCEEDED
)。定期重新运行该命令,直到发布完成。
- 使用
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 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。