概览
在本实验中,您将学习有关使用部署清单的基础知识。清单是包含完成部署所需配置的文件,可用于多个不同的 Pod。清单文件易于修改。
目标
在本实验中,您将学习如何执行以下任务:
- 创建部署清单、部署到集群,并验证当节点被停用时 Pod 会重新安排。
 
- 触发手动增加和减少部署作业中的 Pod 数量。
 
- 触发部署发布(滚动更新到新版本)和回滚。
 
- 执行 Canary 部署。
 
实验设置
访问实验
对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。
- 
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
- 
打开 Google Cloud 控制台按钮
 
- 剩余时间
 
- 进行该实验时必须使用的临时凭据
 
- 帮助您逐步完成本实验所需的其他信息(如果需要)
 
 
- 
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。        
 
 
- 
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
 {{{user_0.username | "<用户名>"}}}
 
您也可以在实验详细信息面板中找到用户名。
 
- 
点击下一步。
 
- 
复制下面的密码,然后将其粘贴到欢迎对话框中。
 {{{user_0.password | "<密码>"}}}
 
您也可以在实验详细信息面板中找到密码。
 
- 
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
 
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
 
- 
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
 
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
 
- 请勿注册免费试用。
 
 
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单,或在搜索字段中输入服务或产品的名称。
完成初始登录步骤后,系统会显示项目信息中心。
激活 Google Cloud Shell
Google Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。
Google Cloud Shell 提供了可用于访问您的 Google Cloud 资源的命令行工具。
- 
在 Cloud 控制台右上角的工具栏中,点击“打开 Cloud Shell”按钮。

 
- 
点击继续。
 
预配并连接到环境需要一些时间。如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 PROJECT_ID。例如:

gcloud 是 Google Cloud 的命令行工具。它会预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
gcloud auth list
输出:
Credentialed accounts:
 - @.com (active)
输出示例:
Credentialed accounts:
 - google1623327_student@qwiklabs.net
 
gcloud config list project
输出:
[core]
project = 
输出示例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注意:有关 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。
任务 1. 创建部署清单并部署到集群
在此任务中,您将为集群中的一个 Pod 创建部署清单。
连接到实验 GKE 集群
- 在 Cloud Shell 中输入以下命令,为可用区和集群名称设置环境变量:
 
export my_region={{{ project_0.default_region | REGION }}}
export my_cluster=dev-cluster
- 在 Cloud Shell 中配置 kubectl Tab 自动补全功能:
 
source <(kubectl completion bash)
- 在 Cloud Shell 中,使用以下命令为 kubectl 命令行工具配置对集群的访问权限:
 
gcloud container clusters get-credentials $my_cluster --region $my_region
创建部署清单
您将使用名为 nginx-deployment.yaml 的示例部署清单创建一个部署作业。这个部署作业配置为运行三个 Pod 副本,每个 Pod 中有一个 nginx 容器监听 TCP 端口 80。
- 使用以下命令,通过 nano 创建并打开名为 
nginx-deployment.yaml 的文件: 
nano nginx-deployment.yaml
- 打开 nano 后,将以下内容粘贴到 
nginx-deployment.yaml 文件中: 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27.0
        ports:
        - containerPort: 80
- 
按 Ctrl+O 组合键,然后按 Enter 键,保存修改后的文件。
 
- 
按 Ctrl+X 组合键,退出 nano 文本编辑器。
 
- 
如需部署此清单,请执行以下命令:
 
kubectl apply -f ./nginx-deployment.yaml
- 如需查看部署列表,请执行以下命令:
 
kubectl get deployments
输出应如下例所示。
输出:
NAME               READY      UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/3        3            0           3s
- 等待几分钟,然后重复该命令,直到该命令列出的当前部署数量与预期的部署数量一致。
 
最终输出应如下示例所示。
输出:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           42s
点击“检查我的进度”,验证已完成以下目标:
创建并部署清单 nginx 部署作业
任务 2. 手动增加和减少部署作业中的 Pod 数量
有时,您需要关闭 Pod 实例。但有些时候,您又想运行十个 Pod。在 Kubernetes 中,您可以将特定 Pod 的实例调整为所需数量。如需将其关闭,可调整为零。
在此项任务中,您将在 Google Cloud 控制台和 Cloud Shell 中扩缩 Pod 数量。
在控制台中扩缩 Pod 数量
- 切换到 Google Cloud 控制台标签页。
 
