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-manager
和kubelet
组件的--feature-gates =
标志中加上CSIPersistentVolume = true
CSI持久化卷具备以下字段可以让用户指定:
driver
: 指定卷驱动程序名称volumeHandle
: 唯一标识从CSI卷插件的CreateVolume
调用返回的卷名readOnly
: 指示卷是否发布为只读
CSI插件机制
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
备注
我先实践 Ceph CSI ,然后再回来补充理论知识
参考
Kubernetes CSI Specification 这篇文章较为全面清晰,提供了不少索引信息,可以作为学习起点
基于 CSI Kubernetes 存储插件的开发实践 QingCloud公司开发分享的有关CSI原理和开发方法介绍
Kubernetes Container Storage Interface (CSI) Documentation 详细全面的开发、部署、测试文档,作为主要参考资料
CSI Volume Plugins in Kubernetes Design Doc CSI插件设计文档,非常详细,值得深入学习