存储管理

CSI

Container Storage Interface (CSI) 是容器存储接口的缩写,它是一个行业标准规范,旨在将任意块存储(block storage)和文件存储(file storage)系统暴露给容器编排系统(Container Orchestration Systems,简称 COs,如 Kubernetes、Mesos 等)上的容器化工作负载。

背景与历史

  • 在 CSI 出现之前,Kubernetes 的存储卷插件(Volume Plugins)是 in-tree(内置树内)的,即插件代码直接集成在 Kubernetes 核心代码中,随 Kubernetes 二进制文件一起发布。
  • 这导致第三方存储厂商添加新存储支持或修复 bug 时,必须跟随 Kubernetes 的发布周期,过程复杂且容易引入安全/可靠性问题。
  • CSI 从 Kubernetes 1.9 引入 alpha 版本,1.10 升为 beta,1.13 版本正式 GA(General Availability),成为稳定特性。
  • CSI 的目标是使存储插件 out-of-tree(树外),允许厂商独立开发、部署和维护插件,而无需修改 Kubernetes 核心代码。

CSI 的核心优势

  • 可扩展性:第三方存储提供商只需实现 CSI 标准接口,即可将存储系统集成到 Kubernetes 中,支持动态 provisioning(动态供给)。
  • 标准化:一个 CSI 驱动程序可以跨多个容器编排系统工作(如 Kubernetes 和 Mesos)。
  • 容器化部署:CSI 驱动以容器形式运行,支持现代特性如卷快照(snapshots)、卷扩展(expansion)、克隆(cloning)等。
  • 安全性与维护性:减少核心代码体积,厂商可独立发布更新。

CSI 架构与组件

CSI 通过 gRPC 接口通信,主要包括:

  • CSI Driver:由存储厂商实现的核心容器,包括:
    • Identity Service:识别驱动信息。
    • Controller Service:处理卷创建/删除、附加/分离、快照等控制器端操作(通常部署为 StatefulSet)。
    • Node Service:处理节点端操作,如卷挂载/卸载(通常部署为 DaemonSet)。
  • Sidecar Containers(Kubernetes 官方提供的辅助容器):
    • external-provisioner:监听 PVC,触发卷创建/删除。
    • external-attacher:处理卷附加/分离。
    • external-resizer:支持卷扩展。
    • external-snapshotter:支持卷快照。
    • node-driver-registrar:向 kubelet 注册驱动。
    • livenessprobe:健康检查。
  • Kubernetes 通过这些 sidecar 与 CSI Driver 交互,用户无需关心底层细节。

使用方式

用户通过熟悉的 Kubernetes 对象使用 CSI:

  • StorageClass:定义 provisioner(CSI 驱动名称)和参数,支持动态供给。
  • PersistentVolumeClaim (PVC):申请存储。
  • PersistentVolume (PV):自动或手动创建。

示例 StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: csi.example.com  # CSI 驱动名称
parameters:
  type: ssd
allowVolumeExpansion: true  # 支持扩展