kubelet VolumeManager 流程

来源:互联网 发布:淘宝话费红包怎么用 编辑:程序博客网 时间:2024/05/26 09:57

1.govm.desiredStateOfWorldPopulator.Run(sourcesReady,stopCh)podmangerpod挂载的volume信息同步到desiredStateOfWorld

2.govm.reconciler.Run(stopCh)执行volumedetach/attach/mount/unmount操作,同步已经挂载好的volume信息到desiredStateOfWorldactualStateOfWorld

type desiredStateOfWorld struct {   volumekeyvaluevolume对应的pod信息和node信息   volumesToMount map[v1.UniqueVolumeName]volumeToMount   volume对应的plugin   volumePluginMgr *volume.VolumePluginMgr   sync.RWMutex}type volumeToMount struct {   volumeName v1.UniqueVolumeName   podkeyvaluepod及其需要挂载的volume信息   podsToMount map[types.UniquePodName]podToMount   volume plugin是否支持attach   pluginIsAttachable bool   // volumeGidValue contains the value of the GID annotation, if present.   volumeGidValue string   // reportedInUse indicates that the volume was successfully added to the   // VolumesInUse field in the node's status.   reportedInUse bool}type podToMount struct {   // podName contains the name of this pod.   podName types.UniquePodName   pod详情   pod *v1.Pod   volume详情   spec *volume.Spec   outerVolumeSpecName string}

.govm.desiredStateOfWorldPopulator.Run(sourcesReady,stopCh)

1.调用populatorLoopFuncpodvolume的信息同步到desiredStateOfWorld中。

1.1调用findAndAddNewPods遍历pod并将podpod上的volume信息node信息加入到desiredStateOfWorld结构体中。

1.1.1调用desiredStateOfWorld.AddPodToVolumepod加入desiredStateOfWorld

1.2调用findAndRemoveDeletedPods将不再存在的poddesiredStateOfWorld删除

1.2.1遍历desiredStateOfWorld中期望被挂载的volume

1.2.2假如pod不存在了,并且pod对应的container也不再running,调用desiredStateOfWorld.DeletePodFromVolumepoddesiredStateOfWorld删除,还调用deleteProcessedPodpoddeleteProcessedPod中删除,deleteProcessedPod是存放已经处理过的pods



.govm.reconciler.Run(stopCh)

调用reconciliationLoopFunc进行mountunmount操作

1调用reconcile()确保需要mountvolumemount,需要unmountvolumeunmount

1.1调用actualStateOfWorld.GetMountedVolumes()获取已经挂载的volume,如果该volume不在desiredStateOfWorld,即不期望被挂载,则把该volumeumount

1.1.1调用volumeUnmounter.TearDown()volumefsgroup挂载点上umount

1.1.2调用MarkVolumeAsUnmountedvolume标记为已经从fsgroup挂载点上umount

1.2调用desiredStateOfWorld.GetVolumesToMount()获取所有期望被挂载的volume

1.2.1假如volume没有被attach,并且controllerAttachDetachEnabled开关被打开了,即不允许kubelet去挂载volume,得等待controllermanager去挂载。还调用VerifyControllerAttachedVolume去判断node的挂载情况(获取node的挂载信息,假如node的挂载信息中存在某个期望被挂载的volume,则将该volume标记为已经挂载了,即将volume加入actualStateOfWorld

1.2.2假如该volume需要被挂载,并且volume对应的plugin支持attach操作,并且kubelet能够执行attach操作,则调用operationexecutor.AttachVolumevolume挂载相应的node上,即调用volumeAttacher.Attach执行pluginattach操作,并将该volume标记为已经挂载了,即将volume加入actualStateOfWorld

1.2.3假如该volumeattach了,但是没有被mount。则调用operationExecutor.MountVolume执行mount操作。

1.2.3.1调用volumeAttacher.WaitForAttach等待volume挂载成功,并获取在node上的挂载点

1.2.3.2调用volumeAttacher.GetDeviceMountPath获取mount点(globalmount path

1.2.3.3调用volumeAttacher.MountDevicemountvolume

1.2.3.4调用actualStateOfWorld.MarkDeviceAsMounted将该volume标记为已经mountglobalmount path 了,即设置actualStateOfWorldvolume对应的globallyMountedtrue

1.2.3.5调用volumeMounter.SetUp(fsGroup)执行mount操作,即将该volumemountfsgroup里的目录,能够让pod中的容器访问

1.2.3.5.1调用makeGlobalPDName获取mount点(globalmount path)即1.2.3.2mount

1.2.3.5.2调用GetPath()获取在fsgroup中该volume需要被挂载的点,

1.2.3.5.3调用Mountglobalmount path点挂载到fsgroup中的挂载点

1.2.3.6调用MarkVolumeAsMountedvolume标记为mounted,即设置actualStateOfWorldvolume对应的mountedPods,将mount的挂载信息包含挂载点更新到actualStateOfWorld



1.2.4调用actualStateOfWorld.GetUnmountedVolumes()获取所有需要被mount的但又没有被mountvolume(已经attached了),并且该volume不在desiredStateOfWorld中,即

1.2.4.1假如该volume挂载globalmount path了,则调用operationExecutor.UnmountDevicevolumeglobalmountpath卸载,并调用actualStateOfWorld.MarkDeviceAsUnmounted将该volume标记为没有挂载到globalmount path

1.2.4.2假如kubelet不允许detachvolume则调用actualStateOfWorld.MarkVolumeAsDetached将该volume标记为detach的,即从actualStateOfWorld删除

1.2.4.3假如kubelet允许detachvolume则调用operationExecutor.DetachVolumevolumedetach掉,并调用MarkVolumeAsDetached将该volume标记为detach的,即从actualStateOfWorld删除



volume ---> instance path ---> global path ---> fsgrouppath

卸载

1.operationExecutor.UnmountVolume端开globalpath ---> fsgroup path

actualStateOfWorld.MarkVolumeAsUnmounted标记

2.operationExecutor.UnmountDevice断开instancepath ---> global path

actualStateOfWorld.MarkDeviceAsUnmounted标记

3.operationExecutor.DetachVolume断开volume ---> instance path

actualStateOfWorld.MarkVolumeAsDetached标记

挂载

1.operationExecutor.AttachVolume连接volume ---> instance path

actualStateOfWorld.MarkVolumeAsAttached标记2.operationExecutor.MountVolume连接instance path   --->    global path    ---> fsgroup pathvolumeAttacher.MountDevice连接instance path   --->    global pathactualStateOfWorld.MarkDeviceAsMounted标记volumeMounter.SetUp(fsGroup)连接 global path    ---> fsgroup path actualStateOfWorld.MarkVolumeAsMounted标记调用syncStates(podsDir)同步pod的信息和volume信息到actualStateOfWorldvolume中,包含挂载点等信息1.调用getVolumesFromPodDirkubeletpod目录获取podpod对应的volume信息,including pod's uid, volume's plugin name, mount path, and volume spec name.2. 调用reconstructVolume获取volume的详情,构建一个volume的结构体3.将存在于actualStateOfWorldvolume加入volumesNeedUpdate,调用updateStates更新volumesNeedUpdatevolume的信息

4.获取node详情的node.Status.VolumesAttached,更新volumesNeedUpdatevolumeDevicePath信息

5.调用desiredStateOfWorld.GetVolumesToMount()获取期望的volume信息,更新volumesNeedUpdatevolumeOuterVolumeSpecName信息

6.依次调用actualStateOfWorld.MarkVolumeAsAttachedvolume标记为attached

7.依次将pod的信息加入的actualStateOfWorld中对应的volume

8.调用actualStateOfWorld.MarkDeviceAsMountedvolume标记为已挂载到节点上了

9.调用desiredStateOfWorld.AddPodToVolumevolume的信息加入desiredStateOfWorld



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 幼儿急诊见风了怎么办 哺乳期乳房有硬块而且疼怎么办 哺乳期乳头破裂乳房似针扎怎么办 回奶胀痛的厉害怎么办 淡水龟的壳变软了怎么办 棕色的泰迪变白怎么办 大班教案泥石流来了怎么办 鸟类的嘴巴坏了怎么办 四川麦蚊子咬了怎么办 脸上被晒脱皮了怎么办 额头被晒脱皮了怎么办 脸黑一块白一块怎么办 小乌龟的壳软了怎么办 把田螺后面吃了怎么办 微生物生态菌群异常怎么办 怀孕初期感染了动物病毒怎么办? 金龙和银龙打架怎么办 海水缸盐度高了怎么办 洗空调洗坏了怎么办 老师是条青花鱼怎么办 吃了带鱼和南瓜怎么办 苹果平板ad忘了怎么办 小米6进海水了怎么办 小米手机掉海水里怎么办 苹果7进海水了怎么办 7p手机进海水怎么办 育海参苗出现红细菌怎么办 苹果手机掉进厕所怎么办 2个月的婴儿肺炎怎么办 甜甜圈珊瑚脱骨怎么办 宝宝吃了生物球怎么办 狗尾巴被剪掉了怎么办 魟鱼尾巴刺了怎么办 狗咬过了24小时怎么办 狗咬超过24小时怎么办 狗咬超过48小时怎么办 狗咬超过72小时怎么办 狗抓超过24小时怎么办 龙须树叶子发黄怎么办? 车被广告牌砸了怎么办 开花店压力好大怎么办