目录
Please enable Javascript to view the contents

K8s存储-概念与入门

 ·  ☕ 7 分钟

系列导航

本系列从 K8s 存储模型入手,逐步展开到 CSI 标准与云原生存储全景。

① 概念 → ② Volume 生命周期 → ③ CSI 架构 → ④ FlexVolume 演进 → ⑤ 对比 → ⑥ 排障 ‖ ⑦ 开发 → ⑧ 高级特性 → ⑨ 演进展望

顺序文章定位
本篇 - 概念与入门基础——K8s 存储模型、PV/PVC/StorageClass、Volume 分类树、CSI 标准概述
Volume 生命周期全解析全貌——两阶段处理(Attach+Mount)、动态/静态供应、Volume 流转路径
CSI 架构详解标准——gRPC 三服务、Sidecar 模式、External Components
FlexVolume 与 CSI 演进演进——FlexVolume 原理、CSI 设计思想、为什么 CSI 替代 FlexVolume
存储方案对比与选型选型——主流 CSI 插件横向对比 + 决策树
排障思路与常用命令运维——工具链 + 场景排查 + 性能
核心路径 ↑扩展展望 ↓
CSI 插件开发指南扩展——从零开发一个 CSI 插件
高级特性详解进阶——快照、克隆、扩容、拓扑感知
云原生存储演进与展望展望——容器原生存储、DPU 卸载、未来方向

重要

本文是系列地基,回答一个问题:K8s 怎么管理持久化存储,CSI 又是什么。

脉络按两条线索展开,在 Pod 怎么用上存储 处汇合:

  • 自底向上——找出问题:物理存储 → 文件系统 → K8s Volume → Pod 挂载 → 为什么需要 PV/PVC 抽象
  • 自顶向下——给出方案:K8s 存储模型 → PV/PVC/StorageClass → Volume 生命周期 → CSI 标准

先补齐 K8s 存储基础概念,再看 PV/PVC 体系解决什么问题,最后给出 CSI 标准的全貌。后续文章按 CSI 架构的枝叶逐一深入。


1. K8s 存储模型

1.1 容器为什么需要持久化存储

容器的设计原则是"无状态"——容器销毁后,容器文件系统内的数据随之消失。但现实中有大量应用需要持久化数据:

应用类型存储需求典型场景
数据库高 IOPS 块存储MySQL、PostgreSQL
消息队列持久化日志Kafka、RabbitMQ
分布式存储多 Pod 共享文件Ceph、GlusterFS
CI/CD构建缓存、制品仓库Jenkins、Nexus
AI 训练大容量数据集GPU 训练数据、模型权重

K8s 通过 Volume 机制解决容器持久化存储问题。Volume 是 Pod 的一部分,生命周期独立于容器——容器重启不丢失,Pod 删除才释放。

1.2 Volume:Pod 级别的存储声明

Volume 定义在 Pod 的 spec.volumes 字段中,容器通过 volumeMounts 挂载:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      hostPath:
        path: /data/html

K8s 内置约 20 种 Volume 类型:

类型说明典型场景
emptyDirPod 级临时目录,Pod 删除即消失同 Pod 多容器共享临时数据
hostPath挂载宿主机目录测试、节点级数据(不推荐生产)
nfsNFS 网络文件系统共享文件存储
iscsiiSCSI 块设备SAN 存储
cephfsCeph 文件系统分布式文件存储
rbdCeph RBD 块设备分布式块存储
configMap / secret配置数据注入配置文件、密钥
persistentVolumeClaim引用 PVC生产推荐方式

1.3 Volume 的局限:为什么需要 PV/PVC

直接在 Pod YAML 里声明 Volume 类型存在三个问题:

问题说明
开发与运维耦合开发人员需要在 Pod YAML 里指定存储类型(NFS? Ceph? iSCSI?),但存储基础设施应该由运维管理
无法动态分配所有 Volume 都需要运维提前准备好底层存储资源(NFS 目录、iSCSI LUN 等),不能按需自动创建
无法资源管理没有 IPAM 那样的统一分配机制,容易出现存储资源冲突和浪费

PV/PVC 体系就是为解决这些问题而设计的。


2. PV/PVC/StorageClass 体系

2.1 三个核心对象

对象职责谁创建
PersistentVolume (PV)描述一块具体的持久化存储资源(类型、容量、访问模式)运维人员或动态供应自动创建
PersistentVolumeClaim (PVC)描述 Pod 想要的存储属性(大小、权限、类型)开发人员
StorageClass (SC)描述存储"类"——哪个 CSI 插件、什么参数、动态供应策略运维人员

三者的关系类似"面向对象":

PVC = 接口(我要什么存储)
PV  = 实现(具体的存储资源)
SC  = 工厂(怎么自动生产 PV)

2.2 PV 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 10.244.1.4
    path: "/"

2.3 PVC 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

2.4 绑定机制

PVC 和 PV 的绑定由 PersistentVolumeController 控制循环完成。绑定条件:

条件说明
storageClassName 匹配PVC 和 PV 的 storageClassName 必须一致
accessModes 兼容PV 的访问模式必须满足 PVC 的要求
容量足够PV 的 capacity.storage >= PVC 的 requests.storage

绑定后,Pod 通过 volumes.persistentVolumeClaim.claimName 引用 PVC:

1
2
3
4
volumes:
  - name: data
    persistentVolumeClaim:
      claimName: nfs-pvc

