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 是部署数据库、消息队列、文件服务的基础技能。

相关推荐
CappuccinoRose1 小时前
Docker配置过程完整梳理
后端·python·docker·容器·环境配置
没有bug.的程序员1 小时前
K8s 环境中的 JVM 调优实战
java·jvm·spring·云原生·容器·kubernetes
小毅&Nora1 小时前
【云计算】【Kubernetes】 ⑤ K8S网络深度解析:从 CNI 到 eBPF,Service 如何实现百万 QPS?
网络·kubernetes·云计算
easy_coder1 小时前
Argo 家族:云原生 CI/CD 的双剑合璧与协同之美
ci/cd·云原生·云计算
一条懒鱼66614 小时前
K8S-特殊容器
云原生·容器·kubernetes
❀͜͡傀儡师17 小时前
docker一键部署Flatnotes笔记工具
笔记·docker·容器
云计算小黄同学17 小时前
Java 服务从虚拟机迁移到 Kubernetes(K8s)集群
java·微服务·云原生·kubernetes
❀͜͡傀儡师17 小时前
docker一键部署夜莺监控
运维·docker·容器
xrkhy18 小时前
windows家庭版,D盘安装docker,下载大模型
windows·docker·容器