Kubernetes 学习总结(47)—— Kubernetes 持久化存储之 Volume、PV、PVC、StorageClass 到底怎么用?

1、为什么容器需要持久化存储?

Kubernetes 中的 Pod 是短暂的、易变的:

  • 重建 → 目录重置
  • 调度到新节点 → 本地文件丢失
  • 版本升级 → 数据不保证存在

这意味着:

⛔ 写入容器本地 /data 目录的文件无法在 Pod 重启后保留。

✔ 必须使用 Kubernetes Volume 或 PV/PVC/SC 来实现真正的持久化。

2、Volume:最基础的存储单元

Volume 是挂载到 Pod 里的目录,生命周期跟随 Pod。常用 Volume 类型:

Volume 只是"挂载点",并不解决持久化的全生命周期管理。

3、PV(PersistentVolume):集群级资源

PV 是集群管理员提供的"存储池",类似:

  • 云盘(EBS、阿里云 ESSD)
  • NAS 文件系统
  • Ceph RBD
  • NFS 共享目录

PV 有两种提供方式:

  • 静态供应(Static Provisioning):管理员手动创建 PV
  • 动态供应(Dynamic Provisioning):依赖 StorageClass 自动创建

PV 是真正的数据实体资源:

bash 复制代码
apiVersion: v1
kind:PersistentVolume
metadata:
name:pv-nfs
spec:
capacity:
    storage:10Gi
accessModes:
    -ReadWriteMany
nfs:
    path:/data
    server:10.0.0.10

4、PVC(PersistentVolumeClaim):用户对存储的需求声明

PVC 类似"申请单":"我要一个 10Gi 的磁盘,需要 ReadWriteOnce"。系统会自动寻找合适的 PV 并绑定:

bash 复制代码
apiVersion: v1
kind:PersistentVolumeClaim
metadata:
name:data-claim
spec:
accessModes:
    -ReadWriteOnce
resources:
    requests:
      storage: 10Gi

绑定后,Pod 就可以挂载该 PVC。

5、StorageClass:动态供应的关键

如果你不想管理员手动创建 PV,那么 StorageClass 就是"自动化工厂"。常见的 Provisioner:

典型 SC 示例:

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_ssd
reclaimPolicy: Retain

当 PVC 指定:

复制代码
storageClassName: fast-ssd

Kubernetes 会自动创建 PV → 绑定 PVC → 挂载到 Pod,完全自动化。

6、三者关系,一张图搞懂

bash 复制代码
           用户(开发者)
                 │ 申请
                 ▼
        PVC(需求声明:我要多大?什么模式?)
                 │ 匹配/动态创建
                 ▼
     PV(实际卷:NFS、云盘、Ceph、NAS)
                 │ 与 Pod 挂载
                 ▼
      Pod(业务容器读取/写入数据)

如果启用了 StorageClass:PVC → 自动创建 PV → 挂载到 Pod,实现按需分配。

一句话概括:Pod 用 PVC,PVC 找 PV,PV 由 StorageClass 自动创建。

7、实战示例:Pod 挂载持久化卷

bash 复制代码
apiVersion: v1
kind:Pod
metadata:
name:app
spec:
containers:
-name:web
    image:nginx
    volumeMounts:
    -mountPath:"/usr/share/nginx/html"
      name:html-volume
volumes:
-name:html-volume
    persistentVolumeClaim:
      claimName: data-claim

Pod 删除后,数据依然在 PV 中保留。

8、关键参数与最佳实践

AccessModes

ReclaimPolicy

  • Retain(保留数据,最安全)
  • Delete(PVC 删除后自动清理 PV)
  • Recycle(已废弃)

最佳实践

✔ 生产优先使用 CSI 插件

✔ 建议 RWX 使用 NAS / CephFS,RWO 使用云盘

✔ 强调 StorageClass 实现自动化供应

✔ 严禁生产使用 hostPath

9、总结

Kubernetes 持久化存储是 Stateful 应用落地的关键,三者关系可以总结为:

  • Volume:挂载目录
  • PV:实际存储资源
  • PVC:用户申请
  • StorageClass:自动创建 PV 的工厂

理解 PV/PVC/SC 是部署数据库、消息队列、文件服务的基础技能。

相关推荐
架构师老Y1 小时前
008、容器化部署:Docker与Python应用打包
python·容器·架构
w6100104663 小时前
cka-2026-cri-dockerd
运维·k8s·cka
handsomestWei5 小时前
Docker引擎API接入配置
运维·http·docker·容器·api
键盘鼓手苏苏7 小时前
Kubernetes与GitOps高级实践
云原生·kubernetes·k8
不是书本的小明8 小时前
K8S应用优化方向
网络·容器·kubernetes
andeyeluguo10 小时前
docker总结
运维·docker·容器
SuAluvfy10 小时前
从 0 到 1:在 Windows + Docker 环境下搭建 NextChat 并接入多模型 API(踩坑实录)
docker·容器
九英里路10 小时前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串
Aray123410 小时前
论Serverless架构模式及其应用实践
云原生·架构·serverless
AI攻城狮11 小时前
OpenClaw 本地内存检索与 node-llama-cpp 的依赖关系深度解析
人工智能·云原生·aigc