Kubernetes

Kubernetes 存储体系完整详解

·13 分钟阅读·4813 字
📋 目录

Kubernetes 存储体系完整详解

核心概念 K8s 将容器生命周期与数据解耦,通过 PV/PVC/CSI/StorageClass 屏蔽底层存储差异,实现持久化存储标准化。

1. 设计核心思想

  1. 容器生命周期与数据解耦
    Pod 随时销毁重建,容器内本地文件随 Pod 删除丢失,需要独立持久化存储载体保存业务数据。
  2. 存储抽象标准化
    通过 PV/PVC、CSI 屏蔽底层存储差异(本地盘、云盘、NAS、分布式存储),业务只需要声明存储需求,不用关心底层硬件。
  3. 两种存储分类
  • 临时存储:生命周期跟随 Pod,销毁数据丢失;
  • 持久化存储:独立于 Pod,Pod 删除数据保留。
  1. 两大核心模型
    静态存储(管理员手动创建 PV)、动态存储(StorageClass + CSI 自动创建 PV,生产主流)。

2. 第一部分:临时存储(非持久,数据易丢失)

2.1. EmptyDir

2.1.1. 特性

  1. Pod 创建自动生成空目录,Pod 删除数据彻底销毁;节点重启同样丢失;
  2. 同一个 Pod 内所有容器(业务+sidecar)共享读写;
  3. 支持内存模式 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. 核心关键字段

  1. capacity:存储容量;
  2. accessModes 访问模式(核心)
  • RWO ReadWriteOnce:单节点读写(云盘、本地SSD主流)
  • ROX ReadOnlyMany:多节点只读
  • RWX ReadWriteMany:多节点同时读写(NAS、共享存储)
  1. reclaimPolicy 回收策略
  • Retain(默认):删除 PVC 后 PV 保留,人工清理复用;
  • Delete:删除 PVC 自动销毁底层磁盘(云厂商CSI常用);
  • Recycle:已淘汰,清空数据回收;
  1. volumeMode
  • Filesystem:格式化文件系统挂载(默认)
  • Block:裸块设备,不格式化,直接透传给数据库;
  1. nodeAffinity:LocalPV 绑定指定节点,限制 Pod 只能调度到此机器。

4.2. PVC PersistentVolumeClaim

命名空间资源,业务侧的存储申请单
开发者只需要声明需要多大容量、读写模式,无需关心底层存储硬件。

4.2.1. 绑定规则

  1. 系统自动匹配同 storageClass、同 accessModes、容量满足的空闲 PV;
  2. 一对一独占绑定,一个 PVC 只能绑定一个 PV;绑定后不可共享。

4.3. 静态存储完整流程

  1. 运维提前手动创建 PV;
  2. 业务创建 PVC,自动匹配空闲 PV;
  3. Deployment/StatefulSet 挂载 PVC 启动 Pod;
  4. Pod 删除,PV 与数据保留;
  5. 删除 PVC,根据 reclaimPolicy 决定是否销毁底层存储。

4.3.1. 缺陷

大规模集群需要人工维护大量 PV,运维成本极高,现在极少使用。

5. 第四部分:动态存储体系 StorageClass + CSI(企业生产标准)

5.1. StorageClass 存储类

存储模板,定义存储供给规则,实现按需自动创建 PV,省去手动创建 PV。

5.1.1. 核心配置

  1. provisioner:CSI 驱动标识,对接底层存储;
  2. parameters:底层存储参数(磁盘类型、性能等级、副本数);
  3. allowVolumeExpansion:是否支持在线磁盘扩容;
  4. 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 核心优势

  1. 存储厂商解耦,一套标准适配云盘、本地盘、NAS;
  2. 支持高级能力:扩容、快照、克隆、存储拓扑、裸块设备;
  3. 驱动独立迭代,无需升级 K8s 内核。

5.3. 动态供给完整流程

  1. 集群部署 CSI 驱动、创建 StorageClass;
  2. 业务创建 PVC,指定 storageClassName;
  3. CSI Controller 感知 PVC,自动调用存储接口创建底层磁盘;
  4. 自动生成 PV 并与 PVC 绑定;
  5. Pod 挂载 PVC 使用;
  6. 删除 PVC,自动释放底层磁盘(reclaimPolicy=Delete)。

6. 第五部分:高性能本地存储 Local PV

6.1. 定位

宿主机本地 SSD/NVMe,提供极低延迟,专门用于 ES、Kafka、MySQL、Redis 等高性能中间件。

6.2. 两种模式

  1. 静态 LocalPV:运维预先将节点本地磁盘定义为 PV,绑定 nodeAffinity;
  2. 动态 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销毁丢失临时缓存、中转文件
HostPathRWO无,节点销毁丢失集群底层组件,业务禁用
LocalPV 本地SSDRWO极高需手动快照备份ES、Kafka、高性能数据库
云厂商CSI块盘RWO中高云厂商多副本通用有状态业务、单实例MySQL
NAS共享CSI存储RWX中等分布式多副本静态资源、日志存储、多Pod共享文件
对象存储MinIO/S3多节点读写分布式多副本备份、附件、离线数据集

10. 分层架构总结(从上到下)

  1. 临时层:EmptyDir、HostPath,数据不持久;
  2. 配置层:ConfigMap、Secret,只读配置载体,不存业务数据;
  3. 静态持久层:PV/PVC,人工提前创建磁盘,适合小规模集群;
  4. 动态自动化层:StorageClass + CSI,自动按需创建磁盘,企业标准方案;
  5. 高性能本地层:LocalPV,SSD低延迟,中间件专用;
  6. 有状态专属层:StatefulSet volumeClaimTemplates,每个实例独立PVC;
  7. 高级扩展层:快照、克隆、扩容、存储拓扑,依赖CSI驱动实现。

11. 生产环境避坑要点

  1. 业务禁止使用 HostPath,节点漂移数据永久丢失;
  2. RWO 单节点存储不要多副本调度到不同节点,会挂载冲突;
  3. LocalPV 必须配套定时快照备份,磁盘损坏无自动恢复能力;
  4. LocalPV 存储类必须配置 WaitForFirstConsumer,避免磁盘创建在无Pod节点;
  5. 有状态中间件一律使用 StatefulSet,禁止 Deployment 共享PVC;
  6. Secret 不适合存放超大文件,底层存储于节点内存;
  7. 数据库、ES 禁止使用 RWX 共享NAS,随机IO性能极差;
  8. 统一 StorageClass 回收策略为 Delete,避免大量僵尸PV占用存储资源。

12. 面试速记精简框架

  1. 临时存储:EmptyDir内存/磁盘、HostPath仅底层组件使用;
  2. 配置存储:ConfigMap明文、Secret加密密钥,只读挂载;
  3. PV/PVC:PV是真实存储卷,PVC是存储申请单,静态手动绑定;
  4. CSI+StorageClass:动态自动创建磁盘,主流生产方案,支持扩容快照;
  5. LocalPV:本地高性能SSD,适配中间件,单节点读写;
  6. StatefulSet volumeClaimTemplates:有状态服务自动生成独立PVC;
  7. 访问模式区分:RWO单节点、RWX多节点共享;
  8. CSI扩展能力:快照、克隆、在线扩容、存储拓扑感知。