熟悉Kubernetes的小夥伴們想必會有一窺源碼的動機,領略大師的設計和實現,從官方開放出來的go-sdk來切入Kubernetes應該是個不錯的選擇。在client-go的工具包裏面,informer是一個主要的工具,下文是小編對inform組件的主要功能和部分代碼的簡單介紹,如有錯誤之處,歡迎指出,小編果真獻出鐵頭,供你們輕拍。設計模式
主要功能:緩存
- List和Watch方法,從APIServer同步/解碼對象到本地緩存,另外提供本地緩存的訪問入口,減小對APIServer的訪問壓力。
- AddEventHandler方法,handler註冊的入口,用戶變動對象以後觸發handler對應的函數,將對象狀態信息寫到workqueue,供worker消費。
邏輯關係圖(引用徐超大神的分享):安全
代碼結構淺析:app
sharedInformerFactory函數
- infomers成員:維護Type接口到SharedIndexInformer的map,此處映射到sharedIndexInformer struct指針變量,工廠設計模式。
- startedInformers成員:維護Type接口到BOOL值的映射,啓動informer以前在此判斷,避免重複啓動infromer。
- Start方法:迭代informers成員,調用informer.run方法啓動informer。
- InformerFor方法:爲informers成員持續增長entry。
- ...
deploymentInformer工具
- factory成員:實現SharedInformerFactory接口的結構變量,此處賦值爲sharedInformerFactory struct指針變量。
- Informer方法:調用factory的InformerFor方法,返回sharedIndexInformer指針對象。
- Lister方法:返回informer的indexer成員,用以讀取本地緩存。
- ...
sharedIndexInformeroop
- indexer成員:實現Indexer接口,維護本地緩存(map[string]interface{}),此處賦值爲cache struct指針變量。
- controller成員:實現Controller接口,維護APIServer到本地緩存的同步機制,同時保持與processor的通信,此處賦值爲controller struct指針對象。
- processor成員:保持與controller的通信,觸發handler對應的方法,此處賦值爲sharedProcessor struct 指針對象。
- AddEventHandler方法:建立processorListener struct值對象,append到processor成員的listeners和syncinglisteners。
- HandleDelta方法:迭代controller.config.Queue.items[key](Delta切片),調用indexer.Add/Delete/Update更新本地緩存,同時調用processor.distribute方法,按需迭代processor的listeners和syncinglisteners,下發消息到listener的消息隊列。
- ...
indexer線程
- cacheStorage成員:實現ThreadSafeStore接口,維護本地線程安全的緩存map[string]interface{},此處賦值爲threadSafeMap struct指針變量。
- keyFunc成員:維護本地緩存key的函數。
- Add/Delete/Update/List方法:支撐對本地緩存的經常使用操做。
- ...
controller設計
- reflector成員:利用resourceVersion機制銜接調用listerWatcher.List/Watch方法,從APIServer同步/解碼對象到config.Queue.items(map[string]Deltas)中,此處賦值爲Reflect struct指針對象。
- config成員:維護鏈隊列和對象操做映射(map[string]Deltas),此處賦值爲Config struct值對象。
- processloop方法:傳入config.Process成員,循環調用config.Queue.Pop方法。
- ...
processor指針
- listeners成員:processorListener struct指針變量的切片。
- run方法:迭代listeners,調用processorListener.run/pop方法,觸發processorListener.handler.OnAdd/OnUpdate/OnDelete方法。
- ...
reflector
- store成員:實現Store接口,此處賦值爲DeltaFIFO struct指針對象。
- listerWatcher成員:實現ListerWatcher的List/Watch方法,從APIServer同步/解碼對象,此處賦值爲ListWatch struct指針變量。
- ListAndWatch方法:調用listerWatcher成員的List/Watch方法,完成對象從APIServer的同步/解碼,而後調用syncWith和watchHandler方法,把事件和對象同步到store的存儲成員中。
- syncWith方法:調用Store接口的Replace方法,同步事件和對象信息。
- watchHandler方法:調用Store接口的Add/Update/Delete方法,同步事件和對象信息。
- ...
config
- Queue成員:實現Queue接口,此處賦值爲DeltaFIFO struct指針對象。
- Process成員:值爲sharedIndexInformer.HandleDelta方法。
- ...
DeltaFIFO
- items成員:map[string]Deltas,存儲對象和操做信息。
- queue成員:[]string,簡單的鏈隊列。
- knownObjects成員:實現KeyListerGetter接口,此處賦值爲cache struct指針對象。
- Pop方法:從queue成員pop,調用config.Process方法。
- Add/Delete/Update/Replace方法:調用queueActionLocked方法。
- queueActionLocked方法:維護items和queue成員。
- ...
processorListener
- nextCh成員:從本地pendingNotifications或者addCh生產消息,run方法消費消息。
- addCh成員:從調用add方法生產消息,寫入本地pendingNotifications或者傳遞給nextCh。
- pendingNotifications成員:維護本地緩衝消息,此處賦值爲RingGrowing struct值對象。
- pop方法:維護nextCh和addCh的消息傳遞。
- run方法:消費nextCh消息,按需調用processorListener.OnAdd/OnUpdate/OnDelete方法。
- ...
總結:
熟悉Informer實現的主要策略和機制以後,會對後續開發controller帶來不少的信心和好處,方便你們持續工做在Kubernetes平臺上。本文簡單描述了informer的主要結構,還有一些須要研究的地方,好比說緩存壓縮,protobuf decode/encode機制,processListener的消息緩存機制,鎖通知機制等等,謝謝。