reflector机制-v1.5.2
什么是reflector机制
reflector是Kubernetes中一个相当重要的概念。reflector可以把ListWatcher中的数据不断地放入cache中,所以,reflector是ListWatcher和内存缓存cache之间的桥梁。
什么是ListWatcher
这里简要地介绍下ListWatcher。只要实现了List()和Watch()的结构体的值都可以称为ListWatcher,List()用来获取当前的值,Watch()获取更新,使用List()和Watch()就能保持cache中的数据和数据源一致。
ListWatcher通常实现了ResultChan()方法用来返回result channel,result channel中有供外界消费的数据。
什么是cache
cache可以理解为数据源在内存中的一个缓存,实现了Add(), Update(), Delete()等方法。具体的cache将在以后分析。
reflector
reflector定义在/pkg/client/cache/reflector.go中:
reflector中包含一个store,即之前说的cache;还有一个listerWatcher;及一个resyncPeriod变量标识resync的时间。
NewReflector()
先来看下reflector的生成函数,该函数比较简单,直接构造Reflector并返回。
Run() RunUntil()
Run()和RunUntil()都以routine的方式启动ListAndWatch()方法。不同的是,Run()传入的是wait.NeverStop,即该routine会一直执行不退出;RunUntil()会传入stopCh以通知routine退出。
ListAndWatch()
ListAndWatch()的流程为:
- 获取list:通过listerWatcher.List()获取list;
- 同步:调用syncWith()把list中的数据同步到Reflector的store(即cache)中;
- 处理控制通道:对resyncCh, stopCh, cancelCh进行监听处理。其中resyncCh是指到了一定的时间,就调用store.Resync();
- 生成watcher:使用w, err := r.listerWatcher.Watch(options)生成watcher,其中options设置有超时时间。
- 开始watch():调用watchHandler()。
|
|
watchHandler()
watchHandler()的作用是监听listWatcher的result channel,获取event,并根据event的Type更新到store中。
reflector机制在v1.1.2和v1.5.2之间的区别
Kubernetes v1.1.2中的reflector在一定时间之后,会重新进行ListWatch操作;
而在Kubernetes v1.5.2中,reflector中的watch超时交由apiserver去完成,当发生超时时,reflector中的listwatcher直接报错,进而重新执行listwatch操作。
每隔一段时间后,会执行store.resync()进行数据同步。resync()可以把cache中的数据重新以sync事件放入待处理队列中供controller处理,要达到controller和内部cache之间数据的同步。