2.5 AccessModes(访问模式)

模式缩写说明典型存储
ReadWriteOnceRWO单节点读写块存储(iSCSI、RBD)
ReadOnlyManyROX多节点只读NFS(只读挂载)
ReadWriteManyRWX多节点读写NFS、CephFS
ReadWriteOncePodRWOP单 Pod 读写(K8s 1.22+)块存储(更严格隔离)
块存储(RBD、EBS)通常只支持 RWO,文件存储(NFS、CephFS)支持 RWX。选型时 AccessModes 是第一个过滤条件。

3. StorageClass 与动态供应

3.1 静态供应 vs 动态供应

方式流程适用场景
静态供应运维手动创建 PV → 开发创建 PVC → 自动绑定已有存储资源(NFS 目录、LUN)
动态供应开发创建 PVC → StorageClass 自动创建 PV → 绑定云存储、分布式存储(按需分配)

3.2 StorageClass 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: csi.example.com/ssd
parameters:
  type: ssd
  replication: zonal
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

关键字段:

字段说明
provisionerCSI 插件名称(决定调用哪个 CSI 插件)
parameters传递给 CSI 插件的自定义参数
reclaimPolicyPV 删除后底层存储的处理方式(Delete / Retain
volumeBindingModeImmediate(立即绑定)/ WaitForFirstConsumer(等 Pod 调度后再绑定,用于拓扑感知)
allowVolumeExpansion是否允许在线扩容

3.3 动态供应流程

1. 开发创建 PVC(指定 StorageClass)
2. PersistentVolumeController 发现未绑定的 PVC
3. External Provisioner(Sidecar)监听 PVC,匹配 StorageClass 的 provisioner
4. External Provisioner 调用 CSI 插件的 ControllerCreateVolume
5. CSI 插件在后端存储系统创建卷,返回卷信息
6. External Provisioner 创建 PV 对象
7. PersistentVolumeController 将 PV 与 PVC 绑定
8. Pod 调度后,Kubelet 调用 CSI 插件执行 Attach + Mount

4. 存储分类树

K8s 的持久化存储方案可以从两个维度分类:

4.1 按存储接口分类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
K8s 存储方案
├── 内置 Volume 插件(K8s 代码内实现)
│   ├── hostPath / emptyDir(本地临时)
│   ├── nfs / iscsi / cephfs / rbd(网络存储)
│   └── configMap / secret / downwardAPI(配置数据)
├── FlexVolume(脚本式插件,已废弃)
│   └── 可执行文件放在宿主机固定路径,Kubelet 调用
└── CSI(Container Storage Interface,标准 gRPC 接口)
    ├── 块存储 CSI(Ceph RBD、EBS、vSphere)
    ├── 文件存储 CSI(NFS、CephFS、AzureFile)
    └── 对象存储 CSI(S3、MinIO)

4.2 按存储类型分类

类型特点AccessModes典型方案
块存储高性能、单节点独占、低延迟RWOCeph RBD、AWS EBS、vSphere VMDK
文件存储多节点共享、POSIX 兼容RWXNFS、CephFS、GlusterFS
对象存储HTTP API 访问、无限容量不适用(通过 SDK 访问)S3、MinIO、Ceph RGW

4.3 CSI 解决的三件事

CSI 标准本质上解决三件事:

职责说明gRPC 服务
创建/删除卷在后端存储系统上分配/回收存储空间Controller Service
挂载/卸载卷将卷 Attach 到节点、Mount 到 Pod 目录Node Service
身份信息报告插件名称、版本、支持的能力Identity Service

所有 CSI 插件的能力都可以归到这三个维度。后续文章按 CSI 架构的枝叶逐一深入。


5. CSI 与 CNI 的类比

如果读者已了解 CNI(Container Network Interface),可以通过类比快速理解 CSI:

维度CNICSI
解决什么Pod 网络连通性Pod 持久化存储
接口形式可执行文件(stdin/stdout)gRPC 服务
调用者Kubelet(通过 CRI)Kubelet + External Sidecar 组件
生命周期Pod 创建/销毁时调用卷创建/删除、Pod 调度/销毁时调用
核心操作分配 IP + 创建 veth + 配路由创建卷 + Attach 磁盘 + Mount 目录
标准制定者CNCFCNCF(CSI)/ Kubernetes SIG Storage
CNI 是"一次性调用"模型——Pod 创建时调用一次 ADD。CSI 是"多阶段调用"模型——先 ControllerCreateVolume,再 NodeStageVolume(Attach),最后 NodePublishVolume(Mount),每一步都可能跨节点。

6. 系列文章脉络

本文建立了 K8s 存储的基础概念。后续文章按以下脉络展开:

文章接续本文的哪个部分
② Volume 生命周期展开 §3.3 动态供应流程,详解 Attach/Mount 两阶段
③ CSI 架构展开 §4.3 CSI 三服务,详解 gRPC 接口和 Sidecar
④ FlexVolume 演进展开 §4.1 分类树中 FlexVolume → CSI 的历史
⑤ 对比选型基于分类树做横向比较和决策
⑥ 排障基于 Volume 生命周期做问题定位
⑦ 开发指南基于 CSI 架构写一个完整插件
⑧ 高级特性超出基本 CRUD 的能力(快照/克隆/扩容)
⑨ 演进展望CSI 之上的云原生存储趋势

参考链接

分享

Hex
作者
Hex
CloudNative Developer