kubelet学习
-
整体由Kubelet结构体为出发点,结构体里包含各种manager,实现对应功能
- podManager:具体结构实现为basicManager(pod_manager.go)
- workQueue:
-
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的Merge和merge函数
- 二级生产-消费
- 生产者: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():启动结果
- configCh:配置发生变化的pods
-
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
-
-
WatchList机制实现
- 定义的接口为Lister和Watcher,两个接口组合起来即ListerWatcher
- 调用NewFilteredListWatchFromClient,返回ListWatch的ListerWatcher
- cache.Reflector使用ListerWacher
- Reflector的ListAndWatch函数
- 先调用一下List函数,然后定期调用Watch函数,Watch函数返回watch.Interface,通过HTTP1.1的分块传输编码实现,即长连接实现,通过ListOptions参数的Watch参数设置为true。通过watch.Interface异步获取后续返回的消息
- Reflector的ListAndWatch函数
- NewFilteredListWatchFromClient生成的ListWatch
- Watch函数返回的是StreamWacher,里面的数据是Watch请求返回的response.Body
- 通过watch.Interface异步获取后续返回的消息
学习点
- 日志通过defer支持执行超过多久打印的能力,很是方便
- 整体代码逻辑是通过struct组装的方式实现,不同struct实现不同的功能模块,这样逻辑清晰