CSI 基础
CSI只支持PV、PVC方式,不支持Volume方式;
官方资料: https://kubernetes-csi.github.io/docs/
How to Write CSI Plugin: https://arslan.io/2018/06/21/how-to-write-a-container-storage-interface-csi-plugin/
目前版本信息:
Kubernetes | CSI Version | CSI Status |
---|---|---|
v1.9 | v0.1 | Alpha |
v1.10 | v0.2 | Beta |
v1.11 | v0.3 | Beta |
v1.12 | v0.3 | Beta |
v1.13 | v1.0.0 | GA |
CSI基础架构:
下图是典型的数据卷生命周期流程图,一般块存储都是按照这个流程执行;
PV-Controller
Controller Manager的一部分,主要做卷的provision/delete,pv、pvc绑定;
PV Controller通过监听API Server中的PV,PVC,SC三类资源更新,当监听到这些资源的创建、删除、修改时,PV Controller做创建、删除、绑定、回收。
PV Controller 会调用注册的Provisioner完成存储卷的创建,然后创建PV对象,并与PVC进行绑定;
AD-Controller
Controller Manager的一部分,主要从事块设备的attach/detach(例如:rbd,ebs块设备需要在mount之前先attach 到主机上)
非必选: attach/detach可以通过kubelet的volume manager驱动,Controller Manager提供配置可以禁用。
通过在kubelet中--enable-controller-attach-detach,设置是否通过AD Controller来管理分配到本节点的pod volume AD;
--enable-controller-attach-detach=true:通过AD-Controller做AD,kubelet禁用;
--enable-controller-attach-detach=false:通过kubelet做AD,AD-Controller对本节点禁用;
作用:当API Server中pod(配置了pvc)与node间的关系发生变化时,通过调用存储插件将这个pod关联的PV Attach/Detach到对应node上. 完成后通知其它关联组件(kubelet)。
Volume Manager
运行在kubelet里,主要完成attach/detach/mount/unmount;
mount/unmount操作是可选的,通过kubelet配置的enable-controller-attach-detach参数确定;
当pod调度到这个node上后才会有卷的相应操作,所以它的触发端是:kubelet根据Pod Manager里pod spec里的存储配置来触发卷的挂载操作;
Kubelet会监听到调度到该节点上的pod,把pod缓存到Pod Manager中;
VolumeManager通过Pod Manager获取PV/PVC的状态,并分析出具体的attach/detach、mount/umount操作,然后调用plugin进行相应的业务处理;
External-Provisioner
监听 Kubernetes PVC 对象,并触发对 CSI Plugin的 CreateVolume 和DeleteVolume 操作;
CreateVolume成功后,创建PV对象;
External-Attacher
监听 VolumeAttachment 对象,触发 ControllerPublish 和 ControllerUnPublish 操作,通过 CSI endpoint 触发;
Driver-Register
向 Kubelet注册 CSI Plugin 程序,并将 NodeId 添加到 Kubernetes Node 对象的 annotation 里面。
Volume Plugin
存储提供的扩展接口, 包含了各类存储提供者的plugin实现;
会调用CSI Plugin的NodeStageVolume、NodePublishVolume接口实现格式化、挂载等功能。