美文网首页
kubelet启动之启动镜像管理器

kubelet启动之启动镜像管理器

作者: 微凉哇 | 来源:发表于2021-12-08 09:49 被阅读0次

    基于kubernetes v1.18.6

    概述

    镜像管理器包含运行时相关接口,拥有对镜像、pod操作的能力。

    主要功能如下:

    • 协助gc管理器对镜像垃圾回收(提供镜像列表)
    • 协助节点状态管理器记录当前节点镜像(imageCache

    镜像管理器数据结构

    type realImageGCManager struct {
        // Container runtime
        runtime container.Runtime
    
        // Records of images and their use.
        imageRecords     map[string]*imageRecord
        imageRecordsLock sync.Mutex
    
        // The image garbage collection policy in use.
        policy ImageGCPolicy
    
        // statsProvider provides stats used during image garbage collection.
        statsProvider StatsProvider
    
        // Recorder for Kubernetes events.
        recorder record.EventRecorder
    
        // Reference to this node.
        nodeRef *v1.ObjectReference
    
        // Track initialization
        initialized bool
    
        // imageCache is the cache of latest image list.
        imageCache imageCache
    
        // sandbox image exempted from GC
        sandboxImage string
    }
    

    工作流程解析

    镜像管理器是一个kubelet子模块,在kubelet启动流程内启动。

    boot-image-manager.png

    工作流程解析

    镜像管理器启动时会fork两个goroutine进行周期性调用,主要维护以下两个对象:

    • realImageGCManager.imageRecords: 记录镜像列表,以及镜像是否处于被使用状态。(五分钟更新一次,作为GC时清理镜像的依据)
    • realImageGCManager.imageCache: 用于记录节点状态(镜像列表缓存,三十秒更新一次。避免频繁调用运行时获取)

    显然这两个goroutine是可以合并的,源码确实也加了todo标识(// TODO(random-liu): Merge this with the previous loop.

    imageRecords对象解析

    imageRecords是一个map类型对象,key为镜像idvalueimageRecord对象。

    imageRecord对象记录了镜像的状态,包含GC所需要的信息:

    • firstDetected: 记录镜像被检测时间
    • lastUsed: 记录镜像上次被使用时间
    • size: 镜像大小

    imageCache对象解析

    imageCache是一个线程安全的对象,images是一个按镜像大小降序的镜像列表切片。

    type imageCache struct {
    // sync.Mutex is the mutex protects the image cache.
    sync.Mutex
    // images is the image cache.
    images []container.Image
    }
    

    源码实现

    func (im *realImageGCManager) Start() {
    
        // 每5分钟执行:
        //
        go wait.Until(func() {
            // Initial detection make detected time "unknown" in the past.
            var ts time.Time
            if im.initialized {
                ts = time.Now()
            }
            // 仅为了测试是否可以监控到节点镜像
            _, err := im.detectImages(ts)
            if err != nil {
                klog.Warningf("[imageGCManager] Failed to monitor images: %v", err)
            } else {
                im.initialized = true
            }
        }, 5*time.Minute, wait.NeverStop)
    
        // Start a goroutine periodically updates image cache.
        // TODO(random-liu): Merge this with the previous loop.
        go wait.Until(func() {
            images, err := im.runtime.ListImages()
            if err != nil {
                klog.Warningf("[imageGCManager] Failed to update image list: %v", err)
            } else {
                im.imageCache.set(images)
            }
        }, 30*time.Second, wait.NeverStop)
    
    }
    

    相关文章

      网友评论

          本文标题:kubelet启动之启动镜像管理器

          本文链接:https://www.haomeiwen.com/subject/goozxrtx.html