CSI 系统介绍

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基础架构:

下图是典型的数据卷生命周期流程图,一般块存储都是按照这个流程执行;
image

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接口实现格式化、挂载等功能。

猜你喜欢

转载自yq.aliyun.com/articles/705632