概览
在此实验中,您将设置 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 项目及一组资源,它们都有固定的使用时限。
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
-
打开 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. 创建 PV 和 PVC
在此任务中,您将创建 PVC,它会触发 Kubernetes 自动创建 PV。
连接到实验 GKE 集群
- 在 Cloud Shell 中输入以下命令,为可用区和集群名称设置环境变量:
export my_region={{{project_0.default_region|Region}}}
export my_cluster=autopilot-cluster-1
- 为 kubectl 命令行工具配置 Tab 键自动补全功能:
source <(kubectl completion bash)
- 为 kubectl 配置对集群的访问权限:
gcloud container clusters get-credentials $my_cluster --region $my_region
创建并应用包含 PVC 的清单
在大多数情况下,您不需要直接配置 PV 对象或创建 Compute Engine 永久性磁盘。您可以改为创建 PVC,然后 Kubernetes 会自动为您预配永久性磁盘。
我们来创建一个名为 hello-web-disk
的 30 GB PVC,每次作为读写卷挂接到单个节点。
- 使用以下命令,通过 nano 创建并打开名为
pvc-demo.yaml
的文件:
nano pvc-demo.yaml
- 打开 nano 后,将以下内容粘贴到
pvc-demo.yaml
文件中:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hello-web-disk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
-
按 Ctrl+O 组合键,然后按 Enter 键,保存编辑好的文件。
-
按 Ctrl+X 组合键,退出 nano 文本编辑器。
-
要显示您目前没有 PVC,可执行以下命令:
kubectl get persistentvolumeclaim
输出:
No resources found in default namespace.
- 要创建 PVC,可执行以下命令:
kubectl apply -f pvc-demo.yaml
- 要显示您新创建的 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 和容器,这些文件也将保留下来。
- 使用以下命令,通过 nano 创建并打开名为
pod-volume-demo.yaml
的文件:
nano pod-volume-demo.yaml
- 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
-
按 Ctrl+O 组合键,然后按 Enter 键,保存编辑好的文件。
-
按 Ctrl+X 组合键,退出 nano 文本编辑器。
-
要创建包含卷的 Pod,请执行以下命令:
kubectl apply -f pod-volume-demo.yaml
- 列出集群中的 Pod:
kubectl get pods
输出:
NAME READY STATUS RESTARTS AGE
pvc-demo-pod 0/1 ContainerCreating 0 18s
如果您在创建 Pod 后快速执行此操作,那么在装载卷时,您会看到列出的状态为“ContainerCreating”,然后变成“Running”。
- 要验证 Pod 内的 PVC 可以访问,您必须获得对 Pod 的 Shell 访问权限。要启动 Shell 会话,可执行如下命令:
kubectl exec -it pvc-demo-pod -- sh
- 要在 Pod 中创建网页形式的简单文本消息,可输入以下命令:
echo Test webpage in a persistent volume!>/var/www/html/index.html
chmod +x /var/www/html/index.html
- 确认该文本文件包含您的消息:
cat /var/www/html/index.html
输出:
Test webpage in a persistent volume!
- 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit
测试 PV 的持久性
现在,您将从集群中删除 Pod,确认 PV 仍然存在,然后重新部署 Pod,并确认 PV 的内容仍然完整。
- 删除 pvc-demo-pod:
kubectl delete pod pvc-demo-pod
- 列出集群中的 Pod:
kubectl get pods
输出:
No resources found in default namespace.
该集群上应该没有 Pod。
- 要显示 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 时没有被删除。
- 重新部署 pvc-demo-pod:
kubectl apply -f pod-volume-demo.yaml
- 列出集群中的 Pod:
kubectl get pods
输出:
NAME READY STATUS RESTARTS AGE
pvc-demo-pod 1/1 Running 0 15s
Pod 将会部署,并且这次状态变成“Running”的速度更快,因为该 PV 已经存在,不需要创建。
- 要验证 Pod 内的 PVC 依然可以访问,您必须获得对 Pod 的 Shell 访问权限。要启动 Shell 会话,可执行如下命令:
kubectl exec -it pvc-demo-pod -- sh
- 要验证文本文件仍然包含您的消息,可执行以下命令:
cat /var/www/html/index.html
输出:
Test webpage in a persistent volume!
即使从集群中删除并重新创建了 Pod,永久性卷的内容也没有被移除。
- 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit
点击检查我的进度以验证是否完成了以下目标:
在 Pod 中装载并验证 Google Cloud 永久性磁盘 PVC
任务 3. 创建包含 PVC 的 StatefulSet
在此任务中,您将在 StatefulSet 中使用 PVC。StatefulSet 类似于部署,只是 Pod 被赋予了唯一标识符。
释放 PVC
- 在 Statefulset 中使用 PVC 之前,您必须删除当前使用它的 Pod。执行以下命令以删除 Pod:
kubectl delete pod pvc-demo-pod
- 确认 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
。
- 使用以下命令,通过 nano 创建并打开名为
statefulset-demo.yaml
的文件:
nano statefulset-demo.yaml
- 打开 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
-
按 Ctrl+O 组合键,然后按 Enter 键,保存编辑好的文件。
-
按 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 连接
- 使用“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
- 列出集群中的 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
- 要列出 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。
- 使用“kubectl describe”命令查看 StatefulSet 中第一个 PVC 的详细信息:
kubectl describe pvc hello-web-disk-statefulset-demo-0
点击“检查我的进度”以验证是否完成了以下目标:
创建包含 PVC 的 StatefulSet
任务 4. 验证永久性卷与 StatefulSet 管理的 Pod 之间的连接是否具有持久性
在此任务中,您将在停止并重启 Pod 时,验证 StatefulSet 中的 Pod 与特定 PV 的连接。
- 要验证 Pod 内的 PVC 可以访问,您必须获得对 Pod 的 Shell 访问权限。要启动 Shell 会话,可执行如下命令:
kubectl exec -it statefulset-demo-0 -- sh
- 确认
/var/www/html
目录中没有 index.html
文本文件:
cat /var/www/html/index.html
- 要在 Pod 中创建网页形式的简单文本消息,可输入以下命令:
echo Test webpage in a persistent volume!>/var/www/html/index.html
chmod +x /var/www/html/index.html
- 确认该文本文件包含您的消息:
cat /var/www/html/index.html
输出:
Test webpage in a persistent volume!
- 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit
- 删除您从中更新了 PVC 上的文件的 Pod:
kubectl delete pod statefulset-demo-0
- 列出集群中的 Pod:
kubectl get pods
您将看到 StatefulSet 正自动重启 statefulset-demo-0
Pod。
注意:您需要等待 Pod 状态再次显示其正在运行。
- 在新的
statefulset-demo-0
Pod 上连接到 Shell:
kubectl exec -it statefulset-demo-0 -- sh
- 确认该文本文件仍然包含您的消息:
cat /var/www/html/index.html
输出:
Test webpage in a persistent volume!
StatefulSet 重启 Pod,并将现有的专用 PVC 重新连接到新的 Pod,从而确保该 Pod 的数据得以保留。
- 输入以下命令,退出 nginx 容器上的交互式 Shell:
exit
结束实验
完成实验后,请点击结束实验。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。
系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交。
星级数的含义如下:
- 1 颗星 = 非常不满意
- 2 颗星 = 不满意
- 3 颗星 = 一般
- 4 颗星 = 满意
- 5 颗星 = 非常满意
如果您不想提供反馈,可以关闭该对话框。
如果要留言反馈、提出建议或做出更正,请使用支持标签页。
版权所有 2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。