- 在导航菜单 (
) 上,点击 Kubernetes Engine > 工作负载。 
- 点击 nginx-deployment(您的部署),打开“部署详情”页面。
 
- 点击顶部的操作 > 扩缩 > 修改副本。
 
- 输入 1 并点击扩缩。
 
此操作会将集群缩容。您应该会看到托管式 Pod 中的 Pod 状态正在更新。您可能需要点击刷新。
在 Shell 中增加和减少 Pod 数量
- 切换回 Cloud Shell 浏览器标签页。
 
- 如需在 Cloud Shell 中查看部署作业中的 Pod 列表,请执行以下命令:
 
kubectl get deployments
输出:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           3m
- 如需将 Pod 数量重新增至三个副本,请执行以下命令:
 
kubectl scale --replicas=3 deployment nginx-deployment
- 如需查看部署作业中的 Pod 列表,请执行以下命令:
 
kubectl get deployments
输出:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4m
任务 3. 触发部署发布和部署回滚
仅当部署的 Pod 模板(即 .spec.template)发生更改时,例如模板的标签或容器映像更新时,系统才会触发部署发布。其他更新(例如扩缩部署)不会触发发布。
在此任务中,您将触发部署发布,然后触发部署回滚。
触发部署发布
- 若要更新部署中的 nginx 版本,请执行以下命令:
 
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.28.0 
此命令会将部署中的容器映像更新为 nginx v1.28.0。
- 如需为发布添加注释以提供有关更改的详细信息,请执行以下命令:
 
kubectl annotate deployment nginx-deployment kubernetes.io/change-cause="version change to 1.28.0" --overwrite=true
- 要查看发布状态,请执行以下命令:
 
kubectl rollout status deployment.v1.apps/nginx-deployment
输出应如下例所示。
输出:
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 1 old replicas pending termination...
Waiting for rollout to finish: 1 old replicas pending termination...
deployment "nginx-deployment" successfully rolled out
- 获取部署列表以验证变更:
 
kubectl get deployments
输出应如下例所示。
输出:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           6m
点击“检查我的进度”,验证已完成以下目标:
更新部署中的 nginx 版本
- 查看该部署的发布历史记录:
 
kubectl rollout history deployment nginx-deployment
输出应如下例所示。您的输出可能不完全相同。
输出:
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
1         
2         version change to 1.28.0
触发部署回滚
如需回滚对象的发布,可以使用 kubectl rollout undo 命令。
- 如需回滚到 nginx 部署的先前版本,请执行如下命令:
 
kubectl rollout undo deployments nginx-deployment
- 查看该部署更新后的发布历史记录:
 
kubectl rollout history deployment nginx-deployment
输出应如下例所示。您的输出可能不完全相同。
输出:
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
2        version change to 1.28.0
3         
注意:CHANGE-CAUSE 的最新更新内容为空白,因为我们没有使用 kubectl annotate 命令。
- 查看最新部署版本的详细信息:
 
kubectl rollout history deployment/nginx-deployment --revision=3
输出应如下例所示。您的输出可能不完全相同,但会显示当前版本已回滚到 nginx:1.27.0。
输出:
deployments "nginx-deployment" with revision #3
Pod Template:
  Labels:       app=nginx
        pod-template-hash=3123191453
  Containers:
   nginx:
    Image:      nginx:1.27.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        
    Mounts:     
  Volumes:      
任务 4. 定义清单中的服务类型
在此项任务中,您将创建并验证一个控制应用入站流量的服务。服务可以配置为 ClusterIP、NodePort 或 LoadBalancer 类型。在此实验中,您将配置 LoadBalancer。
在清单中定义服务类型
一个名为 service-nginx.yaml 的清单文件已提供给您,用于部署 LoadBalancer 服务类型。此服务配置为在所有带有 app: nginx 标签的容器上,将 TCP 端口 60000 上的入站流量转发到端口 80。
- 使用以下命令,通过 nano 创建并打开名为 
service-nginx.yaml 的文件: 
nano service-nginx.yaml
- 打开 nano 后,将以下内容粘贴到 
service-nginx.yaml 文件中: 
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 80
- 
按 Ctrl+O 组合键,然后按 Enter 键,保存修改后的文件。
 
- 
按 Ctrl+X 组合键,退出 nano 文本编辑器。
 
- 
要在 Cloud Shell 中部署清单,请执行如下命令:
 
