1.govm.desiredStateOfWorldPopulator.Run(sourcesReady,stopCh)将podmanger中pod挂载的volume信息同步到desiredStateOfWorld中
2.govm.reconciler.Run(stopCh)执行volume的detach/attach/mount/unmount操作,同步已经挂载好的volume信息到desiredStateOfWorld和actualStateOfWorld中
type desiredStateOfWorld struct { 为,是对应的信息和信息 对应的 type volumeToMount struct { 为,是及其需要挂载的信息 是否支持 type podToMount struct { 详情 详情
一.govm.desiredStateOfWorldPopulator.Run(sourcesReady,stopCh)
1.调用populatorLoopFunc将pod和volume的信息同步到desiredStateOfWorld中。
1.1调用findAndAddNewPods遍历pod并将pod和pod上的volume信息node信息加入到desiredStateOfWorld结构体中。
1.1.1调用desiredStateOfWorld.AddPodToVolume将pod加入desiredStateOfWorld
1.2调用findAndRemoveDeletedPods将不再存在的pod从desiredStateOfWorld删除
1.2.1遍历desiredStateOfWorld中期望被挂载的volume
1.2.2假如pod不存在了,并且pod对应的container也不再running,调用desiredStateOfWorld.DeletePodFromVolume将pod从desiredStateOfWorld删除,还调用deleteProcessedPod将pod从deleteProcessedPod中删除,deleteProcessedPod是存放已经处理过的pods
二.govm.reconciler.Run(stopCh)
调用reconciliationLoopFunc进行mount和unmount操作
1调用reconcile()确保需要mount的volume被mount,需要unmount的volume被unmount
1.1调用actualStateOfWorld.GetMountedVolumes()获取已经挂载的volume,如果该volume不在desiredStateOfWorld,即不期望被挂载,则把该volumeumount。
1.1.1调用volumeUnmounter.TearDown()将volume从fsgroup挂载点上umount
1.1.2调用MarkVolumeAsUnmounted将volume标记为已经从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.AttachVolume将volume挂载相应的node上,即调用volumeAttacher.Attach执行plugin的attach操作,并将该volume标记为已经挂载了,即将volume加入actualStateOfWorld
1.2.3假如该volume被attach了,但是没有被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.MountDevice去mountvolume
1.2.3.4调用actualStateOfWorld.MarkDeviceAsMounted将该volume标记为已经mount到globalmount path 了,即设置actualStateOfWorld中volume对应的globallyMounted为true
1.2.3.5调用volumeMounter.SetUp(fsGroup)执行mount操作,即将该volumemount到fsgroup里的目录,能够让pod中的容器访问
1.2.3.5.1调用makeGlobalPDName获取mount点(globalmount path)即1.2.3.2的mount点
1.2.3.5.2调用GetPath()获取在fsgroup中该volume需要被挂载的点,
1.2.3.5.3调用Mount将globalmount path点挂载到fsgroup中的挂载点
1.2.3.6调用MarkVolumeAsMounted将volume标记为mounted,即设置actualStateOfWorld中volume对应的mountedPods,将mount的挂载信息包含挂载点更新到actualStateOfWorld中
1.2.4调用actualStateOfWorld.GetUnmountedVolumes()获取所有需要被mount的但又没有被mount的volume(已经attached了),并且该volume不在desiredStateOfWorld中,即
1.2.4.1假如该volume挂载globalmount path了,则调用operationExecutor.UnmountDevice将volume从globalmountpath卸载,并调用actualStateOfWorld.MarkDeviceAsUnmounted将该volume标记为没有挂载到globalmount path
1.2.4.2假如kubelet不允许detachvolume则调用actualStateOfWorld.MarkVolumeAsDetached将该volume标记为detach的,即从actualStateOfWorld删除
1.2.4.3假如kubelet允许detachvolume则调用operationExecutor.DetachVolume将volumedetach掉,并调用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 path volumeAttacher.MountDevice连接instance path ---> global path actualStateOfWorld.MarkDeviceAsMounted标记 volumeMounter.SetUp(fsGroup)连接 global path ---> fsgroup path actualStateOfWorld.MarkVolumeAsMounted标记 调用syncStates(podsDir)同步pod的信息和volume信息到actualStateOfWorld的volume中,包含挂载点等信息 1.调用getVolumesFromPodDir从kubelet的pod目录获取pod及pod对应的volume信息, 2. 调用reconstructVolume获取volume的详情,构建一个volume的结构体 3.将存在于actualStateOfWorld的volume加入volumesNeedUpdate,调用updateStates更新volumesNeedUpdate中volume的信息
4.获取node详情的node.Status.VolumesAttached,更新volumesNeedUpdate中volume的DevicePath信息
5.调用desiredStateOfWorld.GetVolumesToMount()获取期望的volume信息,更新volumesNeedUpdate中volume的OuterVolumeSpecName信息
6.依次调用actualStateOfWorld.MarkVolumeAsAttached将volume标记为attached
7.依次将pod的信息加入的actualStateOfWorld中对应的volume中
8.调用actualStateOfWorld.MarkDeviceAsMounted将volume标记为已挂载到节点上了
9.调用desiredStateOfWorld.AddPodToVolume将volume的信息加入desiredStateOfWorld