Kubernetes CSI架构

CSI概念

  • CSI是容器存储接口(Container Storage Interface),以建立一个行业标准接口规范,以便将任意存储系统暴露给容器 Kubernetes负载

  • csi 卷类型是一种 out-tree (in-tree是指跟其它存储插件在同一个代码路径下,随 Kubernetes 的代码同时编译,out-tree则刚好相反) 的CSI卷插件,用于Pod与同一个节点上运行的外部CSI卷驱动程序交互。部署了CSI兼容卷驱动后,用户就开业使用 csi 作为卷类型来关在驱动提供的存储。

  • CSI持久化卷支持在Kubernetes v1.9引入,必须由集群管理员明确启用。也就是需要在 apiserver / controller-managerkubelet 组件的 --feature-gates = 标志中加上 CSIPersistentVolume = true

  • CSI持久化卷具备以下字段可以让用户指定:

    • driver : 指定卷驱动程序名称

    • volumeHandle : 唯一标识从CSI卷插件的 CreateVolume 调用返回的卷名

    • readOnly : 指示卷是否发布为只读

CSI插件机制

CSI插件包括:

  • Controller Plugin : 以 DeploymentStatefulSet 形式部署,实现CSI Controller service。Controller负责与Kubernetes API, 外部存储服务的控制面交互,但并不实际处理存储卷在宿主机上的挂载等工作

  • Node Plugin : Node插件需要在所有node节点上运行,所以通常以 Daemonset 形式部署。Node插件实现CSI Node service,会暴露出一个 uds 文件出来,从而让 kubelet 在进行存储卷操作时,通过这个 uds 文件调用它的 gRPC 接口

CSI插件需要实现 3个 gRPC 接口服务:

  • Identity Service : Node插件和Controller插件都需要实现Identity Service RPC

  • Controller Service : 控制插件实现

  • Node Service : Node插件实现

CSI插件部署通常采用官方提供的一系列sidecar来完成:

  • external-provisioner

  • external-attacher

  • external-snapshotter

  • external-resizer

  • node-driver-registrar

  • livenessprobe

备注

我先实践 Ceph CSI ,然后再回来补充理论知识

参考