深究Kubernetes源碼-存儲(chǔ)-8 Volume創(chuàng)建掛載流程總結(jié)
分析基于kubernetes v1.26
kubernetes的動(dòng)態(tài)Volume創(chuàng)建和掛載共涉及7個(gè)組件(scheduler另外分析),包括在3個(gè)項(xiàng)目中,如下圖,三個(gè)項(xiàng)目為kubernetes、kubernetes-csi和csi plugin項(xiàng)目,其中kubernetes和kubernetes-csi項(xiàng)目由kubernetes社區(qū)維護(hù),csi plugin項(xiàng)目則由存儲(chǔ)提供方維護(hù),例如cinder csi plugin由OpenStack Cinder 相關(guān)維護(hù)。核心流程如下,總體上分大致為三個(gè)階段15個(gè)步驟:

階段一,Create&Bind
1 當(dāng)kube-apiserver收到PVC創(chuàng)建請(qǐng)求,創(chuàng)建PVC,kube-controllermanager 中的PVController 通過(guò)PVC Informer獲取到新的PVC,通過(guò)syncClaim協(xié)程對(duì)PVC進(jìn)行處理
2 對(duì)設(shè)置了StorageClassName的PVC進(jìn)行動(dòng)態(tài)Provision,對(duì)于CSI Volume則更新PVC Annotation volume.beta.kubernetes.io/storage-provisioner: {provisioner}, 例如cinder csi plugin的StorageClass Provisioner為cinder.csi.openstack.org
3 external-provisioner ProvisionController通過(guò)PVC Informer獲取到PVC,在syncClaim協(xié)程中處理Annotation provisioner于自己的csi driverName一致的PVC
4 external-provisioner 通過(guò)gRPC調(diào)用csi-controller-plugin CreateVolume接口創(chuàng)建Volume
5 完成Volume創(chuàng)建后external-provisioner創(chuàng)建PV
6 PVController 執(zhí)行對(duì)PV/PVC只想bind操作,將PV/PVC的狀態(tài)設(shè)置為Bound
階段二,Controller Attach
7 當(dāng)kube-controllermanager AttachDetachController通過(guò)Pod/PVC/PV Informer發(fā)現(xiàn)PVC被Pod所引用,并且Pod已經(jīng)調(diào)度到了某個(gè)節(jié)點(diǎn),執(zhí)行Attach操作,對(duì)于CSI Volume,生成VolumeAttachment資源
9 external-attacher通過(guò)VolumeAttachment Informer獲取到最新VA
10 syncVA協(xié)程中執(zhí)行Attach操作,通過(guò)gRPC調(diào)用csi-controller-plugin ControllerPublishVolume
11 更新VA狀態(tài)到attached,并更新PV Finalizer
階段三,Node Attach&Mount
12 kubelet在獲取到對(duì)應(yīng)的Pod執(zhí)行Pod創(chuàng)建,等待Volume掛載完成
13 kubelet VolumeManager Reconcile協(xié)程通過(guò)gRPC調(diào)用csi-node-plugin NodeStageVolumne
14 kubelet VolumeManagter Reconcile協(xié)程通過(guò)gRPC調(diào)用csi-node-plugin NodePublishVolume
15 完成Pod創(chuàng)建,更新Pod狀態(tài)