1. CSI 驱动概述:标准定义、架构组件与通信链路基础

1.1 CSI 标准定义

Container Storage Interface(CSI)是 Kubernetes 社区与存储厂商共同定义的开放标准,旨在为容器编排系统(CO)提供统一的存储插件接口。CSI 将存储驱动的实现从 Kubernetes 核心代码中解耦,使第三方存储厂商能够以标准方式接入容器平台,而无需修改 CO 本身。

维度 说明
定义组织 CNCF(Cloud Native Computing Foundation)下的 SIG Storage 工作组
协议类型 gRPC 远程过程调用,基于 Protocol Buffers 序列化
核心目标 存储插件与容器编排系统之间的标准化契约,实现“一次开发,多平台运行”
版本演进 v0.1(2017)→ v1.0(2018)→ 当前稳定版 v1.x,持续迭代中
关键特性 卷的创建/删除、挂载/卸载、快照、扩容、拓扑感知、卷克隆
版本漂移风险点: CSI 规范版本与存储后端驱动版本、Kubernetes 版本之间存在严格的兼容性矩阵。当三者版本不匹配时,通信链路会出现 RPC 方法签名不一致、字段缺失或语义变更等故障,这是本课程重点排查的场景。

1.2 驱动架构组件

CSI 驱动在 Kubernetes 集群中部署为两个独立的容器化组件:Controller Plugin 和 Node Plugin。两者通过 gRPC 与 CO 交互,但职责范围完全不同。

1.2.1 Controller Plugin(控制器插件)

  • 部署位置: 通常以 Deployment 形式运行在控制平面节点或任意工作节点。
  • 核心职责: 处理集群级别的卷管理操作,包括卷创建、删除、快照、扩容、克隆、Attach/Detach。
  • 通信对象: 与 Kubernetes 的 external-provisioner、external-attacher、external-snapshotter 等 sidecar 容器通过 Unix Socket 或 TCP 通信。
  • 身份标识: 实现 csi.Controller 服务接口,包含 CreateVolume、DeleteVolume、ControllerPublishVolume、ControllerUnpublishVolume 等 RPC。

1.2.2 Node Plugin(节点插件)

  • 部署位置: 以 DaemonSet 形式运行在每个 Kubernetes 工作节点上。
  • 核心职责: 处理节点本地的卷挂载/卸载操作,包括将设备挂载到 Pod 文件系统、格式化、检查挂载点。
  • 通信对象: 与 kubelet 通过 Unix Socket 直接通信,接收来自 kubelet 的挂载请求。
  • 身份标识: 实现 csi.Node 服务接口,包含 NodePublishVolume、NodeUnpublishVolume、NodeGetCapabilities、NodeGetInfo 等 RPC。
排查要点: Controller Plugin 与 Node Plugin 的版本必须一致。实际故障案例中,常见场景是升级存储后端固件后,Node Plugin 未同步更新,导致 NodePublishVolume 返回 UNIMPLEMENTED 或 INVALID_ARGUMENT 错误。

1.3 通信链路基础

CSI 驱动的通信链路分为三个层次:CO 到 Sidecar、Sidecar 到 CSI Plugin、CSI Plugin 到存储后端。版本漂移故障可能发生在任意一层。

  1. CO → Sidecar 层: Kubernetes API Server 通过 Watch 机制将 PVC/PV 变化推送给 external-provisioner、external-attacher 等 sidecar 容器。
  2. Sidecar → CSI Plugin 层: Sidecar 通过 Unix Socket(默认路径 /var/lib/csi/sockets/<driver-name>/csi.sock)调用 CSI Plugin 的 gRPC 接口。
  3. CSI Plugin → 存储后端层: CSI Plugin 通过存储厂商的 SDK、REST API 或 CLI 与后端存储阵列/软件定义存储通信。
版本漂移典型场景: 当存储后端固件升级后,其 REST API 返回的卷属性字段发生变化(如 capacity_bytes 从 int32 变为 int64),而 CSI Plugin 仍按旧版本解析,导致 CreateVolumeResponse 反序列化失败,整个卷创建流程卡死。
CSI 驱动架构组件与通信链路 Kubernetes API Server Sidecar 容器 external-provisioner external-attacher external-snapshotter Controller Plugin CreateVolume / DeleteVolume ControllerPublishVolume Node Plugin NodePublishVolume NodeUnpublishVolume 存储后端(阵列/SDS) Watch PVC/PV gRPC (Unix Socket) SDK / REST API / CLI kubelet gRPC (Unix Socket) 版本漂移风险点 RPC 方法签名不一致 字段类型/语义变更 兼容性矩阵断裂

1.4 通信链路中的版本契约

CSI 驱动通信链路中,版本契约体现在三个关键维度:

契约维度 具体内容 版本漂移后果
gRPC 服务定义 .proto 文件中定义的 RPC 方法名、请求/响应消息结构 方法不存在(UNIMPLEMENTED)、字段缺失(UNKNOWN_FIELD)
CSI 规范版本 CSI 规范 v0.3 / v1.0 / v1.5 等,影响 GetCapabilities 返回值 Sidecar 误判驱动能力,跳过必要操作(如未执行 Stage 直接 Publish)
存储后端 API 版本 存储系统 REST API 或 SDK 的版本号 JSON/Protobuf 反序列化失败,字段类型不匹配(int vs string)
故障排查黄金法则: 当 CSI 驱动出现通信链路故障时,首先检查三者的版本号是否在厂商提供的兼容性矩阵内。版本漂移是“症状”,而非“根因”——根因往往是升级流程缺失版本校验环节。
CSI 通信链路版本契约与漂移影响 CSI 规范版本 v0.3 / v1.0 / v1.5 ... CSI 驱动版本 Controller + Node Plugin 存储后端版本 固件 / API / SDK 兼容性矩阵(必须三方对齐) 厂商发布兼容性列表:CSI 规范版本 × 驱动版本 × 存储后端版本 升级前必须校验,否则产生版本漂移 RPC 方法签名不一致 UNIMPLEMENTED / UNKNOWN 字段类型/语义变更 反序列化失败 / 数据截断 能力误判 跳过 Stage / 错误挂载流程

1.5 本章小结

  • CSI 标准定义了容器编排系统与存储驱动之间的标准化 gRPC 契约,版本漂移是通信链路故障的核心诱因。
  • 驱动架构分为 Controller Plugin(集群级卷管理)和 Node Plugin(节点级挂载),两者版本必须一致。
  • 通信链路涉及 CO、Sidecar、CSI Plugin、存储后端四层,每层都有独立的版本号。
  • 版本漂移故障的排查起点是校验三方版本是否在厂商兼容性矩阵内。