【原创】k8s源码分析-----kubelet(4)imageManager

本文qq空间链接:http://user.qzone.qq.com/29185807/blog/1460429307

本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51131261

源码为k8s v1.1.1稳定版本

 

2.3、imageManager

1、参数

代码在k8s.io\kubernetes\cmd\kubelet\app

 

结构体变量

type KubeletServer struct {

...

    ImageGCHighThresholdPercent    int

    ImageGCLowThresholdPercent     int

  CAdvisorPort                   uint

...

}

 

默认参数

func NewKubeletServer() *KubeletServer {

    return &KubeletServer{

...

        ImageGCHighThresholdPercent: 90,

        ImageGCLowThresholdPercent:  80,

   CAdvisorPort:                4194,

...

}

}

flag参数

func (s *KubeletServer) AddFlags(fs *pflag.FlagSet) {

...

    fs.UintVar(&s.CAdvisorPort, "cadvisor-port", s.CAdvisorPort, "The port of the localhost cAdvisor endpoint")

    fs.IntVar(&s.ImageGCHighThresholdPercent, "image-gc-high-threshold", s.ImageGCHighThresholdPercent, "The percent of disk usage after which image garbage collection is always run. Default: 90%%")

    fs.IntVar(&s.ImageGCLowThresholdPercent, "image-gc-low-threshold", s.ImageGCLowThresholdPercent, "The percent of disk usage before which image garbage collection is never run. Lowest disk usage to garbage collect to. Default: 80%%")

...

}

 

ImageGCHighThresholdPercentImageGCLowThresholdPercent:两个参数分别为镜像占用磁盘空间的比例,当超过最大比例的时候,就开始清理释放磁盘,当低于时停止清理。

 

CAdvisorPort:本地cAdvisor endpoint端口。

 

2、传递参数

代码依旧在k8s.io\kubernetes\cmd\kubelet\app 中

func (s *KubeletServer) KubeletConfig() (*KubeletConfig, error) {

...

    imageGCPolicy := kubelet.ImageGCPolicy{

        HighThresholdPercent: s.ImageGCHighThresholdPercent,

        LowThresholdPercent:  s.ImageGCLowThresholdPercent,

    }

...

return &KubeletConfig{

...

    CAdvisorInterface:         nil, // launches background processes, not set here

    

ImageGCPolicy:             imageGCPolicy,

...

}

}

 

其中注意一个CAdvisorInterface,这里初始化为nil

 

func (s *KubeletServer) Run(kcfg *KubeletConfig) error {

...


...

}

CAdvisorInterface是在,Run中配置的

 

构建了一个KubeletConfig

func createAndInitKubelet(kc *KubeletConfig) (k KubeletBootstrap, pc *config.PodConfig, err error) {

...

k, err = kubelet.NewMainKubelet(

...

        kc.CAdvisorInterface,

        kc.ImageGCPolicy,

...

}

    if err != nil {

        return nil, nil, err

    }

 

    k.BirthCry()

 

    k.StartGarbageCollection()

 

    return k, pc, nil

}

 

小结:传递了三个参数ImageGCHighThresholdPercentImageGCLowThresholdPercent被封装在ImageGCPolicy中传递,CAdvisorInterface在Run中设置好了。


3、CAdvisorInterface

我们看看CAdvisorInterface都提供哪些操作

代码在k8s.io\kubernetes\pkg\kubelet\cadvisor

我们以linux平台为例子

【原创】k8s源码分析-----kubelet(4)imageManager_第1张图片

【原创】k8s源码分析-----kubelet(4)imageManager_第2张图片【原创】k8s源码分析-----kubelet(4)imageManager_第3张图片

我们这里不具体的去分析CAdvisorInterface,知道它是提供什么接口,做什么用的就好了。

 

4、imageManager工作流程

4.1、构建与服务启动

代码在k8s.io\kubernetes\pkg\kubelet\kubelet.go中

func NewMainKubelet(


以上就是构建imageManager

其中dockerclient在之前的的文章中已经分析过,可以看(【原创】k8s源码分析-----kubelet(2)dockerClient

 【原创】k8s源码分析-----kubelet(4)imageManager_第4张图片

上图将其传入kubelet中

 

然后有两个地方运行

1、在StartGarbageCollection中会启动一个定时任务

【原创】k8s源码分析-----kubelet(4)imageManager_第5张图片

2、在func (kl *Kubelet) Run中会启动imageManager

 

4. 2 具体流程

代码在k8s.io\kubernetes\pkg\kubelet\image_manager.go

构建

 

看下结构体

【原创】k8s源码分析-----kubelet(4)imageManager_第6张图片

其中主要的东西为imageRecord,用于保存image信息

【原创】k8s源码分析-----kubelet(4)imageManager_第7张图片 

4.2.1 start流程


启动了detectImages

【原创】k8s源码分析-----kubelet(4)imageManager_第8张图片

上图中,通过dockerclient获取当前所有的images,和containers

将正在使用的images保存在imagesInUse

继续

【原创】k8s源码分析-----kubelet(4)imageManager_第9张图片

流程就是,遍历所有的images。

1、放入当前存在的images队列中,currentImages

2、放入到imageRecords中。并判断是否正在使用,如果是,则刷新其最后使用时间

       并且刷新其大小

 

最后遍历imageRecords,判断是否有不在当前images中的记录,有则删除掉

 

小结:

定时获取所有的images,然后扫描判断是否正在使用,并刷新最后使用时间和其大小。然后将记录中的,老记录删除掉

 

4.2.2 GarbageCollect流程

首先通过cadvisor获取磁盘信息

【原创】k8s源码分析-----kubelet(4)imageManager_第10张图片

然后根据ImageGCPolicy来判断是否回收磁盘

【原创】k8s源码分析-----kubelet(4)imageManager_第11张图片 

我们这里跟踪磁盘回收


上图中,首先调用detectImages刷新imageRecords

然后将images根据最后使用时间来进行排序

继续


将当前不在使用的images删除掉

 

 

5、总结

imageManager整个流程都很清晰

两个定时执行流程

1、定时刷新images的最后使用时间

2、定时获取磁盘大小,根据ImageGCPolicy来判断是否进行磁盘回收。主要回收最后使用时间before now的images

 

 

龚浩华

qq 月牙寂 29185807

2016年4月12日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)


你可能感兴趣的:(源码,golang,容器,k8s)