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),标志着存储插件进入标准化、可插拔时代。
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 驱动镜像,通过配置区分集群 |
1.4 多集群环境下的 CSI 优势
在本次课程聚焦的多集群环境中,CSI 的 Out-of-Tree 架构带来了三个关键优势:
- 统一驱动管理:所有集群共享同一 CSI 驱动镜像,通过 ConfigMap 或环境变量区分不同集群的存储后端配置。
- 独立升级窗口:每个集群可以按自己的维护窗口升级 CSI 驱动,无需等待上游 K8s 版本发布。
- 故障域隔离:一个集群的 CSI 驱动崩溃不会影响其他集群,且可通过 Operator 实现自动恢复。
注意: 多集群环境下 CSI 驱动的 gRPC 超时设置需要根据集群间网络延迟进行调整。跨集群调用时,建议将
csi-attacher 和 csi-provisioner 的超时时间从默认的 30s 提升至 60~120s,避免因网络抖动导致卷挂载失败。