kubectl apply -f ./service-nginx.yaml
此清单定义了一个服务,并将该服务应用于与选择器对应的 Pod。在本例中,该清单应用于您在任务 1 中部署的 nginx 容器。此服务也会应用于任何其他带有 app: nginx 标签的 Pod,包括任何在该服务之后创建的 Pod。
验证已创建 LoadBalancer
- 如需查看 nginx 服务的详细信息,请执行如下命令:
 
kubectl get service nginx
输出应如下例所示。
输出:
NAME   Type          CLUSTER-IP   EXTERNAL-IP    PORT(S)           AGE
nginx  LoadBalancer  10.X.X.X     X.X.X.X        60000:31798/TCP   1m
- 当外部 IP 出现时,在新的浏览器标签页中打开 
http://[EXTERNAL_IP]:60000/,即可看到发往服务器的请求是通过网络负载均衡机制进行分配的。 
注意:为服务填充 ExternalIP 字段可能需要几秒钟时间。这种情况很正常。只需每隔几秒重新运行 kubectl get services nginx 命令,直到该字段中填充数据。
点击“检查我的进度”,验证已完成以下目标:
部署清单文件以部署 LoadBalancer 服务类型
任务 5. 执行 Canary 部署
Canary 部署是一种用于测试应用新版本的独立部署。单个服务同时定位到 Canary 部署和普通部署,还会引导部分用户使用 Canary 版本,以降低新版本的风险。
在此任务中,您将创建一个 Canary 部署,该部署会运行一个 Pod,其中包含的 nginx 映像版本比主部署的版本更新。
- 使用以下命令,通过 nano 创建并打开名为 
nginx-canary.yaml 的文件: 
nano nginx-canary.yaml
- 打开 nano 后,将以下内容粘贴到 
nginx-canary.yaml 文件中: 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-canary
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        track: canary
        Version: 1.28.0
    spec:
      containers:
      - name: nginx
        image: nginx:1.28.0
        ports:
        - containerPort: 80
- 
按 Ctrl+O 组合键,然后按 Enter 键,保存修改后的文件。
 
- 
按 Ctrl+X 组合键,退出 nano 文本编辑器。
 
您在上一个任务中部署的 nginx 服务的清单使用标签选择器来定位带有 app: nginx 标签的 Pod。常规部署和这个新的 Canary 部署都带有 app: nginx 标签。入站连接将由该服务分发到常规部署 Pod 和 Canary 部署 Pod。Canary 部署的副本数量(Pod 数)少于常规部署,因此可使用 Canary 部署的用户数也少于常规部署。
- 基于该配置文件创建 Canary 部署作业:
 
kubectl apply -f ./nginx-canary.yaml
- 部署完成后,确认 nginx 和 nginx Canary 部署都在列表中:
 
kubectl get deployments
- 切换回连接到外部 LoadBalancer 服务 IP 的浏览器标签页并刷新页面。您看到的应该仍是标准的 
Welcome to nginx 页面。 
- 切换回 Cloud Shell 并将主部署减至 0 个副本:
 
kubectl scale --replicas=0 deployment nginx-deployment
- 确认正在运行的唯一副本现在是 Canary 部署:
 
kubectl get deployments
- 切换回连接到外部 LoadBalancer 服务 IP 的浏览器标签页并刷新页面。您看到的应该仍是标准的 
Welcome to nginx 页面,显示服务正自动将流量均衡分配至 Canary 部署。 
点击“检查我的进度”,验证已完成以下目标:
创建 Canary 部署作业
会话亲和性
此实验使用的服务配置不能确保来自同一个客户端的所有请求始终连接到同一 Pod。每个请求都是单独处理的,可能连接到常规 nginx 部署,也可能连接到 nginx Canary 部署。
如果 Canary 版本中的功能发生重大变化,那么在不同版本之间切换可能会导致出现问题。如果您需要确保客户端的首次请求所连接的 Pod 被用于其所有后续连接,则可以在服务规范中将 sessionAffinity 字段设置为 ClientIP,从而实现会话亲和性。
例如:
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  sessionAffinity: ClientIP
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 80
结束实验
完成实验后,请点击结束实验。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。
系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交。
星级数的含义如下:
- 1 颗星 = 非常不满意
 
- 2 颗星 = 不满意
 
- 3 颗星 = 一般
 
- 4 颗星 = 满意
 
- 5 颗星 = 非常满意
 
如果您不想提供反馈,可以关闭该对话框。
如果要留言反馈、提出建议或做出更正,请使用支持标签页。
版权所有 2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。