使用 PersistentVolumes 存储应用程序数据

KubernetesKubernetesIntermediate
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("`Delete`") kubernetes/BasicCommandsGroup -.-> kubernetes/edit("`Edit`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("`Exec`") subgraph Lab Skills kubernetes/initialization -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} kubernetes/get -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} kubernetes/create -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} kubernetes/delete -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} kubernetes/edit -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} kubernetes/apply -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} kubernetes/exec -.-> lab-9685{{"`使用 PersistentVolumes 存储应用程序数据`"}} end

启动 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/datavolumes 字段指定容器应使用名为 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 cat /usr/share/nginx/html/data/test.txt < pod-name > --

<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

在最后一行添加 allowVolumeExpansion: true 字段到 storageclass 中。

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 以从 PersistentVolume 请求存储,并修改了 PersistentVolumeClaim 以请求特定的存储资源。你还验证了即使容器终止或迁移到另一个节点,数据仍然会被持久化存储在 PersistentVolume 上。

您可能感兴趣的其他 Kubernetes 教程