最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

深究kubernetes源碼-存儲-2 CSI Plugin機(jī)制流程分析

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

分析基于kubernetes v1.26?

1.4.1 CSI 標(biāo)準(zhǔn)

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

1.4.1.1 架構(gòu)

根據(jù)標(biāo)準(zhǔn)描述,存在4種架構(gòu)模式

1)存在一個集中式的Controller-Plugin,運(yùn)行在集群的任意節(jié)點上,集群的每個Node節(jié)點上需要部署Node-Plugin

2)只有集群的Worker節(jié)點上運(yùn)行分離式的Controller-Plugin和Node-Plugin

3)在集群的Worker節(jié)點上運(yùn)行一體式的Plugin

4)在集群的Worker節(jié)點上只運(yùn)行Node-Plugin

1.4.1.2 CSI Volume的生命周期

1)創(chuàng)建-發(fā)布

2)創(chuàng)建-節(jié)點周期-發(fā)布

3)預(yù)先創(chuàng)建PV-發(fā)布

4)只發(fā)布

1.4.1.3 接口描述

1)ID接口

需要在Controller-Plugin和Node-Plugin中都實現(xiàn)

2)Controller-Plugin接口

3)Node-Plugin接口

1.4.2 CSI實現(xiàn)

1.4.2.1 總體架構(gòu)

根據(jù)CSI標(biāo)準(zhǔn),"Master" Host相關(guān)的組件為kube-controllermanager,其中AttachDetachController和PersistenVolumeController參與CSI流程,Node Host相關(guān)組件為kubelet。

kube-controllermanager不直接與csi-plugin進(jìn)行g(shù)RPC交互,而是通過https://github.com/kubernetes-csi 項目中的external-attacher/external-provisioner/external-snapshotter/external-resizer以k8s資源VolumeAttachment/PersistenVolumeClaim/PersistenVolume為媒介調(diào)用csi-plugin, external-attacher/external-provisioner/external-snapshotter/external-resizer/livenessprobe以sidecar方式與csi-plugin部署。

external-provisioner:主要功能為調(diào)諧PersistenVolumeClaim調(diào)用csi-plugin CreateVolume/DeleteVolume進(jìn)行volume創(chuàng)建/刪除,并創(chuàng)建PersistenVolume。

external-attacher:主要功能為調(diào)諧VolumeAttachment調(diào)用csi-plugin ControllerPublishVolume/ControllerUnpublishVolume。

kubelet則直接通過gRPC調(diào)用csi-plugin NodePublishVolume/NodeUnpublishVolume或NodeStageVolume/NodeUnstageVolume。csi-node-driver-registrar主要負(fù)責(zé)以DevicePlugin機(jī)制(https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#device-plugin-registration)將Node csi-plugin注冊到kubelet中。

以O(shè)penstack-Cinder-CSI-Plugin為例:

Controller Plugin

Node Plugin

1.4.2.2 CSI Volume Plugin

OperationGenerator調(diào)用VolumePlugin生成對應(yīng)的Attacher/Detacher、Mounter/Unmounter、Mapper/Unmapper,對于的csi Plugin實現(xiàn)分別是csiAttacher/csiMounterMgr/csiBlockMapper。

csiMounterMgr和csiBlockMapper是在Node Host上,分別正對文件系統(tǒng)類型Volume和塊類型Volume進(jìn)行掛載操作,csiMounterMgr通過gRPC調(diào)用NodePushlish Volume和NodeUnpublishVolume,csiBlockMapper通過gRPC調(diào)用NodePublishVolume/NodeUnpublishVolume、NodeStageVolume/NodeUnstageVolume,csiAttacher MountDevice/UnmountDevice則調(diào)用NodeStageVolume/NodeUnstageVolume

csiMountMgr.SetUp執(zhí)行Filesystem類型Volume Mount操作,將Volume Mount到對應(yīng)路徑,根據(jù)CSI Spec,NodePublishVolumeRequest 包含2個Path,TargetPath/StagingTargetPath,TargetPath即Pod掛載Volume路徑,StagingTargetPath是支持Stage/UnStage Volume Plugin的Staging路徑,即設(shè)備掛載路徑。

TargetPath生成規(guī)則如下

{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生成規(guī)則如下

{kubelet.rootDirectory:-/var/lib/kubelet}/{DefaultKubeletPluginDirName:-plugins}/{pluginName:-kubernetes.io/csi}/{persistentVolumeInGlobalPath:-pv}/{volSha:-pvName}/globalmount // 基于v1.21 后續(xù)版本修改了persistentVolumeInGlobalPath和pvName兩處

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

最終會通過gRPC調(diào)用NodePublishVolume,由CSI Node Plugin 完成工作

例如在Openstack Cinder CSI Volume Plugin中,主要是對TargePath/StagingTargetPath做一個mount bind,最終透傳到容器中,例如

1.4.2.3 Kubelet CSI Plugin注冊

如《2.1總體架構(gòu)》所述,csi-node-driver-registrar主要負(fù)責(zé)以DevicePlugin機(jī)制(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服務(wù),提供CSI標(biāo)準(zhǔn)NodePlugin服務(wù)。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目錄,發(fā)現(xiàn)socket,則會gRPC調(diào)用GetInfo,csi-registrar返回Type/Name/EndPoint/SupportVersions,pluginManager根據(jù)Type回調(diào)PluginHandler,此處為k8s.io/pkg/volume/csi/PluginHandler.RegisterPlugin.


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

RegisterPlugin流程:

首先將Driver信息通過DriverStore.Set注冊到DriverStore中,在調(diào)用CSI Plugin時候會調(diào)用DriverStore.Get從DriverStore中取出Driver,并根據(jù)EndPoint生成對應(yīng)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

最后會更新或創(chuàng)建CSINode,更新spec.drivers


深究kubernetes源碼-存儲-2 CSI Plugin機(jī)制流程分析的評論 (共 條)

分享到微博請遵守國家法律
宜兰市| 高雄市| 九江县| 怀安县| 盘山县| 阿勒泰市| 横山县| 郸城县| 屏山县| 卫辉市| 克什克腾旗| 宽甸| 黄大仙区| 青河县| 东光县| 雷波县| 安阳县| 驻马店市| 宁津县| 奉化市| 大埔区| 长丰县| 同德县| 金昌市| 洪湖市| 荆州市| 新竹市| 虞城县| 延长县| 定西市| 武隆县| 博爱县| 衡阳市| 邳州市| 双辽市| 昌黎县| 札达县| 上栗县| 云安县| 新野县| 鹿邑县|