介绍
在本实验中,你将学习如何在 Kubernetes 中使用持久卷(PersistentVolumes)来存储应用程序数据。
PersistentVolumes(PV)是 Kubernetes 资源,代表集群中的一块网络存储。它们可以用于独立于容器生命周期的方式存储应用程序数据。这意味着即使容器被终止或迁移到另一个节点,数据依然能够得到保留。
在本实验中,你将创建一个 PersistentVolume,并用它来存储来自简单 Web 应用程序的数据。接着,你将修改应用程序,使其使用 PersistentVolumeClaim(PVC)来访问该 PersistentVolume。最后,你将修改 PVC 以请求特定的存储资源。
启动 Minikube 集群
在创建资源之前,你需要一个运行中的 Kubernetes 集群。Minikube 是一个运行在本地机器上的轻量级 Kubernetes 环境。
导航至工作目录:
打开终端并进入默认的项目文件夹:
cd /home/labex/project启动 Minikube:
启动 Minikube 来初始化一个 Kubernetes 集群:
minikube start- 此命令会在你的本地机器上设置一个单节点的 Kubernetes 集群。
- 根据你系统的性能,Minikube 可能需要几分钟才能启动完成。
验证 Minikube 是否在运行:
检查 Minikube 集群的状态:
minikube status- 检查诸如
kubelet和apiserver等组件的状态是否显示为Running。 - 如果集群未运行,请重新执行
minikube start。
- 检查诸如
如果在启动 Minikube 时遇到问题,如有必要,可以使用 minikube delete 重置环境。
创建 PersistentVolume
在此步骤中,你将创建一个可用于存储数据的 PersistentVolume。你需要创建一个名为 pv.yaml 的 YAML 文件,内容如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/data
该文件创建了一个容量为 1Gi、访问模式为 ReadWriteOnce 的 PersistentVolume。hostPath 字段指定数据将存储在宿主机上的 /mnt/data 路径。persistentVolumeReclaimPolicy 字段设置为 Retain(保留),这意味着即使 PersistentVolume 被删除,数据也会被保留。
使用以下命令将 PersistentVolume 应用到你的集群中:
kubectl apply -f pv.yaml
部署一个简单的 Web 应用程序
在此步骤中,你将部署一个简单的 Web 应用程序,它会将数据存储你在步骤 1 中创建的 PersistentVolume 上。你需要创建一个名为 web-app.yaml 的 YAML 文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 1
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html/data
volumes:
- name: data
persistentVolumeClaim:
claimName: my-pvc
此文件创建了一个包含一个副本的 Deployment 以及一个运行 nginx 镜像的容器。volumeMounts 字段指定容器应将 PersistentVolume 挂载到 /usr/share/nginx/html/data 路径。volumes 字段指定容器应使用名为 my-pvc 的 PersistentVolumeClaim。
使用以下命令将该 Deployment 应用到你的集群中:
kubectl apply -f web-app.yaml
创建 PersistentVolumeClaim
在此步骤中,你将创建一个 PersistentVolumeClaim,用于向你在步骤 1 中创建的 PersistentVolume 请求存储空间。你需要创建一个名为 pvc.yaml 的 YAML 文件,内容如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
此文件创建了一个访问模式为 ReadWriteOnce 的 PersistentVolumeClaim,并向 PersistentVolume 请求 500Mi 的存储空间。
使用以下命令将 PersistentVolumeClaim 应用到你的集群中:
kubectl apply -f pvc.yaml
验证数据持久性
在此步骤中,你将验证数据是否已经持久化存储在 PersistentVolume 上。你将访问运行在容器中的 Web 应用程序,并向 PersistentVolume 写入一些数据。
首先,运行以下命令查找运行你应用程序的 Pod 名称:
kubectl get pods -l app=web-app
你应该能看到一个运行你应用程序的 Pod。请记下该 Pod 的名称。
接下来,运行以下命令在运行应用程序的容器中打开一个 Shell 会话:
kubectl exec -it pod-name -- /bin/sh
将 pod-name 替换为你刚才记下的 Pod 名称。
进入 Shell 会话后,运行以下命令添加一个 test.txt 文件:
echo "This is a test file." > /usr/share/nginx/html/data/test.txt
此命令在 PersistentVolume 的数据目录中创建一个名为 test.txt 的文件,内容为 "This is a test file."。
使用以下命令删除该 Web 应用程序:
kubectl delete deployment web-app
使用以下命令重新创建该 Web 应用程序:
kubectl apply -f web-app.yaml
使用以下命令验证你在数据目录中创建的文件是否仍然存在:
kubectl get pods -l app=web-app
kubectl exec pod-name -- cat /usr/share/nginx/html/data/test.txt
将 pod-name 替换为你刚才记下的 Pod 名称。
修改 PVC 存储资源
在此步骤中,你将修改 PVC 以从 PersistentVolume 请求特定的存储资源。你将修改 pvc.yaml 文件,将存储请求从 500Mi 改为 1Gi。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
在最后一行的存储类(storageclass)中添加 allowVolumeExpansion: true 字段。
kubectl edit storageclass standard

使用以下命令将更新后的 PersistentVolumeClaim 应用到你的集群中:
kubectl delete deployment web-app
kubectl delete pvc my-pvc
kubectl apply -f web-app.yaml
kubectl apply -f pvc.yaml
总结
在本实验中,你学习了如何在 Kubernetes 中使用 PersistentVolumes 存储应用程序数据。你创建了一个 PersistentVolume,部署了一个使用该 PersistentVolume 的简单 Web 应用程序,创建了 PersistentVolumeClaim 来向 PersistentVolume 请求存储,并修改了 PersistentVolumeClaim 以请求特定的存储资源。你还验证了即使容器被终止或迁移到另一个节点,数据依然能够持久保存在 PersistentVolume 上。


