简介
在本实验中,你将学习如何在 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 (PVC),用于从你在步骤 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 来请求存储空间,并修改了 PersistentVolumeClaim 以请求特定的存储资源。你还验证了即使容器被终止或迁移到另一个节点,数据依然能够持久保存在 PersistentVolume 上。


