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 | 插件身份与能力声明 |
3.2 核心组件职责与交互
Kubernetes CSI 架构采用 sidecar 模式,将存储操作拆分为多个独立容器,每个容器负责一个功能域。下图展示了 CSI 驱动在 Kubernetes 集群中的完整组件拓扑:
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 在创建新卷时从快照恢复数据
3.4 快照创建与回退流程
以下两个独立流程图分别展示快照创建和快照回退的完整组件交互过程。
3.4.1 快照创建流程
3.4.2 快照回退(恢复)流程
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) |
3.6 本章小结
CSI 驱动架构通过 sidecar 模式将存储控制面操作与节点操作分离,External Provisioner 和 External Snapshotter 作为 Kubernetes 与 CSI 驱动之间的桥梁,分别负责卷和快照的生命周期管理。理解这四个核心组件的交互关系,是后续进行拓扑图回退演练的前提条件。