Kubernetes 中的 StorageClass 是什么?
发布: (2026年2月26日 GMT+8 19:49)
5 分钟阅读
原文: Dev.to
Source: Dev.to
存储流程的原理
在 Kubernetes 中,存储链路如下:
Pod → PVC → StorageClass → PV → Physical Storage
持久卷(PV)
PV 代表集群内部的真实磁盘资源。该资源可以是以下之一:
- 节点上的本地磁盘
- NFS 共享
- 云磁盘
- 分布式存储
也就是说,PV 就是存储本身。
持久卷声明(PVC)
PVC 是应用对磁盘的需求。例如:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: fast-storage
PVC 并不会创建磁盘;它仅仅是请求一块磁盘。
StorageClass 是什么?
StorageClass 是在创建 PVC 时决定磁盘如何被提供的策略层。例如:
- 磁盘是本地的、NFS 还是云块存储?
- 是否自动创建?
- 使用哪种性能等级?
静态 vs 动态供给
静态供给(Static Provisioning)
- 手动创建 PV。
- 先定义存储资源,然后将 PVC 绑定到该 PV。
- 提供更高的可控性,但每次需要新磁盘时都要手动操作。
- 通常在测试环境或本地/NFS 部署中使用。
动态供给(Dynamic Provisioning)
- 只创建 PVC。
- 与之关联的 StorageClass 会在后台自动创建合适的 PV 并绑定到 PVC。
- 该过程依赖 CSI(容器存储接口)驱动实现。
- 在生产环境中常被采用;更自动化且易于扩展。
磁盘实际位于哪里?
这个问题的答案在 PV 的定义中。
本地 PV
如果 PV 指向某个路径,例如 /mnt/k8s/data,则磁盘位于节点本地。节点故障时数据可能会丢失;如果 Pod 被调度到其他节点,则无法访问该磁盘。
NFS
nfs:
server: 192.168.1.10
path: /srv/nfs/share
磁盘位于 NFS 服务器上。无论 Pod 运行在哪个节点,都可以访问相同的数据。
云存储
如果 PV 绑定到云卷,则磁盘位于云提供商侧。
访问模式(Access Modes)
- ReadWriteOnce (RWO) – 只能被单个节点写入。
- ReadWriteMany (RWX) – 可被多个节点写入。
- ReadOnlyMany (ROX) – 可被多个节点只读访问。
回收策略(Reclaim Policy)
决定 PVC 被删除后磁盘如何处理。Kubernetes 中有三种回收策略(其中一种已废弃):
- Retain – 即使 PVC 被删除,PV 及其内部数据仍被保留。
- Delete – 删除 PVC 时,同时删除 PV 和其背后的存储资源。
- Recycle(已废弃) – 简单清理 PV 中的数据,使其可以再次使用。
示例:MariaDB 与 PostgreSQL 数据存放在哪里?
MariaDB
- 默认数据目录:
/var/lib/mysql - 如果未配置持久化,该目录位于容器文件系统上;Pod 被删除时数据会丢失。
- 开启持久化后,这个路径会通过
volumeMount绑定到 PVC:PVC → PV → Physical storage。即使 Pod 被删除,数据仍然保留。
kubectl describe pod <pod-name>
使用上述命令可以查看挂载的路径。
PostgreSQL
- 默认数据目录:
/var/lib/postgresql/data - 原理与 MariaDB 相同。若没有持久化,数据是临时的;若有持久化,则该目录会挂载到 PVC,实际磁盘由 PV 管理。
如何找到真实磁盘位置?
# 查找 PVC
kubectl get pvc -n <namespace>
# 查看绑定的 PV
kubectl describe pvc <pvc-name>
# 查看 PV 详细信息
kubectl describe pv <pv-name>
通过这些命令可以判断 PV 是本地路径、NFS 服务器、云卷还是分布式存储。真实磁盘位置在 PV 的定义中说明。