1. 存储基础:K8s存储体系架构概述、PV/PVC/StorageClass核心概念、CSI驱动原理

1.1 K8s存储体系架构概述

Kubernetes 存储体系采用 声明式资源模型 与 插件化驱动架构,将存储的消费与供给彻底解耦。Pod 不再直接绑定存储设备,而是通过一组抽象层完成动态匹配与挂载。

核心设计原则:
  • 声明式:用户描述“需要什么存储”,而非“如何配置存储”。
  • 解耦:应用开发者不感知后端存储类型(NFS、Ceph、云盘等)。
  • 可移植:同一套 YAML 可在不同集群、不同云环境间迁移。

K8s 存储体系自底向上分为四层:

层级 组件 职责
4 - 消费层 Pod / VolumeMount 声明挂载路径,使用存储
3 - 绑定层 PersistentVolumeClaim (PVC) 按大小、访问模式、存储类请求存储
2 - 资源层 PersistentVolume (PV) 代表实际存储后端的一段预分配空间
1 - 供给层 StorageClass / CSI Driver 定义存储模板,驱动后端创建/删除卷
K8s 存储体系架构分层 Pod / VolumeMount 声明挂载路径,消费存储 PersistentVolumeClaim (PVC) 按大小、访问模式、存储类请求存储 PersistentVolume (PV) 代表实际存储后端的一段预分配空间 StorageClass / CSI Driver 定义存储模板,驱动后端创建/删除卷 4 3 2 1 消费层 → 绑定层 → 资源层 → 供给层

1.2 PV / PVC / StorageClass 核心概念

1.2.1 PersistentVolume (PV)

PV 是集群管理员预先制备或由 StorageClass 动态创建的存储资源,独立于任何 Pod 存在。PV 具有独立生命周期,即使 Pod 被删除,PV 仍可保留数据。

关键字段:
  • capacity.storage:卷大小(如 100Gi)。
  • accessModes:ReadWriteOnce (RWO)、ReadOnlyMany (ROX)、ReadWriteMany (RWX)。
  • persistentVolumeReclaimPolicy:Retain / Delete / Recycle。
  • storageClassName:关联的 StorageClass 名称。

1.2.2 PersistentVolumeClaim (PVC)

PVC 是用户对存储的请求,描述所需的大小、访问模式和存储类。K8s 控制平面负责将 PVC 与满足条件的 PV 进行 绑定(Bind),绑定是一对一的独占关系。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fast-ssd-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: fast-ssd

1.2.3 StorageClass

StorageClass 定义了存储的“模板”,包括后端驱动(provisioner)、卷参数(如 IOPS、磁盘类型)和回收策略。启用动态供给后,PVC 通过 storageClassName 引用 StorageClass,系统自动创建对应的 PV。

概念 角色 创建者 生命周期
PV 存储资源 管理员 / 动态供给 独立于 Pod
PVC 存储请求 用户 跟随 Pod 或手动删除
StorageClass 存储模板 管理员 集群级持久对象
PV / PVC / StorageClass 绑定与动态供给流程 用户创建 PVC storageClassName: fast-ssd K8s 控制平面 匹配 StorageClass 调用 CSI 创建卷 CSI Driver CreateVolume 返回卷 ID PV 创建完成 → 与 PVC 绑定 → Pod 可挂载 PV 状态: Available → Bound → Released 动态供给 vs 静态供给 动态供给:PVC → StorageClass → CSI → 自动创建 PV 静态供给:管理员预先创建 PV → PVC 手动匹配绑定

1.3 CSI 驱动原理

Container Storage Interface (CSI) 是 K8s 与存储后端之间的标准插件接口。CSI 将存储驱动从 K8s 核心代码中剥离,使任何存储厂商只需实现 CSI 规范即可无缝接入 K8s。

1.3.1 CSI 架构组件

组件 部署方式 职责
Controller Plugin Deployment / StatefulSet 处理 CreateVolume、DeleteVolume、Attach、Detach 等控制面操作
Node Plugin DaemonSet 处理 NodePublishVolume、NodeUnpublishVolume 等节点级挂载操作
CSI Sidecar 容器 与 Plugin 同 Pod 将 K8s 原生 API 调用转换为 CSI gRPC 调用(如 external-provisioner、external-attacher)

1.3.2 CSI 工作流程(动态供给)

  1. PVC 创建:用户提交 PVC,指定 storageClassName。
  2. Provisioner 监听:CSI external-provisioner sidecar 监听到 PVC 事件,调用 CSI Controller 的 CreateVolume gRPC 接口。
  3. 后端创建卷:CSI Controller 与存储后端交互(如创建云硬盘、Ceph RBD 映像),返回卷 ID 和属性。
  4. PV 自动生成:external-provisioner 根据返回信息自动创建 PV 对象,并与 PVC 绑定。
  5. Pod 调度与挂载:Pod 调度到节点后,CSI Node Plugin 执行 NodePublishVolume,将卷挂载到 Pod 文件系统。
性能调优关注点:
  • CSI Controller 的 CreateVolume 延迟直接影响 Pod 启动时间。
  • Node Plugin 的 挂载参数(如 mountOptions、fsType)对 IO 路径性能有决定性影响。
  • CSI 驱动版本与 K8s 版本的兼容性测试不可跳过。

1.3.3 常见 CSI 驱动对比

驱动 后端类型 典型场景 性能特征
csi-hostpath 本地磁盘 开发测试 低延迟,无冗余
csi-rbd (Ceph) 分布式块存储 生产高可用 高吞吐,网络依赖
csi-nfs 网络文件系统 共享存储 读写性能受网络和协议限制
csi-aws-ebs 云块存储 AWS 生产 IOPS 与卷类型强相关