kubelet学习

kubelet学习

  1. 整体由Kubelet结构体为出发点,结构体里包含各种manager,实现对应功能

    • podManager:具体结构实现为basicManager(pod_manager.go)
    • workQueue:
  2. pod的生命周期处理

    • Kubelet的syncLoopIteration函数通过各种chan,获取需要处理的pods,交给podManager处理

      • configCh:配置发生变化的pods
        • 使用两级生产者-消费者模型
        • 一级生产-消费
          • 生产者:各种source,当前有3类source
          • 消费者:Mux的Channel函数里生成的newChannel
            • config.NewSourceFile:从文件中读取pods信息,用于管理面应用的管理,参数为–pod-manifest-path
            • config.NewSourceURL:从远端通过远程调用的方式获取pods信息,参数为–manifest-url
            • config.NewSourceApiserver:从apiserver获取pods,即拉取系统中的部署的应用pods
        • 两级模型的转化者:podStorage的Mergemerge函数
        • 二级生产-消费
          • 生产者:podStorage的updates
          • 消费者:PodConfig的updates
      • syncCh:同步所有等待的pods为了同步
        • 类型是time.Time,实际是一个Ticker,周期为1s
        • 获取podManager里的所有pods
        • handler为Kubelet,因为Kubelet实现了SyncHandler接口
      • housekeepingCh:清理的pods
        • 定期进行housekeeping,周期为2s
      • plegCh: PodLifecycleEventGenerator接口,具体实现GenericPLEG
        • 通过GenericPLEG的Watch函数返回plegCh
        • GenericPLEG的relist函数往plegCh传入event
        • 获取所有的pods,查看是否有变化
      • livenessManager.Updates(): liveness探针麻烦先失败,触发unhealthy,并发送给worker处理
      • readinessManager.Updates(): 处理readiness相关的pods
      • startupManager.Updates():启动结果
    • SyncHandler:是接口,Kubelet实现了该接口,Kubelet部分函数调用SyncHandler,通过把自己作为参数。作用是为了测试方便(for testability)。获取的pods都交给SyncHandler处理

      • HandlePodAdditions:处理新增的pods
      • HandlePodUpdates:处理修改的pods
      • HandlePodRemoves:处理被移除的pods
      • HandlePodReconcile:处理和解的pods
      • HandlePodSyncs:处理待同步的Pods
      • HandlePodCleanups:处理housekeeping产生的pods
    • Source生成pods供应podManager处理

      • sourceFile:通过单独goroutine定期扫描pod-manifest-path下面的文件,支持多目录,并且通过文件监听库fsnotify,监听文件的变化,对用pods的对应变化,具体函数sourceFile.produceWatchEvent。
      • sourceURL:定期调用extractFromURL,获取对应的pods
      • sourceApiserver(cache.Reflector):通过ListWatch机制从apiserver获取"spec.nodeName"为当前nodeName的pods
  3. WatchList机制实现

    • 定义的接口为Lister和Watcher,两个接口组合起来即ListerWatcher
    • 调用NewFilteredListWatchFromClient,返回ListWatch的ListerWatcher
    • cache.Reflector使用ListerWacher
      • Reflector的ListAndWatch函数
        • 先调用一下List函数,然后定期调用Watch函数,Watch函数返回watch.Interface,通过HTTP1.1的分块传输编码实现,即长连接实现,通过ListOptions参数的Watch参数设置为true。通过watch.Interface异步获取后续返回的消息
    • NewFilteredListWatchFromClient生成的ListWatch
      • Watch函数返回的是StreamWacher,里面的数据是Watch请求返回的response.Body
      • 通过watch.Interface异步获取后续返回的消息

学习点

  1. 日志通过defer支持执行超过多久打印的能力,很是方便
  2. 整体代码逻辑是通过struct组装的方式实现,不同struct实现不同的功能模块,这样逻辑清晰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值