3. CSI 驱动架构解析:规范与核心组件交互

CSI(Container Storage Interface)是 Kubernetes 与存储系统之间的标准接口协议。本章深入解析 CSI 驱动架构,重点说明 Node Plugin、Controller Plugin、External Provisioner 和 External Snapshotter 四个核心组件的职责与交互流程,为后续拓扑图回退演练奠定理论基础。

3.1 CSI 规范概述

CSI 规范定义了存储插件与容器编排系统(CO)之间的 gRPC 接口。Kubernetes 作为 CO,通过 sidecar 容器与 CSI 驱动通信,实现卷的创建、挂载、快照等操作。CSI 规范将存储操作分为两组 RPC:

RPC 分组 身份类型 主要方法 说明
Controller RPC Controller Plugin CreateVolume, DeleteVolume, CreateSnapshot, DeleteSnapshot 在存储后端执行控制面操作,不直接接触节点
Node RPC Node Plugin NodePublishVolume, NodeUnpublishVolume, NodeGetVolumeStats 在宿主机节点上执行挂载/卸载操作
Identity RPC 两者均实现 GetPluginInfo, GetPluginCapabilities, Probe 插件身份与能力声明
关键认知: CSI 规范本身不包含快照回退操作。回退逻辑由 Kubernetes 控制面(VolumeSnapshotController)和 External Snapshotter 协同实现,CSI 驱动只需实现 CreateSnapshot 和 DeleteSnapshot 两个 RPC 即可支持快照功能。

3.2 核心组件职责与交互

Kubernetes CSI 架构采用 sidecar 模式,将存储操作拆分为多个独立容器,每个容器负责一个功能域。下图展示了 CSI 驱动在 Kubernetes 集群中的完整组件拓扑:

CSI 驱动核心组件交互拓扑图 CSI 驱动核心组件交互拓扑图 Kubernetes 控制面(Master) API Server VolumeSnapshotController External Snapshotter External Provisioner Controller Plugin 存储后端(Storage Backend) 存储系统(SAN/NAS/云盘) 快照存储(Snapshot Store) 工作节点(Worker Node) Kubelet Node Plugin Pod 挂载路径 图例: ■ Kubernetes 核心组件 ■ CSI 插件 ■ 快照相关 sidecar ■ 卷相关 sidecar ■ 存储后端 ■ 控制器/挂载路径

3.3 组件职责详解

3.3.1 Controller Plugin

Controller Plugin 运行在 Kubernetes 控制面节点上,以 StatefulSet 或 Deployment 形式部署。它实现 CSI 规范的 Controller RPC,负责与存储后端通信执行卷和快照的创建/删除操作。

  • 核心方法: CreateVolume、DeleteVolume、CreateSnapshot、DeleteSnapshot、ListSnapshots
  • 部署形态: 通常与 External Provisioner、External Snapshotter 以 sidecar 模式运行在同一 Pod 中
  • 关键能力: 通过 gRPC 调用存储后端 API,不直接操作宿主机文件系统

3.3.2 Node Plugin

Node Plugin 以 DaemonSet 形式部署在每个工作节点上。它实现 CSI 规范的 Node RPC,负责在宿主机上执行卷的挂载、卸载和格式化操作。

  • 核心方法: NodePublishVolume、NodeUnpublishVolume、NodeGetVolumeStats
  • 部署形态: DaemonSet,确保每个节点都有插件实例
  • 关键能力: 通过 gRPC 与 Kubelet 通信,管理 Pod 的卷挂载路径

3.3.3 External Provisioner

External Provisioner 是 Kubernetes 官方提供的 sidecar 容器,负责监听 PersistentVolumeClaim(PVC) 资源,并调用 Controller Plugin 的 CreateVolume RPC 创建卷。

  • 监听资源: PVC 对象,特别是未绑定的 PVC
  • 工作流程: 监听到 PVC → 调用 Controller Plugin 创建卷 → 创建 PV 对象 → 绑定 PVC 与 PV
  • 快照相关: 支持从 VolumeSnapshot 恢复卷(PopulateVolume)

