欢迎光临散文网 会员登陆 & 注册

深究kubernetes源码-存储-2 CSI Plugin机制流程分析

2022-09-09 14:46 作者:黑暗光影DIY  | 我要投稿

分析基于kubernetes v1.26 

1.4.1 CSI 标准

https://github.com/container-storage-interface/spec/blob/master/spec.md

1.4.1.1 架构

根据标准描述,存在4种架构模式

1)存在一个集中式的Controller-Plugin,运行在集群的任意节点上,集群的每个Node节点上需要部署Node-Plugin

2)只有集群的Worker节点上运行分离式的Controller-Plugin和Node-Plugin

3)在集群的Worker节点上运行一体式的Plugin

4)在集群的Worker节点上只运行Node-Plugin

1.4.1.2 CSI Volume的生命周期

1)创建-发布

2)创建-节点周期-发布

3)预先创建PV-发布

4)只发布

1.4.1.3 接口描述

1)ID接口

需要在Controller-Plugin和Node-Plugin中都实现

2)Controller-Plugin接口

3)Node-Plugin接口

1.4.2 CSI实现

1.4.2.1 总体架构

根据CSI标准,"Master" Host相关的组件为kube-controllermanager,其中AttachDetachController和PersistenVolumeController参与CSI流程,Node Host相关组件为kubelet。

kube-controllermanager不直接与csi-plugin进行gRPC交互,而是通过https://github.com/kubernetes-csi 项目中的external-attacher/external-provisioner/external-snapshotter/external-resizer以k8s资源VolumeAttachment/PersistenVolumeClaim/PersistenVolume为媒介调用csi-plugin, external-attacher/external-provisioner/external-snapshotter/external-resizer/livenessprobe以sidecar方式与csi-plugin部署。

external-provisioner:主要功能为调谐PersistenVolumeClaim调用csi-plugin CreateVolume/DeleteVolume进行volume创建/删除,并创建PersistenVolume。

external-attacher:主要功能为调谐VolumeAttachment调用csi-plugin ControllerPublishVolume/ControllerUnpublishVolume。

kubelet则直接通过gRPC调用csi-plugin NodePublishVolume/NodeUnpublishVolume或NodeStageVolume/NodeUnstageVolume。csi-node-driver-registrar主要负责以DevicePlugin机制(https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#device-plugin-registration)将Node csi-plugin注册到kubelet中。

以Openstack-Cinder-CSI-Plugin为例:

Controller Plugin

Node Plugin

1.4.2.2 CSI Volume Plugin

OperationGenerator调用VolumePlugin生成对应的Attacher/Detacher、Mounter/Unmounter、Mapper/Unmapper,对于的csi Plugin实现分别是csiAttacher/csiMounterMgr/csiBlockMapper。

csiMounterMgr和csiBlockMapper是在Node Host上,分别正对文件系统类型Volume和块类型Volume进行挂载操作,csiMounterMgr通过gRPC调用NodePushlish Volume和NodeUnpublishVolume,csiBlockMapper通过gRPC调用NodePublishVolume/NodeUnpublishVolume、NodeStageVolume/NodeUnstageVolume,csiAttacher MountDevice/UnmountDevice则调用NodeStageVolume/NodeUnstageVolume

csiMountMgr.SetUp执行Filesystem类型Volume Mount操作,将Volume Mount到对应路径,根据CSI Spec,NodePublishVolumeRequest 包含2个Path,TargetPath/StagingTargetPath,TargetPath即Pod挂载Volume路径,StagingTargetPath是支持Stage/UnStage Volume Plugin的Staging路径,即设备挂载路径。

TargetPath生成规则如下

{kubelet.rootDirectory:-/var/lib/kubelet}/{DefaultKubeletPodsDirName:-pods}/{PodUID}/{DefaultKubeletVolumesDirName:-volumes}/{pluginName:-kubernetes.io~csi}/{volumeName}/mount

例如:/var/lib/kubelet/pods/58c58356-a287-49f3-920d-71bfa1fec5de/volumes/kubernetes.io~csi/pvc-9f70e95b-63db-404e-a30b-5145280233ce/mount

StagingTargetPath生成规则如下

{kubelet.rootDirectory:-/var/lib/kubelet}/{DefaultKubeletPluginDirName:-plugins}/{pluginName:-kubernetes.io/csi}/{persistentVolumeInGlobalPath:-pv}/{volSha:-pvName}/globalmount // 基于v1.21 后续版本修改了persistentVolumeInGlobalPath和pvName两处

例如:/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-9f70e95b-63db-404e-a30b-5145280233ce/globalmount

最终会通过gRPC调用NodePublishVolume,由CSI Node Plugin 完成工作

例如在Openstack Cinder CSI Volume Plugin中,主要是对TargePath/StagingTargetPath做一个mount bind,最终透传到容器中,例如

1.4.2.3 Kubelet CSI Plugin注册

如《2.1总体架构》所述,csi-node-driver-registrar主要负责以DevicePlugin机制(https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#device-plugin-registration)将Node csi-plugin注册到kubelet中。

csi-x-nodeplugin Pod启动后,csi-plugin会通过/csi/csi.sock暴露一个gRPC服务,提供CSI标准NodePlugin服务。csi-registrar作为SideCar启动,请求/csi/csi.sock GetPluginInfo获取CSI Plugin的driverName,然后在/registration目录下生成一个 driverName-reg.sock,例如cinder csi plugin 生成cinder.csi.openstack.org-reg.sock,/csi和/registration目录分别来自于hostPath  /var/lib/kubelet/plugins/cinder.csi.openstack.org 和/var/lib/kubelet/plugins_registry,kubelet pluginManager会扫描/var/lib/kubelet/plugins_registry目录,发现socket,则会gRPC调用GetInfo,csi-registrar返回Type/Name/EndPoint/SupportVersions,pluginManager根据Type回调PluginHandler,此处为k8s.io/pkg/volume/csi/PluginHandler.RegisterPlugin.


k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go

RegisterPlugin流程:

首先将Driver信息通过DriverStore.Set注册到DriverStore中,在调用CSI Plugin时候会调用DriverStore.Get从DriverStore中取出Driver,并根据EndPoint生成对应gRPC client,例如cinder csi plugin EndPoint /var/lib/kubelet/plugins/cinder.csi.openstack.org/csi.sock


k8s.io/kubernetes/pkg/volume/csi/csi_client.go

其次会更新Node annotations和labels,如下,更新csi.volume.kubernetes.io/nodeid和topology.cinder.csi.openstack.org/zone

最后会更新或创建CSINode,更新spec.drivers


深究kubernetes源码-存储-2 CSI Plugin机制流程分析的评论 (共 条)

分享到微博请遵守国家法律