GSP053

概述
DevOps 实践通常会采用多种部署方式来应对不同的应用部署场景,例如持续部署、蓝绿部署、Canary 部署等等。本实验将引导您学习如何扩缩和管理容器,从而轻松应对涉及多种异构部署的常见场景。
目标
在本实验中,您将学习如何执行以下任务:
- 使用
kubectl 工具
- 创建
yaml 部署文件
- 启动、更新和扩缩部署
- 更新部署并了解不同的部署方式
前提条件
为达到最佳学习效果,建议您为本实验做好以下准备:
- 完成以下 Google Cloud Skills Boost 实验:
- 掌握 Linux 系统管理技能。
- 了解 DevOps 理论和持续部署的概念。
部署简介
异构部署通常需要将两个或更多个截然不同的基础设施环境或区域连接起来,以满足特定的技术或运营需求。异构部署根据其具体情况,可分为“混合”“多云”或“公私”部署。
在本实验中,异构部署涵盖了多种场景:既包括在单一云环境中跨不同区域的部署,也包括跨多个公有云环境(即“多云”)的部署,还包括将本地环境与公有云环境相结合(即“混合”或“公私”)的部署。
仅限于单一环境或区域的部署可能会出现各种业务和技术难题:
-
资源耗尽:在任何单一环境中,尤其是在本地环境中,您可能没有充足的计算、网络和存储资源来满足生产需求。
-
地理覆盖范围有限:在单一环境中部署要求地理位置相距较远的人员访问同一个部署对象。他们的流量可能会途经世界各地再抵达中心位置。
-
可用性受限:面对海量的 Web 流量,应用必须时刻保持容错能力和弹性,才能妥善应对挑战。
-
受制于供应商:供应商级的平台和基础设施抽象可能会妨碍您移植应用。
-
资源缺乏灵活性:您的资源可能仅限于一组特定的计算、存储或网络服务。
异构部署有助于解决这些难题,但其架构设计必须遵循具有确定性的程序化流程与规程。一次性或临时性的部署规程可能导致部署或流程变得脆弱且无法容错。临时性的流程可能会丢失数据或丢弃流量。良好的部署流程必须是可重复的,并使用经过验证的方法来管理预配、配置和维护。
异构部署有以下三种常见场景:
- 多云部署
- 以云服务作为本地数据的前端
- 持续集成/持续交付 (CI/CD) 流程
在以下练习中,我们将会实际体验异构部署的一些常见使用场景,并采用架构完善的方法,通过使用 Kubernetes 和其他基础设施资源来完成这些部署。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 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 概览指南。
设置可用区
通过运行以下命令,并将 替换为本地可用区,来设置您的当前 Google Cloud 可用区:
gcloud config set compute/zone {{{ project_0.default_zone | ZONE }}}
获取本实验的示例代码
- 从实验存储桶获取用于创建和运行容器及部署对象的示例代码:
gcloud storage cp -r gs://spls/gsp053/kubernetes .
cd kubernetes
- 创建一个包含 3 个节点的集群(此过程将需要几分钟才能完成):
gcloud container clusters create bootcamp \
--machine-type e2-small \
--num-nodes 3 \
--scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"
任务 1:了解部署对象
首先,我们来看看部署对象。
- 可以使用
kubectl 中的 explain 命令来查看部署对象的信息:
kubectl explain deployment
- 另外,您也可以使用
--recursive 选项查看所有字段:
kubectl explain deployment --recursive
- 在完成本实验的过程中,您可以使用 explain 命令来了解部署对象的结构以及各个字段的用途:
kubectl explain deployment.metadata.name
任务 2:创建部署对象
- 创建
fortune-app 部署对象。检查部署配置文件:
cat deployments/fortune-app-blue.yaml
输出:
# orchestrate-with-kubernetes/kubernetes/deployments/fortune-app-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fortune-app-blue
spec:
replicas: 3
selector:
matchLabels:
app: fortune-app
template:
metadata:
labels:
app: fortune-app
track: stable
version: "1.0.0"
spec:
containers:
- name: fortune-app
# 新的集中化的映像路径
image: "us-central1-docker.pkg.dev/qwiklabs-resources/spl-lab-apps/fortune-service:1.0.0"
ports:
- name: http
containerPort: 8080
...
请注意该部署对象是如何创建三个副本的,而且它使用的是 fortune-service 容器的 1.0.0 版本。
- 接下来使用
kubectl create 命令创建部署对象:
kubectl create -f deployments/fortune-app-blue.yaml
- 创建部署对象后,可以使用以下命令验证是否创建成功:
kubectl get deployments
- 部署对象创建好后,Kubernetes 就会为它创建一个
ReplicaSet。您可以验证是否为该部署对象创建了 ReplicaSet:
kubectl get replicasets
您应该会看到一个名称格式为 fortune-app-blue-xxxxxxx 的 ReplicaSet
- 查看作为该部署对象的一部分创建的 Pod:
kubectl get pods
- 现在,创建一项用于对外公开
fortune-app 部署对象的服务。
kubectl create -f services/fortune-app.yaml
- 获取
fortune-app 的外部 IP,然后对 /version 端点执行 curl 命令,以便与其交互:
kubectl get services fortune-app
注意:为该服务填充外部 IP 字段可能需要几秒钟时间。这种情况很正常。只需每隔几秒重新运行上述命令,直到该字段中填充了数据即可。
curl http://<外部 IP>/version
您应该会收到一个指明 {"version":"1.0.0"} 的 JSON 响应。
- 您也可以使用
kubectl 的输出模板功能,将 curl 整合成单行命令使用:
curl http://`kubectl get svc fortune-app -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了 Kubernetes 集群以及 fortune-app 部署对象和服务,您会看到一个评分。
创建 Kubernetes 集群和部署对象 (fortune-app)
扩缩部署对象
至此您已经创建了一个部署对象,接下来可以对它进行扩缩了。为此,需要更新 spec.replicas 字段。
- 更新 replicas 字段的最简便方法是使用
kubectl scale 命令:
kubectl scale deployment fortune-app-blue --replicas=5
注意:可能需要 1 分钟左右的时间,所有新 Pod 才能启动完毕。
- 验证现在是否有 5 个
fortune-app-blue Pod 正在运行:
kubectl get pods | grep fortune-app-blue | wc -l
- 现在对该应用进行缩容:
kubectl scale deployment fortune-app-blue --replicas=3
- 再次验证 Pod 数量是否正确:
kubectl get pods | grep fortune-app-blue | wc -l
至此,您已经了解了 Kubernetes 部署,以及如何管理和扩缩一组 Pod。
任务 3:滚动更新
部署对象支持使用滚动更新机制将映像更新至新版本。
触发滚动更新
- 如需触发滚动更新,只需应用“绿色”部署的配置即可。Kubernetes 足够智能,能够识别现有部署对象 (
fortune-app-blue),并将新文件中的更改“滚动”到现有部署对象中。
kubectl edit deployment fortune-app-blue
- 在编辑器中,找到
image 行,并将版本标记从 1.0.0 更改为 2.0.0。您可以按键盘上的 i 键进入“插入模式”,然后编辑该文件。
-
首先,更改 image 标记:
- 找到下面这一行:
image: "us-central1-docker.pkg.dev/qwiklabs-resources/spl-lab-apps/fortune-service:1.0.0"
- 将其更改为:
image: "us-central1-docker.pkg.dev/qwiklabs-resources/spl-lab-apps/fortune-service:2.0.0"
-
接下来,更新环境变量:
- 找到
env 部分和 APP_VERSION 变量。
- 将
value: "1.0.0" 更改为 value: "2.0.0"
-
保存,然后关闭编辑器。您可以按 Esc 键,然后输入 :wq 并按 Enter 键来完成此操作。这将触发对正确部署对象的滚动更新,并正确记录其历史记录。
-
查看 Kubernetes 创建的新 ReplicaSet:
kubectl get replicaset
- 您还会在发布历史记录中看到一个新条目:
kubectl rollout history deployment/fortune-app-blue
暂停滚动更新
- 运行以下命令暂停发布:
kubectl rollout pause deployment/fortune-app-blue
- 验证当前的发布状态:
kubectl rollout status deployment/fortune-app-blue
注意:status 命令可能会立即报告“deployment "fortune-app-blue" successfully rolled out”(“fortune-app-blue”部署对象已成功发布)。这是预期行为,表明 pause 命令本身已成功执行。这并不意味着版本更新已完成。
- 检查每个 Pod 的版本。您会看到既有 1.0.0 Pod,也有 2.0.0 Pod,据此可以确认发布已中途暂停。
for p in $(kubectl get pods -l app=fortune-app -o=jsonpath='{.items[*].metadata.name}'); do echo $p && curl -s http://$(kubectl get pod $p -o=jsonpath='{.status.podIP}')/version; echo; done
- 按
Ctrl+C 退出循环。
恢复滚动更新
- 使用
resume 命令继续进行发布:
kubectl rollout resume deployment/fortune-app-blue
- 发布完成后,您在运行
status 命令时应该会看到以下内容:
kubectl rollout status deployment/fortune-app-blue
回滚更新
假设您在新版本中检测到一个 bug。
- 使用
rollout 命令可回滚到前一版本:
kubectl rollout undo deployment/fortune-app-blue
注意:回滚可能需要一点时间才能完成。
- 验证所有 Pod 都已回滚至 1.0.0 版本:
curl http://`kubectl get svc fortune-app -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
太棒了!至此您已经学会了如何对 Kubernetes 部署对象执行滚动更新。
任务 4:Canary 部署
当您想要在生产环境中针对一部分用户测试某项新部署时,可以使用 Canary 部署对象。
创建 Canary 部署对象
- 首先,使用
fortune-app-canary.yaml 文件为新版本创建一个新的 Canary 部署对象:
cat deployments/fortune-app-canary.yaml
- 现在创建 Canary 部署对象:
kubectl create -f deployments/fortune-app-canary.yaml
- 创建好 Canary 部署对象后,您应该就有了两个部署对象。可以使用以下命令进行验证:
kubectl get deployments
fortune-app 服务有一个 app: fortune-app 选择器,该选择器将同时匹配 fortune-app-blue(生产环境)和 fortune-app-canary 部署对象中的 Pod。
验证 Canary 部署对象
- 您可以通过向服务发送请求来验证所部署的版本。
for i in {1..10}; do curl -s http://`kubectl get svc fortune-app -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version; echo;
done
- 多次运行此命令,您应该会发现,大多数请求都是由 1.0.0 版处理的,还有一小部分请求是由 2.0.0 版处理的。
验证您已完成的任务
点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了 Canary 部署对象,您会看到一个评分。
Canary 部署
任务 5:蓝绿部署
对于蓝绿部署,您需要创建两个单独的部署对象,并通过更新服务选择器在它们之间切换流量。
服务
- 首先更新服务,使其仅指向“蓝色”版本 (1.0.0)。
kubectl apply -f services/fortune-app-blue-service.yaml
使用蓝绿部署进行更新
- 现在,为 2.0.0 版本创建新的“绿色”部署对象。
kubectl create -f deployments/fortune-app-green.yaml
- 绿色部署启动后,验证当前提供的版本是否仍为 1.0.0。
curl http://`kubectl get svc fortune-app -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
- 现在更新服务,使其指向新的“绿色”版本:
kubectl apply -f services/fortune-app-green-service.yaml
- 服务更新后,系统会立即使用“绿色”部署对象。现在,您可以验证系统是否一直在提供 2.0.0 版:
curl http://`kubectl get svc fortune-app -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
蓝绿回滚
- 如需回滚,只需为“蓝色”部署对象重新应用服务清单即可:
kubectl apply -f services/fortune-app-blue-service.yaml
- 服务更新后,回滚即成功完成。验证系统现在使用的是否为 1.0.0 版本:
curl http://`kubectl get svc fortune-app -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
大功告成!至此您已经了解了蓝绿部署,以及如何将更新部署到需要一次性整体切换版本的应用。
蓝绿部署
恭喜!
通过本实验,您得以使用 kubectl 命令行工具体验了更多操作,并尝试了在 YAML 文件中设置的多种部署配置方式来启动、更新和扩缩你的部署对象。
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2025 年 8 月 18 日
上次测试实验的时间:2025 年 8 月 18 日
版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。