深究Kubernetes源码-存储- 1 Volume Plugin机制流程分析
分析基于kubernetes v1.26
1.1 Volume Plugin接口

k8s volume核心机制实现在k8s.io/kubernetes/pkg/volume包中, csi是其中一种plugin,组件在启动时都会通过VolumePluginMrg加载和管理需要的VolumePlugin。
VolumePlugin为接口,并有派生接口,例如csi plugin,实现了DeviceMountable/NodeExpandable/BlockVolume/Attachable。

PersistenVolumeController加载需要的VolumePlugin
k8s.io/kubernetes/cmd/kube-controller-manager/app/plugins.go
AttachDetachController加载需要的VolumePlugin
k8s.io/kubernetes/cmd/kube-controller-manager/app/plugins.go
kubelet加载需要的VolumePlugin
k8s.io/kubernetes/cmd/kubelet/app/plugins.go
1.2 Volume Plugin Manager
VolumePluginMgr以map[string]VolumePlugin形式存储VolumePlugin,key为PluginName,例如"kubernetes.io/csi",在初始化时,通过调用VolumePlugin.GetPluginName()方法获取。
PluginManager初始化时依次调用加载的plugin.Init(),完成Plugin的初始化。
k8s.io/kubernetes/pkg/volume/plugins.go
在处理Volume时,通过FindPluginBySpec确定使用什么VolumePlugin处理
其中关键为调用VolumePlugin.CanSupport确定对应VolumePlugin支持对应Volume类型,例如CSI VolumePlugin处理包含CSI field的PV
1.3 Operation Executor/Generator

对Volume/Device的操作都是通过OperationExecutor发起,核心包括AttachVolume/DetachVolume,MountVolume/UmountVolume,UnmountDevice,OperationExecutor通过OperationGenerator调用Plugin NewAttacher/NewDetacher,NewMounter/NewUnmounter,生成对应Attacher/Mapper/Mounter,如CSI Plugin分别为csiAttacher/csiMounterMgr/csiBlockMapper。