PV、PVC 与 StorageClass 基础
[toc]
本文解决 Kubernetes 存储体系里最核心的一组概念问题:Volume、PV、PVC、StorageClass 到底是什么关系?静态供给和动态供给有什么区别?accessModes、Reclaim 策略、PVC 的 Pending 状态又该怎么理解和排查? 这些是每一个在 k8s 上跑有状态应用(MySQL、Redis、ES……)的人都绕不开的地基。
适合谁读:刚接触 k8s 存储、被一堆缩写(PV/PVC/SC/CSI)绕晕的初学者。本文以官方文档为纲,把概念逐个讲透,并配上三个可以直接跑的实战例子(hostPath 静态供给、NFS 动态供给、PVC 扩容)。偏生产级部署的内容(OpenEBS、NFS 搭建)见文末交叉引用的同目录笔记。
官方文档参考
| 页面 | 链接 |
|---|---|
| 持久卷(PersistentVolume) | https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/ |
| 存储类(StorageClass) | https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/ |
| 卷(Volumes,含 CSI 章节) | https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/ |
| 容器存储接口 CSI 介绍(kubernetes-csi 官网) | https://kubernetes-csi.github.io/docs/ |
| CSI GA 公告博客 | https://kubernetes.io/blog/2019/01/15/container-storage-interface-ga/ |
早期的中文页面 https://kubernetes.io/zh-cn/docs/concepts/storage/csi/ 已经 404,CSI 的内容被并入了卷(Volumes)文档的 csi 章节。CSI 生态(驱动列表、开发规范)的主站点是 https://kubernetes-csi.github.io/docs/ 。
相关笔记:同目录的 nfs共享存储 详细记录了 NFS 服务端搭建与 nfs-subdir-external-provisioner 的完整部署过程;OpenEBS 介绍了云原生本地存储方案。它们偏实战部署,本文补齐基础概念的地基。
1. 为什么 emptyDir 和 hostPath 不够
容器默认的文件系统是临时的:容器崩溃或重启后,kubelet 会用干净的镜像状态重建容器,运行期间写入的所有文件全部丢失。k8s 用 Volume 解决"容器重启数据丢失"和"多容器共享文件"两个问题,但不同 Volume 类型的"持久"程度差别巨大。
1.1 emptyDir:Pod 一死,数据全无
emptyDir 在 Pod 被调度到节点时创建,初始为空,Pod 内所有容器都可以读写。它的生命周期跟 Pod 绑定:
- 容器崩溃重启,emptyDir 数据还在(Pod 没死)
- Pod 被删除(不管是手动删、被 Deployment 重建、还是节点故障驱逐),emptyDir 连同数据一起永久删除
apiVersion: v1
kind: Pod
metadata:
name: test-emptydir
spec:
containers:
- image: nginx
name: web
volumeMounts:
- mountPath: /cache # emptyDir 挂载到容器的 /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {} # 空目录,存储在节点磁盘上