溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes Informer的示例分析是怎樣的

發(fā)布時間:2021-10-12 09:51:14 來源:億速云 閱讀:147 作者:柒染 欄目:云計算

Kubernetes Informer的示例分析是怎樣的,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

熟悉Kubernetes的小伙伴們想必會有一窺源碼的動機,領(lǐng)略大師的設(shè)計和實現(xiàn),從官方開放出來的go-sdk來切入Kubernetes應(yīng)該是個不錯的選擇。在client-go的工具包里面,informer是一個主要的工具,下文是小編對inform組件的主要功能和部分代碼的簡單介紹,若有錯誤之處,歡迎指出,小編果然獻(xiàn)出鐵頭,供大家輕拍。

主要功能:

  1. List和Watch方法,從APIServer同步/解碼對象到本地緩存,另外提供本地緩存的訪問入口,減少對APIServer的訪問壓力。

  2. AddEventHandler方法,handler注冊的入口,用戶變更對象之后觸發(fā)handler對應(yīng)的函數(shù),將對象狀態(tài)信息寫到workqueue,供worker消費。

邏輯關(guān)系圖(引用徐超大神的分享):

Kubernetes Informer的示例分析是怎樣的

代碼結(jié)構(gòu)淺析:

sharedInformerFactory

  • infomers成員:維護(hù)Type接口到SharedIndexInformer的map,此處映射到sharedIndexInformer struct指針變量,工廠設(shè)計模式。

  • startedInformers成員:維護(hù)Type接口到BOOL值的映射,啟動informer之前在此判斷,避免重復(fù)啟動infromer。

  • Start方法:迭代informers成員,調(diào)用informer.run方法啟動informer。

  • InformerFor方法:為informers成員持續(xù)增加entry。

  • ...

deploymentInformer

  • factory成員:實現(xiàn)SharedInformerFactory接口的結(jié)構(gòu)變量,此處賦值為sharedInformerFactory struct指針變量。

  • Informer方法:調(diào)用factory的InformerFor方法,返回sharedIndexInformer指針對象。

  • Lister方法:返回informer的indexer成員,用以讀取本地緩存。

  • ...

sharedIndexInformer

  • indexer成員:實現(xiàn)Indexer接口,維護(hù)本地緩存(map[string]interface{}),此處賦值為cache struct指針變量。

  • controller成員:實現(xiàn)Controller接口,維護(hù)APIServer到本地緩存的同步機制,同時保持與processor的通訊,此處賦值為controller struct指針對象。

  • processor成員:保持與controller的通訊,觸發(fā)handler對應(yīng)的方法,此處賦值為sharedProcessor struct 指針對象。

  • AddEventHandler方法:創(chuàng)建processorListener struct值對象,append到processor成員的listeners和syncinglisteners。

  • HandleDelta方法:迭代controller.config.Queue.items[key](Delta切片),調(diào)用indexer.Add/Delete/Update更新本地緩存,同時調(diào)用processor.distribute方法,按需迭代processor的listeners和syncinglisteners,下發(fā)消息到listener的消息隊列。

  • ...

indexer

  • cacheStorage成員:實現(xiàn)ThreadSafeStore接口,維護(hù)本地線程安全的緩存map[string]interface{},此處賦值為threadSafeMap struct指針變量。

  • keyFunc成員:維護(hù)本地緩存key的函數(shù)。

  • Add/Delete/Update/List方法:支撐對本地緩存的常用操作。

  • ...

controller

  • reflector成員:利用resourceVersion機制銜接調(diào)用listerWatcher.List/Watch方法,從APIServer同步/解碼對象到config.Queue.items(map[string]Deltas)中,此處賦值為Reflect struct指針對象。

  • config成員:維護(hù)鏈隊列和對象操作映射(map[string]Deltas),此處賦值為Config struct值對象。

  • processloop方法:傳入config.Process成員,循環(huán)調(diào)用config.Queue.Pop方法。

  • ...

processor

  • listeners成員:processorListener struct指針變量的切片。

  • run方法:迭代listeners,調(diào)用processorListener.run/pop方法,觸發(fā)processorListener.handler.OnAdd/OnUpdate/OnDelete方法。

  • ...

reflector

  • store成員:實現(xiàn)Store接口,此處賦值為DeltaFIFO struct指針對象。

  • listerWatcher成員:實現(xiàn)ListerWatcher的List/Watch方法,從APIServer同步/解碼對象,此處賦值為ListWatch struct指針變量。

  • ListAndWatch方法:調(diào)用listerWatcher成員的List/Watch方法,完成對象從APIServer的同步/解碼,然后調(diào)用syncWith和watchHandler方法,把事件和對象同步到store的存儲成員中。

  • syncWith方法:調(diào)用Store接口的Replace方法,同步事件和對象信息。

  • watchHandler方法:調(diào)用Store接口的Add/Update/Delete方法,同步事件和對象信息。

  • ...

config

  • Queue成員:實現(xiàn)Queue接口,此處賦值為DeltaFIFO struct指針對象。

  • Process成員:值為sharedIndexInformer.HandleDelta方法。

  • ...

DeltaFIFO

  • items成員:map[string]Deltas,存儲對象和操作信息。

  • queue成員:[]string,簡單的鏈隊列。

  • knownObjects成員:實現(xiàn)KeyListerGetter接口,此處賦值為cache struct指針對象。

  • Pop方法:從queue成員pop,調(diào)用config.Process方法。

  • Add/Delete/Update/Replace方法:調(diào)用queueActionLocked方法。

  • queueActionLocked方法:維護(hù)items和queue成員。

  •  ...

processorListener

  • nextCh成員:從本地pendingNotifications或者addCh生產(chǎn)消息,run方法消費消息。

  • addCh成員:從調(diào)用add方法生產(chǎn)消息,寫入本地pendingNotifications或者傳遞給nextCh。

  • pendingNotifications成員:維護(hù)本地緩沖消息,此處賦值為RingGrowing struct值對象。

  • pop方法:維護(hù)nextCh和addCh的消息傳遞。

  • run方法:消費nextCh消息,按需調(diào)用processorListener.OnAdd/OnUpdate/OnDelete方法。

  • ...


熟悉Informer實現(xiàn)的主要策略和機制之后,會對后續(xù)開發(fā)controller帶來很多的信心和好處,方便大家持續(xù)工作在Kubernetes平臺上。簡單描述informer的主要結(jié)構(gòu),還有一些需要研究的地方,比如說緩存壓縮,protobuf decode/encode機制,processListener的消息緩存機制,鎖通知機制等等,謝謝。

關(guān)于Kubernetes Informer的示例分析是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI