【原创】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 endpointport。

 

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平台为样例



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

 

4、imageManager工作流程

4.1、构建与服务启动

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

func NewMainKubelet(


以上就是构建imageManager

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

 

上图将其传入kubelet中

 

然后有两个地方执行

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


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

 

4. 2 详细流程

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

构建

 

看下结构体


当中基本的东西为imageRecord,用于保存image信息

 

4.2.1 start流程


启动了detectImages


上图中,通过dockerclient获取当前全部的images,和containers

将正在使用的images保存在imagesInUse

继续


流程就是,遍历全部的images。

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

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

       而且刷新其大小

 

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

 

小结:

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

 

4.2.2 GarbageCollect流程

首先通过cadvisor获取磁盘信息


然后依据ImageGCPolicy来推断是否回收磁盘

 

我们这里跟踪磁盘回收


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

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

继续


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

 

 

5、总结

imageManager整个流程都非常清晰

两个定时运行流程

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

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

 

 

龚浩华

qq 月牙寂 29185807

2016年4月12日

(版权声明:本文为作者原创,如需转载请通知本人。并标明出处和作者。

擅自转载的,保留追究其侵权的权利。)


posted @ 2017-08-08 11:28  jzdwajue  阅读(430)  评论(0编辑  收藏  举报