Kubernetes 存储体系完整详解
核心概念 K8s 将容器生命周期与数据解耦,通过 PV/PVC/CSI/StorageClass 屏蔽底层存储差异,实现持久化存储标准化。
1. 设计核心思想
- 容器生命周期与数据解耦
Pod 随时销毁重建,容器内本地文件随 Pod 删除丢失,需要独立持久化存储载体保存业务数据。 - 存储抽象标准化
通过 PV/PVC、CSI 屏蔽底层存储差异(本地盘、云盘、NAS、分布式存储),业务只需要声明存储需求,不用关心底层硬件。 - 两种存储分类
- 临时存储:生命周期跟随 Pod,销毁数据丢失;
- 持久化存储:独立于 Pod,Pod 删除数据保留。
- 两大核心模型
静态存储(管理员手动创建 PV)、动态存储(StorageClass + CSI 自动创建 PV,生产主流)。
2. 第一部分:临时存储(非持久,数据易丢失)
2.1. EmptyDir
2.1.1. 特性
- Pod 创建自动生成空目录,Pod 删除数据彻底销毁;节点重启同样丢失;
- 同一个 Pod 内所有容器(业务+sidecar)共享读写;
- 支持内存模式
medium: Memory,数据存内存,速度快,占用容器内存配额。
2.1.2. 使用场景
日志中转缓存、sidecar 与业务共享临时文件、计算中间缓存。
2.1.3. 缺点
无法持久化,不能存放业务数据。
volumes:
- name: tmp-cache
emptyDir:
medium: Memory
sizeLimit: 2Gi
2.2. HostPath
2.2.1. 特性
直接挂载宿主机真实目录到容器;
Pod 删除数据保留,但节点销毁、Pod 漂移到其他节点数据直接丢失。
2.2.2. 风险
权限过高存在容器逃逸风险,多节点调度数据不一致。
2.2.3. 适用范围
仅集群底层组件使用(calico、node-exporter、kubelet),业务禁止使用。
3. 第二部分:只读配置存储(ConfigMap & Secret)
不属于业务数据存储,用于注入静态配置、密钥,只读挂载。
3.1. ConfigMap
存放明文配置:配置文件、环境变量、启动参数;
更新后不会自动热加载,需要滚动重启 Pod 生效。
3.2. Secret
数据底层 Base64 编码,存放敏感数据:数据库密码、镜像仓库凭证、SSL 证书;
数据存节点内存,不落地磁盘,不适合大容量文件。
3.3. 挂载特点
两者均为只读,无法写入业务持久化数据,仅做配置分发。
4. 第三部分:持久化基础模型 PV & PVC(静态存储)
4.1. PV PersistentVolume
集群级资源对象,代表一块真实存储介质(本地盘、云块盘、NAS),生命周期独立于 Pod。
4.1.1. 核心关键字段
capacity:存储容量;accessModes访问模式(核心)
RWO ReadWriteOnce:单节点读写(云盘、本地SSD主流)ROX ReadOnlyMany:多节点只读RWX ReadWriteMany:多节点同时读写(NAS、共享存储)
reclaimPolicy回收策略
- Retain(默认):删除 PVC 后 PV 保留,人工清理复用;
- Delete:删除 PVC 自动销毁底层磁盘(云厂商CSI常用);
- Recycle:已淘汰,清空数据回收;
volumeMode
- Filesystem:格式化文件系统挂载(默认)
- Block:裸块设备,不格式化,直接透传给数据库;
nodeAffinity:LocalPV 绑定指定节点,限制 Pod 只能调度到此机器。
4.2. PVC PersistentVolumeClaim
命名空间资源,业务侧的存储申请单。
开发者只需要声明需要多大容量、读写模式,无需关心底层存储硬件。
4.2.1. 绑定规则
- 系统自动匹配同 storageClass、同 accessModes、容量满足的空闲 PV;
- 一对一独占绑定,一个 PVC 只能绑定一个 PV;绑定后不可共享。
4.3. 静态存储完整流程
- 运维提前手动创建 PV;
- 业务创建 PVC,自动匹配空闲 PV;
- Deployment/StatefulSet 挂载 PVC 启动 Pod;
- Pod 删除,PV 与数据保留;
- 删除 PVC,根据 reclaimPolicy 决定是否销毁底层存储。
4.3.1. 缺陷
大规模集群需要人工维护大量 PV,运维成本极高,现在极少使用。
5. 第四部分:动态存储体系 StorageClass + CSI(企业生产标准)
5.1. StorageClass 存储类
存储模板,定义存储供给规则,实现按需自动创建 PV,省去手动创建 PV。
5.1.1. 核心配置
provisioner:CSI 驱动标识,对接底层存储;parameters:底层存储参数(磁盘类型、性能等级、副本数);allowVolumeExpansion:是否支持在线磁盘扩容;volumeBindingMode
- Immediate:创建 PVC 立刻创建磁盘;
- WaitForFirstConsumer:延迟绑定,Pod 调度到节点后再创建盘(LocalPV、多可用区必备)。
5.2. CSI 容器存储接口(统一标准驱动层)
Container Storage Interface,统一存储标准,淘汰老旧内核内置驱动,分为两大组件:
5.2.1. (1)CSI Controller(控制面 Deployment)
全局管理存储生命周期:创建/删除磁盘、快照、克隆、在线扩容、跨可用区调度;对接云厂商/分布式存储API。
5.2.2. (2)CSI Node(DaemonSet,每节点一个)
节点侧执行挂载、卸载、磁盘格式化;Pod 调度到节点后完成存储挂载动作。
5.2.3. CSI 核心优势
- 存储厂商解耦,一套标准适配云盘、本地盘、NAS;
- 支持高级能力:扩容、快照、克隆、存储拓扑、裸块设备;
- 驱动独立迭代,无需升级 K8s 内核。
5.3. 动态供给完整流程
- 集群部署 CSI 驱动、创建 StorageClass;
- 业务创建 PVC,指定 storageClassName;
- CSI Controller 感知 PVC,自动调用存储接口创建底层磁盘;
- 自动生成 PV 并与 PVC 绑定;
- Pod 挂载 PVC 使用;
- 删除 PVC,自动释放底层磁盘(reclaimPolicy=Delete)。
6. 第五部分:高性能本地存储 Local PV
6.1. 定位
宿主机本地 SSD/NVMe,提供极低延迟,专门用于 ES、Kafka、MySQL、Redis 等高性能中间件。
6.2. 两种模式
- 静态 LocalPV:运维预先将节点本地磁盘定义为 PV,绑定 nodeAffinity;
- 动态 LocalPV + StorageClass:搭配 WaitForFirstConsumer,Pod 调度到节点自动匹配空闲本地盘。
6.3. 短板
仅支持 RWO,Pod 漂移到其他节点无法复用原有磁盘,必须配套定时快照备份数据。
7. 第六部分:有状态应用专属 StatefulSet + volumeClaimTemplates
7.1. 解决痛点
Deployment 所有 Pod 共用一套 PVC,多实例有状态服务每个 Pod 需要独立隔离数据盘。
7.2. 工作原理
volumeClaimTemplates 是 PVC 模板,StatefulSet 控制器为每一个有序 Pod 自动生成独立 PVC:
- sts-0 → data-sts-0
- sts-1 → data-sts-1
每个 Pod 独占一块 PV,数据完全隔离;Pod 删除重建,依旧绑定原有 PVC,数据不会丢失。
7.3. 适用中间件
MySQL、PostgreSQL、Redis集群、Kafka、Elasticsearch。
8. CSI 高级扩展存储能力(配套CRD资源)
8.1. VolumeSnapshot 存储快照
对 PV 生成时间点快照,用于数据备份、故障回滚;快照独立生命周期,支持跨集群恢复。
8.2. 卷克隆 Clone
基于已有快照快速复制完整数据磁盘,快速复制生产环境做测试。
8.3. 在线扩容
StorageClass 开启 allowVolumeExpansion,仅修改 PVC 容量即可在线扩容磁盘,无需重启业务 Pod。
8.4. 存储拓扑 Topology
多可用区集群,CSI 感知节点 AZ,PV 创建在 Pod 所在可用区,避免跨AZ挂载失败。
8.5. Block 裸块设备
volumeMode: Block,不格式化文件系统,裸盘透传,数据库原生裸设备优化性能。
9. 主流存储介质选型对比
| 存储类型 | 读写模式 | 性能 | 数据自愈 | 适用场景 |
| EmptyDir / Memory | 本地读写 | 极高 | 无,Pod销毁丢失 | 临时缓存、中转文件 |
| HostPath | RWO | 高 | 无,节点销毁丢失 | 集群底层组件,业务禁用 |
| LocalPV 本地SSD | RWO | 极高 | 需手动快照备份 | ES、Kafka、高性能数据库 |
| 云厂商CSI块盘 | RWO | 中高 | 云厂商多副本 | 通用有状态业务、单实例MySQL |
| NAS共享CSI存储 | RWX | 中等 | 分布式多副本 | 静态资源、日志存储、多Pod共享文件 |
| 对象存储MinIO/S3 | 多节点读写 | 低 | 分布式多副本 | 备份、附件、离线数据集 |
10. 分层架构总结(从上到下)
- 临时层:EmptyDir、HostPath,数据不持久;
- 配置层:ConfigMap、Secret,只读配置载体,不存业务数据;
- 静态持久层:PV/PVC,人工提前创建磁盘,适合小规模集群;
- 动态自动化层:StorageClass + CSI,自动按需创建磁盘,企业标准方案;
- 高性能本地层:LocalPV,SSD低延迟,中间件专用;
- 有状态专属层:StatefulSet volumeClaimTemplates,每个实例独立PVC;
- 高级扩展层:快照、克隆、扩容、存储拓扑,依赖CSI驱动实现。
11. 生产环境避坑要点
- 业务禁止使用 HostPath,节点漂移数据永久丢失;
- RWO 单节点存储不要多副本调度到不同节点,会挂载冲突;
- LocalPV 必须配套定时快照备份,磁盘损坏无自动恢复能力;
- LocalPV 存储类必须配置
WaitForFirstConsumer,避免磁盘创建在无Pod节点; - 有状态中间件一律使用 StatefulSet,禁止 Deployment 共享PVC;
- Secret 不适合存放超大文件,底层存储于节点内存;
- 数据库、ES 禁止使用 RWX 共享NAS,随机IO性能极差;
- 统一 StorageClass 回收策略为 Delete,避免大量僵尸PV占用存储资源。
12. 面试速记精简框架
- 临时存储:EmptyDir内存/磁盘、HostPath仅底层组件使用;
- 配置存储:ConfigMap明文、Secret加密密钥,只读挂载;
- PV/PVC:PV是真实存储卷,PVC是存储申请单,静态手动绑定;
- CSI+StorageClass:动态自动创建磁盘,主流生产方案,支持扩容快照;
- LocalPV:本地高性能SSD,适配中间件,单节点读写;
- StatefulSet volumeClaimTemplates:有状态服务自动生成独立PVC;
- 访问模式区分:RWO单节点、RWX多节点共享;
- CSI扩展能力:快照、克隆、在线扩容、存储拓扑感知。