csi
# 1.简介
# 1.1.规范
CSI是行业标准容器存储接口,旨在将任意存储系统暴露给容器化应用,是kubernetes、mesos、cloudFoundry社区联合制定的存储规范。
注意
1.
node-service运行于各节点,负责挂载和卸载存储卷,处理节点级别的存储操作2.
controller-service运行于控制平面,负责管理卷的生命周期,诸如创建、删除及扩容3.
identity-service用于CSI驱动器注册提供标识信息,向集群公开驱动器的支持能力
# 1.2.交互
controller-server、external-csi-sidecar、node-server及kubelet基于grpc socket交互,协同完成volume生命周期管理。
注意
node-server主要和kubelet volumeManager交互,以将驱动器纳管到volumeMgr进而作用于Pod生命周期
# 1.3.架构
CSI由pv/ad controller、external-sidecar、volumeMgr及csi-plugin组成,plugin细分为in-tree和out-tree类型。--- csi-plugin csi-plugin负责具体的存储任务,in-tree plugin是内置的存储实现,out-tree plugin细分为controller-server和node-server类型 --- external-sidecar 驱动csi-plugin执行存储操作的相关组件,负责扩展volume的创建、删除、附着及分离实现 --- pv controller 负责PV/PVC绑定及周期管理,内置volume由pv controller+in-tree plugin完成,外置由external-sidecar+out-tree plugin完成 --- ad controller volume附着或分离到node,内置volume由ad controller+in-tree plugin完成,外置由external-sidecar+out-tree plugin完成 --- volumeMgr kubelet负责volume挂载或卸载组件,支持plugin注册机制,Pod挂载或卸载volume由volumeMgr调用csi-plugin实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
注意
volume挂载经历provision-->attach-->mount-->unmount-->detach-->delete几个阶段,由上述模块配合完成,后面会提到
# 2.组件
# 2.1.sidecar
CSI sidecar container负责监听资源对象,基于grpc调用csi driver辅助完成存储任务,一般与csi driver一起部署在相同Pod。--- attacher 监听volumeAttachment对象,调用csi-driver的ControllerPublishVolume和ControllerUnpublishVolume接口完成附着 --- provisioner 监听PVC对象,CSI端点匹配调用CreateVolume/DeleteVolume进行创建及回收 --- resizer 监听PVC对象,请求存储变更触发CSI端点匹配的ControllerExpandVolume操作 --- snapshotter 监听VolumeSnapshotContent/VolumeGroupSnapshotContent对象,调用CreateXX/DeleteXX/ListXX完成快照、清理及查询操作 --- livenessprobe 监控CSI驱动的运行情况,基于Liveness Probe机制上报状态触发重启自愈,提高CSI驱动程序的可用性 --- node-driver-registrar 基于CSI端点获取驱动程序信息,将驱动注册到kubelet,kubelet直接交互csi driver实现存储操作 --- health-monitor-controller 调用csi driver服务的ListVolumes或ControllerGetVolume接口,检查csi volume健康状态上报到PVC的event1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
注意
csi sidecar container是一组标准容器,旨在简化csi driver开发和部署,主动监听资源以触发驱动执行适当操作完成存储管理
# 2.2.control
volume生命周期管理由pv controller、ad controller及volumeMgr共同负责,经历创建/删除--->附着/分离--->挂载/卸载三大阶段。--- pv controller PV/PVC绑定及周期管理,配合in-tree plugin创建或删除内置volume,或更新PV元数据驱动external-sidecar+out-tree plugin完成 --- ad controller volumeAttachment管理,配置in-tree plugin附着或分离内置volume至node,或同步external-attacher+out-tree plugin附着状态 --- volumeMgr 基于volumeAttachment对象状态mount/unmount volume至Pod,相关操作调用csi-plugin实现,早期支持attach/detach1
2
3
4
5
6
7
8
补充
external-sidecar这里也作为plugin的一部分
# 3.原理
# 3.1.provision
provision分为in-tree和out-tree(本例)流程,PV Controller发现无法处理PV会由sidecar调用plugin创建,完成会绑定PVC。--- 流程 1.PV Controller观察到待建的volume无法匹配in-tree,向PVC/PV打上annotation 2.external-provisioner观察到PVC/PV的annotation匹配,基于socket交互out-tree plugin进行创盘 3.csi plugin创建成功返回,external-provisioner会同步状态至PV对象 4.PV Controller观察到PV完成,进行PV和PVC绑定1
2
3
4
5
补充
in-tree volume相对简单一些,不需要external-provisioner参与,由PV Controller和csi plugin配置完成volume创建
# 3.2.attaching
attaching分为in-tree和out-tree(本例)流程,AD Controller创建volumeAttachment对象,驱动external-attacher附着卷。--- 流程 1.AD Controller观测到PV对应Pod调度到某节点,交互in-tree plugin的Attach接口 2.in-tree plugin创建volumeAttachment对象 3.external-attacher观测到volumeAttachment对象,交互out-tree plugin的ControllerPublish接口进行附着及同步状态 4.AD Controller观测到volumeAttachment状态完成,更新内部维护的附着状态ASW,该状态最终显示在node.status.VolumesAttached1
2
3
4
5
补充
in-tree volume无需external attacher介入,由ad controller交互csi plugin直接完成附着
# 3.3.mounting
kubelet处理节点Pod时,根据Pod Volume交互in-tree plugin的WaitForAttach检查附着状态,附着完成调用csi plugin进行挂载。--- 流程 1.volumeMgr调用csiAttacher(in-tree)的WaitForAttach函数等待volumeAttachment就绪 2.csiAttacher调用MountDevice函数交互out-tree plugin的NodeStageVolume函数进行全局挂载 3.csiAttacher交互csiMountMgr(in-tree)的SetUp函数,进而调用out-tree plugin的NodePublishVolume函数进行Pod挂载1
2
3
4
注意
volumeMgr根据csi plugin注册信息调用相关插件
# 3.4.unmounting
Pod清理时,相关的volume会执行unmount卸载及detacher分离,确保Pod删除回收节点相关的volume数据,避免存储泄漏。--- 流程 1.volumeMgr交互csiMountMgr(in-tree)的TearDown函数,进而调用out-tree NodeUnpublishVolume卸载Pod挂载点 2.volumeMgr交互csiAttacher(in-tree plugin)的UnmountDevice,进而调用out-tree NodeUnstageVolume卸载全局挂载点1
2
3
注意
unmounting相比mounting其实就是逆过程,反向调用csi plugin完成清理
# 3.5.detaching
Pod清理ad controller会交互csiAttacher(in-tree)删除volumeAttachment对象,进而触发external-attacher执行存储卷分离。--- 流程 1.ad controller观察到Pod删除,交互csiAttacher plugin删除volumeAttachment对象 2.external-attacher观察到volumeAttachment删除,交互out-tree plugin的ControllerUnpublish函数进行卷分离 3.ad controller观察到volumeAttachment对象已删除,会更新内部维护的附着状态及同步到node1
2
3
4
注意
out-tree volume附着时,ad controller仅负责交互csi plugin创建或删除volumeAttachment对象
# 3.6.deleting
PVC/PV清理会触发external-provisioner组件回收,基于回收策略决定继续保留PV还是清理volume及删除PV对象。--- 流程 1.清理PVC/PV 2.external-provisioner观察到PVC/PV删除 3.PVC/PV删除,基于回收策略交互out-tree plugin删除存储卷,清理PV对象1
2
3
4
补充
PV删除会交互csi plugin删盘及清理对象,PVC删除则会根据回收策略决定PV及存储盘去留