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

本文详细分析了k8s kubelet组件中imageManager的实现,包括参数设置、CAdvisorInterface、工作流程及具体细节。imageManager负责管理镜像的生命周期,定时检查并清理不再使用的镜像,以保持磁盘空间在设定的阈值范围内。通过CAdvisor获取磁盘使用情况,并依据ImageGCHighThresholdPercent和ImageGCLowThresholdPercent策略进行镜像垃圾回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

本文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%%")

...

}

 

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

 

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

}

 

小结:传递了三个参数ImageGCHighThresholdPercent,ImageGCLowThresholdPercent被封装在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日

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

 

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值