- CSI是容器存储接口(Container Storage Interface),以建立一个行业标准接口规范,以便将任意存储系统暴露给容器
k8s_workloads
。 csi
卷类型是一种out-tree
(in-tree是指跟其它存储插件在同一个代码路径下,随 Kubernetes 的代码同时编译,out-tree则刚好相反) 的CSI卷插件,用于Pod与同一个节点上运行的外部CSI卷驱动程序交互。部署了CSI兼容卷驱动后,用户就开业使用csi
作为卷类型来关在驱动提供的存储。- CSI持久化卷支持在Kubernetes v1.9引入,必须由集群管理员明确启用。也就是需要在
apiserver
/controller-manager
和kubelet
组件的--feature-gates =
标志中加上CSIPersistentVolume = true
- CSI持久化卷具备以下字段可以让用户指定:
driver
: 指定卷驱动程序名称volumeHandle
: 唯一标识从CSI卷插件的CreateVolume
调用返回的卷名readOnly
: 指示卷是否发布为只读
CSI插件包括:
Controller Plugin
: 以Deployment
或StatefulSet
形式部署,实现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 RPCController Service
: 控制插件实现Node Service
: Node插件实现
CSI插件部署通常采用官方提供的一系列sidecar来完成:
external-provisioner
external-attacher
external-snapshotter
external-resizer
node-driver-registrar
livenessprobe
Note
我先实践 ceph-csi
,然后再回来补充理论知识
- Kubernetes CSI Specification 这篇文章较为全面清晰,提供了不少索引信息,可以作为学习起点
- 基于 CSI Kubernetes 存储插件的开发实践 QingCloud公司开发分享的有关CSI原理和开发方法介绍
- Kubernetes Container Storage Interface (CSI) Documentation 详细全面的开发、部署、测试文档,作为主要参考资料
- CSI Volume Plugins in Kubernetes Design Doc CSI插件设计文档,非常详细,值得深入学习