3.3.4 External Snapshotter

External Snapshotter 是 Kubernetes 官方提供的 sidecar 容器,负责监听 VolumeSnapshot 和 VolumeSnapshotContent 资源,并调用 Controller Plugin 的 CreateSnapshot/DeleteSnapshot RPC 管理快照。

  • 监听资源: VolumeSnapshot(用户创建)、VolumeSnapshotContent(集群级资源)
  • 工作流程: 监听到 VolumeSnapshot → 调用 Controller Plugin 创建快照 → 创建 VolumeSnapshotContent 对象 → 绑定
  • 回退支持: 通过 VolumeSnapshot 的 source 字段指定 PVC,External Provisioner 在创建新卷时从快照恢复数据
组件交互要点: External Snapshotter 与 External Provisioner 都通过 Unix Domain Socket 与 Controller Plugin 通信,共享同一个 gRPC 连接。这种 sidecar 架构避免了 CSI 驱动需要直接访问 Kubernetes API 的复杂性,也使得存储厂商只需实现 CSI 规范即可。

3.4 快照创建与回退流程

以下两个独立流程图分别展示快照创建和快照回退的完整组件交互过程。

3.4.1 快照创建流程

快照创建流程组件交互图 快照创建流程组件交互图 ① 用户创建 VolumeSnapshot ② VolumeSnapshotController 监听 ③ External Snapshotter 触发 ④ Controller Plugin 调用 CreateSnapshot ⑤ 存储后端创建快照 ⑥ 创建 VolumeSnapshotContent ⑦ 绑定 VolumeSnapshot 与 Content 关键说明: 步骤③中 External Snapshotter 通过 Unix Domain Socket 调用 Controller Plugin 的 CreateSnapshot RPC。 步骤⑥中 VolumeSnapshotContent 是集群级资源,由 External Snapshotter 自动创建。

3.4.2 快照回退(恢复)流程

快照回退流程组件交互图 快照回退流程组件交互图 ① 创建 PVC 指定 dataSource ② External Provisioner 监听 ③ Controller Plugin 调用 CreateVolume ④ 存储后端从快照恢复数据 ⑤ External Provisioner 创建 PV ⑥ 绑定 PVC 与 PV ⑦ Pod 使用恢复后的卷 关键说明: PVC 的 dataSource 字段指向 VolumeSnapshot 对象。External Provisioner 在步骤③中传递快照 ID 给 Controller Plugin, 存储后端在步骤④中基于快照创建新卷。整个过程对 Pod 透明。

3.5 组件交互总结表

组件 部署方式 监听资源 调用的 CSI RPC 与 K8s API 交互
Controller Plugin StatefulSet/Deployment 无(被动调用) CreateVolume, CreateSnapshot 等 否(通过 sidecar 代理)
Node Plugin DaemonSet 无(被动调用) NodePublishVolume, NodeUnpublishVolume 否(通过 Kubelet 通信)
External Provisioner Sidecar(与 Controller Plugin 同 Pod) PVC CreateVolume(通过 Unix Socket) 是(创建 PV 对象)
External Snapshotter Sidecar(与 Controller Plugin 同 Pod) VolumeSnapshot, VolumeSnapshotContent CreateSnapshot, DeleteSnapshot(通过 Unix Socket) 是(创建 VolumeSnapshotContent)
常见陷阱: 在回退演练中,如果 External Snapshotter 或 External Provisioner 版本与 Kubernetes 集群版本不匹配,可能导致快照绑定失败或卷恢复超时。建议始终使用与 Kubernetes 版本对应的官方 sidecar 镜像版本。

3.6 本章小结

CSI 驱动架构通过 sidecar 模式将存储控制面操作与节点操作分离,External Provisioner 和 External Snapshotter 作为 Kubernetes 与 CSI 驱动之间的桥梁,分别负责卷和快照的生命周期管理。理解这四个核心组件的交互关系,是后续进行拓扑图回退演练的前提条件。