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 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

生成ssh key1 检查是否已经存在ssh key2 生成key3 git clone

30712
来自专栏电光石火

CentOS 安装 Maven

 1、官网找到最新版的安装包: http://maven.apache.org/download.cgi 拷贝文件名为 *-bin.tar.gz 的链接地址 ...

2256
来自专栏菩提树下的杨过

"org.jboss.netty.internal.LoggerConfigurator".DESCRIBED is already registered 的解决办法

今天在jboss 6.2 EAP上部署一个项目时,报以下错误: org.jboss.msc.service.DuplicateServiceException:...

22210
来自专栏爱撒谎的男孩

Linux使用

4053
来自专栏Youngxj

让访客自动加自己为QQ好友代码

1864
来自专栏Golang语言社区

Golang语言--反射的用处--代码自动生成

背景: go语言处理db、json的时候,具体代码的变量定义和db字段、json输出的时候可能不一样。 这个时候,我们需要用tag的方式来进行定义。 例如: ?...

4006
来自专栏搞前端的李蚊子

超简单的批量创建文件夹方法

1.首先新建一个txt文档 ? 2.在文档里以md开头(md是命令行创建文件夹命令mkdir的缩写) ,后面跟你想要创建的文件夹名称 ? 3.点击另存为选择将保...

2919
来自专栏GreenLeaves

Oracle 删除监听程服务

1、开始->运行->输入regidit -> ? -> ? -> ? -> ? -> ? 红框内的右键删除 2、开始->运行->输入regidit -> ? -...

3448
来自专栏电光石火

重置网卡命令

前几天有人问我网络被篡改了怎么办? 我在这里分享一下重置网卡命令 1开始→运行→输入:CMD 点击确定(或按回车键),打开命令提示符窗口。 ...

3065
来自专栏醉生梦死

登录服务器后,提示-bash-4.2# 该如何解决?

-bash-4.2# 看到后面的 “ # ”吗?说明您使用的root用户登录的,您此时该去查看:

66413

扫码关注云+社区