1. CSI 概述:诞生背景、核心价值与 In-Tree 对比

1.1 诞生背景:从 In-Tree 到 Out-of-Tree 的必然演进

在 Kubernetes 早期版本中,所有存储插件都以 In-Tree 方式内嵌在核心代码仓库(kubelet、kube-controller-manager)中。这种紧耦合模式随着云原生生态的爆发迅速暴露出严重问题:

  • 发布节奏冲突:存储厂商的插件更新必须等待 Kubernetes 大版本发布,修复一个 Bug 往往需要数月。
  • 代码质量风险:第三方存储代码直接进入核心仓库,增加了整个集群的编译与安全风险。
  • 厂商锁定:用户难以在同一集群中灵活切换不同存储后端。
  • 维护负担:Kubernetes 社区需要为数十种存储驱动维护兼容性,人力严重分散。

2018 年,Kubernetes 社区联合 VMware、Google、Red Hat 等厂商共同推出了 Container Storage Interface(CSI) 标准,将存储插件从核心代码中彻底解耦,形成独立的 Out-of-Tree 二进制或容器化驱动。

关键里程碑: CSI v0.1 于 2018 年 3 月发布,Kubernetes v1.13 正式 GA(General Availability),标志着存储插件进入标准化、可插拔时代。
CSI 诞生背景与演进路线 CSI 诞生背景与演进路线 In-Tree 时代 v1.0 ~ v1.12 CSI 标准化 v0.1 ~ v1.0 K8s GA 集成 v1.13+ 核心驱动力: • 发布节奏解耦:插件独立迭代,不再受 K8s 大版本限制 • 代码安全隔离:第三方驱动运行在独立进程中,不侵入核心组件

1.2 核心价值:标准化、可插拔、生产就绪

CSI 的核心价值可以概括为以下四个维度:

维度 说明 实际收益
标准化接口 定义统一的 gRPC 协议:Identity、Controller、Node 三大服务 任何 CSI 驱动可在任何支持 CSI 的容器编排平台(K8s、Mesos、Nomad)上运行
可插拔架构 驱动以 DaemonSet + StatefulSet 形式独立部署,不修改 K8s 核心代码 升级驱动只需更新镜像,无需重启集群控制面
生产级能力 支持快照、克隆、扩容、拓扑感知、卷加密等高级特性 满足企业级存储运维需求,覆盖 90%+ 生产场景
生态中立 云厂商(AWS EBS、GCE PD、Azure Disk)与自建存储(Ceph、NFS、Longhorn)共用同一接口 避免厂商锁定,多云/混合云存储统一管理
性能调优视角: CSI 的 Out-of-Tree 架构使得存储插件可以独立进行 CPU/内存/并发调优,而不会影响 kubelet 主进程。在多集群环境下,这一特性尤为关键——每个集群可以根据存储后端的特性单独配置驱动资源限制与 gRPC 超时参数。

1.3 CSI vs In-Tree Volume Plugin:全面对比

下表从架构、部署、运维、性能四个关键维度进行详细对比:

对比维度 In-Tree Volume Plugin CSI Out-of-Tree Plugin
代码位置 内嵌于 kubelet / kube-controller-manager 源码 独立二进制或容器,通过 Unix Socket / gRPC 与 kubelet 通信
部署方式 随 K8s 组件一起编译、一起发布 通过 DaemonSet + StatefulSet 独立部署,镜像独立管理
升级影响 升级插件必须升级整个 K8s 版本 滚动升级驱动,不影响集群控制面
故障隔离 插件崩溃可能导致 kubelet 进程异常 插件崩溃仅影响自身容器,kubelet 自动重启或重建
特性支持 仅支持基础挂载/卸载,高级特性依赖社区版本 原生支持快照、扩容、拓扑、卷加密等
性能开销 无额外通信开销,直接调用系统调用 增加一次 gRPC 本地通信(Unix Socket),延迟约 0.1~0.5ms
多集群适配 每个集群需独立维护插件版本 统一 CSI 驱动镜像,通过配置区分集群
CSI 与 In-Tree 架构对比 CSI 与 In-Tree 架构对比 In-Tree 架构 kubelet(内嵌插件代码) kube-controller-manager(内嵌) 存储后端(直接调用) CSI Out-of-Tree 架构 kubelet(无存储代码) CSI Driver(独立容器) 存储后端 通信方式:Unix Socket gRPC 延迟:0.1~0.5ms

1.4 多集群环境下的 CSI 优势

在本次课程聚焦的多集群环境中,CSI 的 Out-of-Tree 架构带来了三个关键优势:

  1. 统一驱动管理:所有集群共享同一 CSI 驱动镜像,通过 ConfigMap 或环境变量区分不同集群的存储后端配置。
  2. 独立升级窗口:每个集群可以按自己的维护窗口升级 CSI 驱动,无需等待上游 K8s 版本发布。
  3. 故障域隔离:一个集群的 CSI 驱动崩溃不会影响其他集群,且可通过 Operator 实现自动恢复。
注意: 多集群环境下 CSI 驱动的 gRPC 超时设置需要根据集群间网络延迟进行调整。跨集群调用时,建议将 csi-attacher 和 csi-provisioner 的超时时间从默认的 30s 提升至 60~120s,避免因网络抖动导致卷挂载失败。