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