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

相关文章

来自专栏Youngxj

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

1544
来自专栏娱乐心理测试

GitHub上传文件不能超过100M的解决办法

3806
来自专栏苍云横渡学习笔记

【github常见操作和常见错误】错误提示:Permission denied (publickey). fatal: Could not read from remote repository.

(1)首先新建 SSH key,在git shell(或者git bash等命令窗口),注意大小写: $ ssh-keygen -t rsa -C "邮箱名"...

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

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

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

21110
来自专栏电光石火

重置网卡命令

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

2395
来自专栏Golang语言社区

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

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

3896
来自专栏北京马哥教育

使用lxc搭建虚拟机

使用lxc可以帮助我们搭建轻量级的虚拟机,这种虚拟机的对资源要求不高,非常适合在硬件条件受限时建立多台虚拟机的情况,有助于我们完成需要多节点参与的实验环境。 ...

3404
来自专栏Java Edge

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

30412
来自专栏Laoqi's Linux运维专列

nginx负载均衡

5396
来自专栏林德熙的博客

WPF 开发自动删除软件

我在写一个测试的工具,需要在用户的电脑使用,但是需要在运行之后 3 天内删除。这个功能是因为我是金鱼但是自己忘记删除了,但是可能需要多次使用,所以就需要让软件自...

521

扫码关注云+社区