Kubernetes Basics · 课时

持久卷与持久卷声明

了解如何使用持久卷和持久卷声明为 Pod 提供持久化存储。

第 3 / 4 课12 个步骤

持久卷与持久卷声明 是 CoddyKit 上的免费 Kubernetes Basics 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kubernetes Basics 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kubernetes Basics 课程共包含 4 节课。

Pod 与临时数据

Pod 会创建也会终止,但应用程序的数据通常需要继续保留。数据库或用户上传的文件就是例子。

  • 当 Pod 重启或被重新调度时,直接存储在其容器文件系统中的任何数据都会丢失。
  • 对于无状态应用程序来说,这种临时性没有问题,但关键数据需要持久化解决方案。
  • Kubernetes 提供了强大的系统来管理持久存储,使数据能够跨越 Pod 的生命周期持续存在。

PersistentVolume:集群存储

PersistentVolume (PV) 是 Kubernetes 集群中的一块存储。

  • 它是集群范围的资源,也就是说它不属于任何特定的命名空间。
  • PVs 可以由管理员预先配置,也可以由 StorageClass 动态配置。
  • 它们屏蔽了底层存储技术的具体细节(例如 Google Persistent Disk、AWS EBS、NFS 共享存储)。

定义 PersistentVolume

PVs 的定义包括容量、访问模式和存储类型等详细信息。以下 YAML 使用 hostPath 描述了一个包含 5 GB 存储的 PV(用于本地测试)。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-local-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: "/mnt/data"

注意:hostPath 通常用于单节点开发环境,不建议在生产环境中使用。

PersistentVolumeClaim:Pod 的存储请求

PersistentVolumeClaim (PVC) 是用户或应用程序在特定命名空间中提出的存储请求。

  • Pod 不会直接使用 PV,而是通过 PVC 请求存储。
  • PVC 受命名空间限制,因此存在于特定项目或团队的范围内。
  • 它们会指定所需的容量、访问模式,以及可选的存储类。

PV 与 PVC:自动匹配

Kubernetes 会通过称为绑定的过程,自动将 PVC 与可用的 PV 匹配起来。

  • 创建 PVC 时,Kubernetes 会查找满足 PVC 要求(容量、访问模式、存储类)的 PV。
  • 找到合适的 PV 后,二者会以一对一的关系进行“绑定”。
  • 这种绑定可以确保 PVC 获得其请求的特定存储。

PVs/PVCs 的访问模式

访问模式定义了存储可以如何挂载和供 Pod 使用。这些模式由 PVC 请求,并由 PV 提供支持:

  • ReadWriteOnce (RWO):卷可以由单个节点以读写方式挂载。
  • ReadOnlyMany (ROX):卷可以由多个节点以只读方式挂载。
  • ReadWriteMany (RWX):卷可以由多个节点以读写方式挂载。

具体支持哪些模式取决于所使用的存储提供商。

用于自动化的存储类

Storage Classes 为管理员提供了一种描述不同存储“类别”的方式(例如“fast-ssd”和“slow-hdd”)。

  • 无需手动创建 PV,PVC 请求存储类时,StorageClass 可以动态配置 PV。
  • 这会根据预定义的模板自动创建 PV。
  • 它将存储配置与存储使用分离开来,让用户使用起来更加方便。

创建 PVC 示例

让我们创建一个 PVC,请求 1 GB 存储并使用 ReadWriteOnce 访问模式。此 PVC 会查找现有 PV,或者通过 StorageClass 触发动态配置。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard # Optional: if you have a 'standard' StorageClass

将其保存为 pvc.yaml,然后使用 kubectl apply -f pvc.yaml 应用。

在 Pod 中使用 PVC

PVC 绑定后,Pod 可以在卷配置中引用 PVC 的名称来使用它。Pod 无需了解底层 PV,只需要知道 PVC。

apiVersion: v1
kind: Pod
metadata:
  name: my-data-pod
spec:
  containers:
    - name: data-container
      image: busybox
      command: ["/bin/sh", "-c", "echo 'Hello from CoddyKit!' > /mnt/data/hello.txt && sleep 3600"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /mnt/data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: my-app-pvc

此 Pod 会将文件写入挂载的持久卷。

监控 PVs 和 PVCs

您可以使用 kubectl 监控持久存储资源的状态:

  • 查看所有 PV:kubectl get pv
  • 查看命名空间中的所有 PVC:kubectl get pvc
  • 获取包括状态和事件在内的详细信息:
    • kubectl describe pv <pv-name>
    • kubectl describe pvc <pvc-name>

请确保您的 PVs 处于 Bound 状态,并且 PVCs 已绑定到正确的 PV。

了解 PV 与 PVC 的区别

用户想要部署一个需要 50GB 持久存储的数据库。哪个 Kubernetes 资源直接表示用户应用程序对该存储的请求?

持久存储总结

我们已经学习了 Kubernetes 如何为应用程序管理持久存储:

  • PersistentVolumes (PVs) 是集群资源,代表实际的存储。
  • PersistentVolumeClaims (PVCs) 是用户提出的存储请求。
  • Kubernetes 会根据要求将 PVC 绑定到合适的 PV。
  • 访问模式定义了存储的使用方式(RWO、ROX、RWX)。
  • Storage Classes 支持动态配置 PV,从而自动完成设置。

即使 Pod 不断创建和终止,该系统也能确保应用程序数据持续存在,为有状态应用程序提供可靠性。

免费开始

用 AI 导师学习 Kubernetes Basics — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
12
课程
48

常见问题解答

「持久卷与持久卷声明」课时是免费的吗?

是的 — 「持久卷与持久卷声明」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kubernetes Basics 课程的其余内容,请升级到 CoddyKit PRO。 Kubernetes Basics 课程共包含 4 节课。

「持久卷与持久卷声明」这节课中我会学到什么?

了解如何使用持久卷和持久卷声明为 Pod 提供持久化存储。 你通过在浏览器中直接运行的动手代码来练习 Kubernetes Basics,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kubernetes Basics 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kubernetes Basics 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「持久卷与持久卷声明」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kubernetes Basics 课中编写并运行代码吗?

能。每节 Kubernetes Basics 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 ConfigMaps 管理配置
  2. 用于敏感数据的密钥
  3. 持久卷与持久卷声明
  4. StorageClasses 与动态供给
← 返回 Kubernetes Basics