arrow_back

为 Google Kubernetes Engine 配置永久性存储空间

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

为 Google Kubernetes Engine 配置永久性存储空间

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

概览

在此实验中,您将设置 PersistentVolumes 和 PersistentVolumeClaims。PersistentVolumes 是可供 Kubernetes 集群使用的存储空间。PersistentVolumeClaims 使 Pod 可以访问 PersistentVolumes。没有 PersistentVolumeClaims,大部分 Pod 只是临时性的,因此如果您希望数据在 Pod 扩缩、升级或迁移后继续有效,应该使用 PersistentVolumeClaims。

目标

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

  • 为 Google Cloud 永久性磁盘(动态创建或现有的磁盘)的 PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC) 创建清单
  • 在 Pod 中将 Google Cloud 永久性磁盘 PVC 装载为卷
  • 使用清单创建 StatefulSet
  • 在 StatefulSet 中将 Google Cloud 永久性磁盘 PVC 装载为卷
  • 在停止并重启 Pod 时,验证 StatefulSet 中的 Pod 与特定 PV 的连接

实验设置

访问实验

对于每个实验,您都会免费获得一个新的 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 产品和服务的菜单,请点击左上角的导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标

激活 Google Cloud Shell

Google Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。

Google Cloud Shell 提供了可用于访问您的 Google Cloud 资源的命令行工具。

  1. 在 Cloud 控制台右上角的工具栏中,点击“打开 Cloud Shell”按钮。

    突出显示的 Cloud Shell 图标

  2. 点击继续

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

在 Cloud Shell 终端中突出显示的项目 ID

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

  • 您可以通过以下命令列出有效的账号名称:
gcloud auth list

输出:

Credentialed accounts: - @.com (active)

输出示例

Credentialed accounts: - google1623327_student@qwiklabs.net
  • 您可以通过以下命令列出项目 ID:
gcloud config list project

输出:

[core] project =

输出示例

[core] project = qwiklabs-gcp-44776a13dea667a6 注意:有关 gcloud 的完整文档,请参阅 gcloud CLI 概览指南

任务 1. 创建 PV 和 PVC

在此任务中,您将创建 PVC,它会触发 Kubernetes 自动创建 PV。

连接到实验 GKE 集群

  1. 在 Cloud Shell 中输入以下命令,为可用区和集群名称设置环境变量:
export my_region={{{project_0.default_region|Region}}} export my_cluster=autopilot-cluster-1
  1. 为 kubectl 命令行工具配置 Tab 键自动补全功能:
source <(kubectl completion bash)
  1. 为 kubectl 配置对集群的访问权限:
gcloud container clusters get-credentials $my_cluster --region $my_region

创建并应用包含 PVC 的清单

在大多数情况下,您不需要直接配置 PV 对象或创建 Compute Engine 永久性磁盘。您可以改为创建 PVC,然后 Kubernetes 会自动为您预配永久性磁盘。

我们来创建一个名为 hello-web-disk 的 30 GB PVC,每次作为读写卷挂接到单个节点。

  1. 使用以下命令,通过 nano 创建并打开名为 pvc-demo.yaml 的文件:
nano pvc-demo.yaml
  1. 打开 nano 后,将以下内容粘贴到 pvc-demo.yaml 文件中:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hello-web-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi
  1. Ctrl+O 组合键,然后按 Enter 键,保存编辑好的文件。

  2. Ctrl+X 组合键,退出 nano 文本编辑器。

  3. 要显示您目前没有 PVC,可执行以下命令:

kubectl get persistentvolumeclaim

输出:

No resources found in default namespace.
  1. 要创建 PVC,可执行以下命令:
kubectl apply -f pvc-demo.yaml
  1. 要显示您新创建的 PVC,可执行以下命令:
kubectl get persistentvolumeclaim

部分输出:

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE hello-web-disk Pending standard-rwo unset 15s 注意:在下一个步骤结束前,状态会保持为待处理。

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

创建 PV 和 PVC

任务 2. 在 Pod 中装载并验证 Google Cloud 永久性磁盘 PVC

在此任务中,您将把永久性磁盘 PVC 挂接到 Pod。作为清单的一部分,您将把 PVC 装载为 Pod 的卷。

将 PVC 装载到 Pod

创建清单文件 pod-volume-demo.yaml 以部署 nginx 容器,将 pvc-demo-volume 挂接到 Pod,并将该卷装载到 nginx 容器内的路径 /var/www/html。保存到容器内这个目录中的文件将保存到该永久性卷,即使关闭并重新创建了 Pod 和容器,这些文件也将保留下来。

  1. 使用以下命令,通过 nano 创建并打开名为 pod-volume-demo.yaml 的文件:
nano pod-volume-demo.yaml
  1. nano 打开后,将以下内容粘贴到 pod-volume-demo.yaml 文件中:
kind: Pod apiVersion: v1 metadata: name: pvc-demo-pod spec: containers: - name: frontend image: nginx volumeMounts: - mountPath: "/var/www/html" name: pvc-demo-volume volumes: - name: pvc-demo-volume persistentVolumeClaim: claimName: hello-web-disk
  1. Ctrl+O 组合键,然后按 Enter 键,保存编辑好的文件。

  2. Ctrl+X 组合键,退出 nano 文本编辑器。

  3. 要创建包含卷的 Pod,请执行以下命令:

kubectl apply -f pod-volume-demo.yaml
  1. 列出集群中的 Pod:
kubectl get pods

输出:

NAME READY STATUS RESTARTS AGE pvc-demo-pod 0/1 ContainerCreating 0 18s

如果您在创建 Pod 后快速执行此操作,那么在装载卷时,您会看到列出的状态为“ContainerCreating”,然后变成“Running”。

  1. 要验证 Pod 内的 PVC 可以访问,您必须获得对 Pod 的 Shell 访问权限。要启动 Shell 会话,可执行如下命令:
kubectl exec -it pvc-demo-pod -- sh
  1. 要在 Pod 中创建网页形式的简单文本消息,可输入以下命令:
echo Test webpage in a persistent volume!>/var/www/html/index.html chmod +x /var/www/html/index.html
  1. 确认该文本文件包含您的消息:
cat /var/www/html/index.html

输出:

Test webpage in a persistent volume!
  1. 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit

测试 PV 的持久性

现在,您将从集群中删除 Pod,确认 PV 仍然存在,然后重新部署 Pod,并确认 PV 的内容仍然完整。

  1. 删除 pvc-demo-pod:
kubectl delete pod pvc-demo-pod
  1. 列出集群中的 Pod:
kubectl get pods

输出:

No resources found in default namespace.

该集群上应该没有 Pod。

  1. 要显示 PVC,可执行以下命令:
kubectl get persistentvolumeclaim

部分输出:

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE hello-web-disk Bound pvc-8...34 30Gi RWO standard-rwo unset 22m

PVC 仍然存在,在删除 Pod 时没有被删除。

  1. 重新部署 pvc-demo-pod:
kubectl apply -f pod-volume-demo.yaml
  1. 列出集群中的 Pod:
kubectl get pods

输出:

NAME READY STATUS RESTARTS AGE pvc-demo-pod 1/1 Running 0 15s

Pod 将会部署,并且这次状态变成“Running”的速度更快,因为该 PV 已经存在,不需要创建。

  1. 要验证 Pod 内的 PVC 依然可以访问,您必须获得对 Pod 的 Shell 访问权限。要启动 Shell 会话,可执行如下命令:
kubectl exec -it pvc-demo-pod -- sh
  1. 要验证文本文件仍然包含您的消息,可执行以下命令:
cat /var/www/html/index.html

输出:

Test webpage in a persistent volume!

即使从集群中删除并重新创建了 Pod,永久性卷的内容也没有被移除。

  1. 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit

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

在 Pod 中装载并验证 Google Cloud 永久性磁盘 PVC

任务 3. 创建包含 PVC 的 StatefulSet

在此任务中,您将在 StatefulSet 中使用 PVC。StatefulSet 类似于部署,只是 Pod 被赋予了唯一标识符。

释放 PVC

  1. 在 Statefulset 中使用 PVC 之前,您必须删除当前使用它的 Pod。执行以下命令以删除 Pod:
kubectl delete pod pvc-demo-pod
  1. 确认 Pod 已删除:
kubectl get pods

输出:

No resources found in default namespace.

创建 StatefulSet

我们来创建一个清单文件 statefulset-demo.yaml,该文件会创建一个 StatefulSet,其中包含 LoadBalancer 服务和一个 Pod 的三个副本,此 Pod 内有 nginx 容器和名为 hello-web-disk 的 30 GB PVC 的 volumeClaimTemplate。nginx 容器会将名为 hello-web-disk 的 PVC 装载到前一个任务中的 /var/www/html

  1. 使用以下命令,通过 nano 创建并打开名为 statefulset-demo.yaml 的文件:
nano statefulset-demo.yaml
  1. 打开 nano 后,将以下内容粘贴到 statefulset-demo.yaml 文件中:
kind: Service apiVersion: v1 metadata: name: statefulset-demo-service spec: ports: - protocol: TCP port: 80 targetPort: 9376 type: LoadBalancer --- apiVersion: apps/v1 kind: StatefulSet metadata: name: statefulset-demo spec: selector: matchLabels: app: MyApp serviceName: statefulset-demo-service replicas: 3 updateStrategy: type: RollingUpdate template: metadata: labels: app: MyApp spec: containers: - name: stateful-set-container image: nginx ports: - containerPort: 80 name: http volumeMounts: - name: hello-web-disk mountPath: "/var/www/html" volumeClaimTemplates: - metadata: name: hello-web-disk spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 30Gi
  1. Ctrl+O 组合键,然后按 Enter 键,保存编辑好的文件。

  2. Ctrl+X 组合键,退出 nano 文本编辑器。

  • 要创建包含卷的 StatefulSet,可执行以下命令:
kubectl apply -f statefulset-demo.yaml

输出:

service "statefulset-demo-service" created statefulset.apps "statefulset-demo" created

现在有一个 Statefulset 在名为 statefulset-demo-service 的服务后运行。

验证 StatefulSet 中的 Pod 连接

  1. 使用“kubectl describe”命令查看 StatefulSet 的详细信息:
kubectl describe statefulset statefulset-demo

请注意输出末尾的事件状态。该服务和 Statefulset 已成功创建。

Normal SuccessfulCreate 10s statefulset-controller Message: create Claim hello-web-disk-statefulset-demo-0 Pod statefulset-demo-0 in StatefulSet statefulset-demo success Normal SuccessfulCreate 10s statefulset-controller Message: create Pod statefulset-demo-0 in StatefulSet statefulset-demo successful
  1. 列出集群中的 Pod:
kubectl get pods

输出:

NAME READY STATUS RESTARTS AGE statefulset-demo-0 1/1 Running 0 6m statefulset-demo-1 1/1 Running 0 3m statefulset-demo-2 1/1 Running 0 2m
  1. 要列出 PVC,可执行以下命令:
kubectl get pvc

输出:

NAME STATUS VOLUME CAPACITY ACCESS hello-web-disk Bound pvc-86117ea6-...34 30Gi RWO hello-web-disk-st...-demo-0 Bound pvc-92d21d0f-...34 30Gi RWO hello-web-disk-st...-demo-1 Bound pvc-9bc84d92-...34 30Gi RWO hello-web-disk-st...-demo-2 Bound pvc-a526ecdf-...34 30Gi RWO

原来的 hello-web-disk 仍然在那里,您现在可以看到在新的 Statefulset Pod 中为每个 Pod 创建的各个 PVC。

  1. 使用“kubectl describe”命令查看 StatefulSet 中第一个 PVC 的详细信息:
kubectl describe pvc hello-web-disk-statefulset-demo-0

点击“检查我的进度”以验证是否完成了以下目标: 创建包含 PVC 的 StatefulSet

任务 4. 验证永久性卷与 StatefulSet 管理的 Pod 之间的连接是否具有持久性

在此任务中,您将在停止并重启 Pod 时,验证 StatefulSet 中的 Pod 与特定 PV 的连接。

  1. 要验证 Pod 内的 PVC 可以访问,您必须获得对 Pod 的 Shell 访问权限。要启动 Shell 会话,可执行如下命令:
kubectl exec -it statefulset-demo-0 -- sh
  1. 确认 /var/www/html 目录中没有 index.html 文本文件:
cat /var/www/html/index.html
  1. 要在 Pod 中创建网页形式的简单文本消息,可输入以下命令:
echo Test webpage in a persistent volume!>/var/www/html/index.html chmod +x /var/www/html/index.html
  1. 确认该文本文件包含您的消息:
cat /var/www/html/index.html

输出:

Test webpage in a persistent volume!
  1. 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit
  1. 删除您从中更新了 PVC 上的文件的 Pod:
kubectl delete pod statefulset-demo-0
  1. 列出集群中的 Pod:
kubectl get pods

您将看到 StatefulSet 正自动重启 statefulset-demo-0 Pod。

注意:您需要等待 Pod 状态再次显示其正在运行。
  1. 在新的 statefulset-demo-0 Pod 上连接到 Shell:
kubectl exec -it statefulset-demo-0 -- sh
  1. 确认该文本文件仍然包含您的消息:
cat /var/www/html/index.html

输出:

Test webpage in a persistent volume!

StatefulSet 重启 Pod,并将现有的专用 PVC 重新连接到新的 Pod,从而确保该 Pod 的数据得以保留。

  1. 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit

结束实验

完成实验后,请点击结束实验。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。

系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交

星级数的含义如下:

  • 1 颗星 = 非常不满意
  • 2 颗星 = 不满意
  • 3 颗星 = 一般
  • 4 颗星 = 满意
  • 5 颗星 = 非常满意

如果您不想提供反馈,可以关闭该对话框。

如果要留言反馈、提出建议或做出更正,请使用支持标签页。

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

准备工作

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

使用无痕浏览模式

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

登录控制台

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

此内容目前不可用

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

太好了!

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

一次一个实验

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

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

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