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 | 定义存储模板,驱动后端创建/删除卷 |
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 | 存储模板 | 管理员 | 集群级持久对象 |
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 工作流程(动态供给)
- PVC 创建:用户提交 PVC,指定
storageClassName。 - Provisioner 监听:CSI external-provisioner sidecar 监听到 PVC 事件,调用 CSI Controller 的
CreateVolumegRPC 接口。 - 后端创建卷:CSI Controller 与存储后端交互(如创建云硬盘、Ceph RBD 映像),返回卷 ID 和属性。
- PV 自动生成:external-provisioner 根据返回信息自动创建 PV 对象,并与 PVC 绑定。
- 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 与卷类型强相关 |