使用 PersistentVolumes 存储应用程序数据

KubernetesBeginner
立即练习

简介

在本实验中,你将学习如何在 Kubernetes 中使用 PersistentVolumes(持久卷)来存储应用程序数据。

PersistentVolumes (PV) 是 Kubernetes 中的一种资源,代表集群中一块网络存储。它们可以用于存储应用程序数据,且独立于容器的生命周期。这意味着即使容器被终止或迁移到另一个节点,数据依然可以被保留。

在本实验中,你将创建一个 PersistentVolume,并用它来存储一个简单 Web 应用程序的数据。随后,你将修改该应用程序,使其通过 PersistentVolumeClaim (PVC) 来访问 PersistentVolume。最后,你将修改 PVC 以请求特定的存储资源。

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个可以在本地机器上运行的轻量级 Kubernetes 环境。

  1. 进入工作目录

    打开终端并进入默认的项目文件夹:

    cd /home/labex/project
    
  2. 启动 Minikube

    启动 Minikube 以初始化 Kubernetes 集群:

    minikube start
    
    • 此命令会在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能的不同,Minikube 可能需要几分钟时间启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    
    • 查看 kubeletapiserver 等组件是否显示为 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

PVC 存储修改示例

使用以下命令将更新后的 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 上。