淺析Kubernetes Informer

熟悉Kubernetes的小夥伴們想必會有一窺源碼的動機,領略大師的設計和實現,從官方開放出來的go-sdk來切入Kubernetes應該是個不錯的選擇。在client-go的工具包裏面,informer是一個主要的工具,下文是小編對inform組件的主要功能和部分代碼的簡單介紹,如有錯誤之處,歡迎指出,小編果真獻出鐵頭,供你們輕拍。設計模式

 

主要功能:緩存

  1. List和Watch方法,從APIServer同步/解碼對象到本地緩存,另外提供本地緩存的訪問入口,減小對APIServer的訪問壓力。
  2. 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的消息緩存機制,鎖通知機制等等,謝謝。

相關文章
相關標籤/搜索