k8s源码分析-----kubelet(4)imageManager

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

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

源码为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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

2.制作第一个驱动程序

先讲解驱动框架,然后写出first_drv驱动程序,来打印一些信息 写出first_drv驱动程序需要以下几步: (1)写出驱动程序first_drv_open...

1715
来自专栏我的博客

PHP敏感函数关闭参考

搜索disable_functions 然后改为=disable_functions=phpinfo,dl, exec, system,passthru,pop...

2968
来自专栏Jack-Cui

Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果

运行平台:Windows Python版本:Python3.x IDE:Sublime text3     上一篇内容,已经学会了使用简单的语句对网页进行抓...

2225
来自专栏Play & Scala 技术分享

PlayScala 2.5.x - 关闭X-Forwarded-For解析

2544
来自专栏游戏杂谈

Perl遍历目录

1、默认activePerl下的采用的编码是gbk,所以需要将字符串转为gbk才不会显示乱码

61
来自专栏BeJavaGod

使用shiro自定义过滤器,拦截ajax请求,可用于动静分离

shiro,不多说了,都知道是权限框架 用过shiro的都知道shiro自己有各种过滤器,只要配置好了就可以自动过滤,自动跳转到对应的页面,比如:认证,授权,退...

4275
来自专栏weixuqin 的专栏

一些杂想

(目前个人认为,Django 还是应该使用 Django1.11版本,稳定长期支持到2020年,兼容性也好。)

793
来自专栏linux系统运维

shell介绍,命令历史,命令不全和别名,通配符以及输出重定向

1775
来自专栏程序员互动联盟

【专业技术第七讲】linux下如何编译C语言?

存在问题: 小伙伴们都知道gcc -c -o 但是其中的过程和一些参数就不是太清楚了,往往编译出错不知道咋办? 解决方案: 我们来简单普及一下,让大家不盲从请...

3195
来自专栏康怀帅的专栏

PHP 文件相关函数

本文介绍了 PHP 文件的相关函数。本文只是部分列举,详情请查看官方文档。 官方文档:http://php.net/manual/zh/book.dir.php...

2867

扫码关注云+社区