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

相关推荐
人间凡尔赛5 分钟前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
成为你的宁宁7 分钟前
【K8s HPA 水平扩缩容】
kubernetes·hpa
欢醉37 分钟前
k8s调度容器失败The node had condition: [DiskPressure]
kubernetes·springcloud
Linux-187410 小时前
分布式链路追踪系统之docker-compose安装skywalking
云原生·docker-compose·skywalking·分布式链路追踪系统·应用程序性能监控
生活爱好者!16 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
隔窗听雨眠16 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
Hui Baby17 小时前
K8S使用CRD和控制器简单应用
云原生·容器·kubernetes
阿里云云原生18 小时前
从“告警驱动”到“巡检驱动”:Agent 智能体如何实现前端体验治理的闭环?
云原生
AOwhisky20 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
AOwhisky20 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko