k8s源码分析系列-kube-controller-manager(list&watch)源码分析导图

k8s-list&watch源码解析.jpg

这里以Deployment的控制器的list&watch为例:
1、在controller-manager的Run函数部分调用了InformerFactory.Start的方法,Start方法初始化各种类型的informer,并且每个类型起了个informer.Run的goroutine。需要注意的是controller-manager中是先启动每个资源对象的controller然后在统一启动InformerFactory;
2、简单的说就是在初始化DeploymentController对象的时候完成了deployment的sharedIndexformer(本地缓存结构体)的初始化初始化同时也完成了将deployment资源的增、删、改的事件处理的函数(也就是上面提到的Resource Event Handlers资源事件回调函数)注册到sharedIndexformer当中,处理deployment资源增、删、改的函数主要是用于将变更的deployment资源实例对象存入DeploymentController对象中的worker queue,然后DeploymentController从worker queue队列中拿出变更的实例资源进行业务上的处理;
3、通过协程的方式启动DeploymentController的控制器,该控制器启动的时候会等待本地indexer缓存完成deployment资源实例的数据从api-server同步到本地;(到这里上面的步骤主要是完成DepoymentController对象的初始化、该对象的底层存储结构初始化以及该对象的增、删、改的回调函数的注册)
4、然后启动InformerFactory.Start(会启动每个资源对象的shareIndexformer),对应资源对象的(如:这里的deployment资源对象的)sharedIndexformer会初始化DeltaFIFO实例对象(即queue队列),同时将DeltaFIFO、list&watch、Process(sharedIndexformer的一个方法用于从DeltaFIFO队列中获取资源对象往worker queue队列中添加的方法即上面提到的Resource Event Handlers资源事件回调函数)、资源对象种类传入Config初始化controller。DeltaFIFO的队列来存储对象变化的数据。然后调用processor.Run和controller.Run函数;
5、启动controller后会根据DeltaFIFO对象、list&watcher、资源种类等参数去初始化Reflector对象;
6、然后启动Reflector,Reflector的主要作用是watch指定的k8s资源,并将变化同步到本地是store中。Reflector以resyncPeriod为周期定期执行list的操作(当非零的时候,会按该周期执行list,设置为0时,Reflector不会自动定期重新同步资源。相反,它只会在启动时获取一次资源列表,并在随后的事件中依赖于事件通知来更新缓存),这样就可以使用Reflector来定期处理所有的对象,也可以逐步处理变化的对象;
7、Reflector接着执行ListAndWatch函数,ListAndWatch第一次会列出所有的对象将这些对象同步到本地缓存indexer中,并获取资源对象的版本号,然后watch资源对象的版本号来查看是否有被变更。首先会将资源版本号设置为0,list()可能会导致本地的缓存相对于etcd里面的内容存在延迟,Reflector会通过watch的方法将延迟的部分补充上(watch的周期默认为1秒,超时时间默认5分钟),使得本地的缓存数据与etcd的数据保持一致;
8、最后controller.Run函数还会调用processLoop函数(即deltafifo的Pop方法将资源对象从deltaFIFO队列中取出),processLoop通过调用HandleDeltas,再调用distribute完成对资源对象的封装成为notification资源类型发往processorListener的管道中,processorListener.add最终将不同变更的类型对象加入processorListener的channel中,供processorListener.Run使用。processLoop死循环的从DeltaFIFO队列中Pop即取出资源对象往worker queue队列中添加,以及将资源对象同步到本地缓存indexer中;
9、DeploymentController的syncDeployment获取到worker queue队列中的资源实例进行业务上的处理;

转载请标注出处!

你可能感兴趣的:(k8s源码分析系列-kube-controller-manager(list&watch)源码分析导图)