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

深究Kubernetes源码-存储-8 Volume创建挂载流程总结

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


分析基于kubernetes v1.26

kubernetes的动态Volume创建和挂载共涉及7个组件(scheduler另外分析),包括在3个项目中,如下图,三个项目为kubernetes、kubernetes-csi和csi plugin项目,其中kubernetes和kubernetes-csi项目由kubernetes社区维护,csi plugin项目则由存储提供方维护,例如cinder csi plugin由OpenStack Cinder 相关维护。核心流程如下,总体上分大致为三个阶段15个步骤:


阶段一,Create&Bind

1 当kube-apiserver收到PVC创建请求,创建PVC,kube-controllermanager 中的PVController 通过PVC Informer获取到新的PVC,通过syncClaim协程对PVC进行处理

2 对设置了StorageClassName的PVC进行动态Provision,对于CSI Volume则更新PVC Annotation volume.beta.kubernetes.io/storage-provisioner: {provisioner}, 例如cinder csi plugin的StorageClass Provisioner为cinder.csi.openstack.org

3 external-provisioner ProvisionController通过PVC Informer获取到PVC,在syncClaim协程中处理Annotation provisioner于自己的csi driverName一致的PVC

4 external-provisioner 通过gRPC调用csi-controller-plugin CreateVolume接口创建Volume

5 完成Volume创建后external-provisioner创建PV

6 PVController 执行对PV/PVC只想bind操作,将PV/PVC的状态设置为Bound


阶段二,Controller Attach

7 当kube-controllermanager AttachDetachController通过Pod/PVC/PV Informer发现PVC被Pod所引用,并且Pod已经调度到了某个节点,执行Attach操作,对于CSI Volume,生成VolumeAttachment资源

9 external-attacher通过VolumeAttachment Informer获取到最新VA

10 syncVA协程中执行Attach操作,通过gRPC调用csi-controller-plugin ControllerPublishVolume

11 更新VA状态到attached,并更新PV Finalizer


阶段三,Node Attach&Mount

12 kubelet在获取到对应的Pod执行Pod创建,等待Volume挂载完成

13 kubelet VolumeManager Reconcile协程通过gRPC调用csi-node-plugin NodeStageVolumne

14 kubelet VolumeManagter Reconcile协程通过gRPC调用csi-node-plugin NodePublishVolume

15 完成Pod创建,更新Pod状态


深究Kubernetes源码-存储-8 Volume创建挂载流程总结的评论 (共 条)

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