一提到 K8s 持久化存储,很多人第一反应是:“我不就想让 Pod 重启后数据别丢吗?怎么冒出来 PV、PVC、StorageClass、NFS 一堆名词?”
别慌,这套设计其实很简单:应用只管“我要什么”,集群负责“给你什么”,底层存储怎么来的、怎么分配的,尽量别让业务操心。
所以它们的关系可以理解成一条链:真实存储(NFS)→ 资源抽象(PV)→ 使用申请(PVC)→ 自动供给规则(StorageClass)。Pod 最终挂的是 PVC,但真正落到磁盘/共享目录上的,是 PV 指向的 NFS(或其他后端)。

一、每个角色到底在干嘛?

NFS:底层“真·存储”,K8s 只是拿来用

NFS 是一个网络文件共享服务,本质是把某台服务器上的目录共享出来,让别的机器也能挂载读写。它不是 K8s 原生组件,K8s 也不负责替你部署 NFS。
那它在 K8s 里为啥常见?因为它很符合一个刚需:多个 Pod、甚至多个节点同时读写同一份数据(RWX)。要共享目录?NFS 往往一把梭就能跑起来。

说白了:NFS 是“放数据的地方”,不是 K8s 的对象。

PV:把底层存储“翻译”成 K8s 能管理的资源

PV(PersistentVolume)是 K8s 的资源对象,而且是集群级的:不属于某个命名空间。
它做的事很像“存储名片”:把底层存储的信息写清楚——多大容量、什么访问模式、后端在哪里(比如 NFS 的 server + path)、回收策略是什么。

你可以这样理解:
**NFS 是一间仓库,PV 是仓库在 K8s 里的登记信息。**没有 PV,K8s 就很难用统一方式管理各种存储后端。

PVC:应用只提需求,不碰底层细节

PVC(PersistentVolumeClaim)是命名空间级资源,也就是业务方/运维在自己 namespace 里创建的东西。
PVC 不关心底层存储到底是 NFS、Ceph 还是云盘,它只表达需求:

  • 我要多大?

  • 我要什么访问模式?

  • 我希望用哪一类存储?(可通过 StorageClass 指定)

PVC 的价值就在“解耦”:应用只认 PVC,不直接认 PV,更不应该去写 NFS 地址。
不然今天用 NFS,明天换 Ceph,你不得全体 YAML 改一遍?那不就又回到“应用绑死基础设施”的老路了吗?

StorageClass:让“发 PV”这件事自动化

如果没有 StorageClass,很多时候你得先手工准备一堆 PV,让 PVC 去匹配绑定——小规模还能忍,集群一大就很折磨。
StorageClass 的出现,就是为了把这一步变成自动化:PVC 一提交,系统按规则自动创建合适的 PV(背后由 provisioner 完成,可能还会自动创建后端卷或 NFS 子目录)。

所以 StorageClass 更像什么?像“房源生成规则”:

  • 你指定用哪个 storageClassName

  • 系统按这个规则给你“现造一套房”(PV)

  • 然后再把 PVC 绑定上

一句话:StorageClass 解决的是“PV 从哪里来、怎么自动来”。

二、它们是怎么串起来工作的?按一条流程看最清楚

以 NFS 作为后端举个典型流程(静态供给也好、动态供给也好,最终都是这条逻辑):

先得有 NFS:管理员把 NFS 服务搭好,导出一个共享目录,节点能访问。要是 NFS 本身都没通,后面 PV/PVC 写得再漂亮也没用,这是不是很现实?

然后 K8s 得“认识”这块存储:

  • 静态方式:管理员手动创建 PV,把 NFS 的 server/path 写进 PV。

  • 动态方式:管理员创建 StorageClass(配好 NFS 的 provisioner 规则),让 PV 可以自动生成。

接着业务方只管提申请:创建 PVC,写清楚容量和访问模式,必要时指定 storageClassName。PVC 不写 NFS 地址,这是关键点——因为 PVC 的角色不是“指定后端”,而是“描述需求”。

K8s 会负责匹配并绑定:

  • 有现成 PV:PVC 直接绑定它

  • 没现成 PV 且指定了 StorageClass:系统自动创建 PV,再完成绑定

最后 Pod 挂载 PVC:Pod 里只出现 PVC 的名字,挂载进容器目录。容器里看起来像本地文件夹,但实际读写落到 NFS 共享目录上。

所以你会发现:
Pod → PVC → PV → NFS
Pod 永远不会直接操作 NFS,也不应该直接绑定 PV。它只挂 PVC,剩下的交给 K8s 去安排。

三、几个关键点,不提前说清楚就容易踩坑

PV 和 PVC 是一对一绑定。
一个 PV 被某个 PVC 绑定后,就不会再给别人用;一个 PVC 也只会绑定一个 PV。共享读写(RWX)靠的是后端存储(比如 NFS)支持多客户端挂载,不是靠“一个 PV 绑多个 PVC”。

PVC 和 NFS 没直接关系,间接使用才是重点。
很多新手喜欢在 PVC 里找 NFS 配置,找不到就以为 K8s “藏起来了”。其实不是藏,是设计上就不让你写:PVC 只谈需求,PV 才谈后端。

删 PVC 会不会删数据?别靠运气。
这取决于 PV 的回收策略(reclaimPolicy)。有的策略会保留(Retain),有的会跟着删除(Delete)。
你要是把“清理资源”当成常规操作,却没搞清楚回收策略,那数据被顺手清掉,谁背锅?

四、收尾总结:四者关系用一句人话讲明白

  • NFS:真正放数据的共享存储后端

  • PV:K8s 对底层存储的资源抽象(把 NFS 目录包装成可管理的“卷”)

  • PVC:应用对存储的申请(只描述需求,不碰后端细节)

  • StorageClass:让 PV 自动生成/自动分配的规则模板(动态供给核心)

你只要记住这条主线就够了:
应用只挂 PVC,K8s 用 PV 把真实存储对接起来,StorageClass 负责让这件事自动化,NFS 只是众多后端里最常见的一种。
不就是“需求—资源—后端—自动化规则”这套分工吗?想复杂都难。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