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

相关推荐
天天喝旺仔3 小时前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
小马同学-5 小时前
crictl实战:K8s容器运行时排障工具
容器·k8s·crictl
富士康质检员张全蛋5 小时前
Kafka Connect-Standalone 模式
k8s
逐流人6 小时前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
kuroomi16 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
闲云自留地17 小时前
Containerd 进阶教程:命名空间 Namespace、私有仓库 Harbor、容器管理全流程
容器
闲云自留地19 小时前
Containerd 是什么?架构、插件与安装实践一次讲清
容器
运维开发王义杰21 小时前
跨项目直连数据库:是架构反模式,还是现实的工程妥协?
云原生
闲云野鹤在人间21 小时前
docker 入门 | 第7章 容器监控 和 第8章 容器日志 详解
运维·docker·容器·架构·云计算
闲云自留地1 天前
告别敲命令!DockerUI 与 Portainer 可视化容器管理实战
docker·容器