Kubernetes Informer的示例分析是怎樣的,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括都昌網(wǎng)站建設(shè)、都昌網(wǎng)站制作、都昌網(wǎng)頁制作以及都昌網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,都昌網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到都昌省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
熟悉Kubernetes的小伙伴們想必會(huì)有一窺源碼的動(dòng)機(jī),領(lǐng)略大師的設(shè)計(jì)和實(shí)現(xiàn),從官方開放出來的go-sdk來切入Kubernetes應(yīng)該是個(gè)不錯(cuò)的選擇。在client-go的工具包里面,informer是一個(gè)主要的工具,下文是小編對(duì)inform組件的主要功能和部分代碼的簡單介紹,若有錯(cuò)誤之處,歡迎指出,小編果然獻(xiàn)出鐵頭,供大家輕拍。
主要功能:
List和Watch方法,從APIServer同步/解碼對(duì)象到本地緩存,另外提供本地緩存的訪問入口,減少對(duì)APIServer的訪問壓力。
AddEventHandler方法,handler注冊(cè)的入口,用戶變更對(duì)象之后觸發(fā)handler對(duì)應(yīng)的函數(shù),將對(duì)象狀態(tài)信息寫到workqueue,供worker消費(fèi)。
邏輯關(guān)系圖(引用徐超大神的分享):
代碼結(jié)構(gòu)淺析:
sharedInformerFactory
infomers成員:維護(hù)Type接口到SharedIndexInformer的map,此處映射到sharedIndexInformer struct指針變量,工廠設(shè)計(jì)模式。
startedInformers成員:維護(hù)Type接口到BOOL值的映射,啟動(dòng)informer之前在此判斷,避免重復(fù)啟動(dòng)infromer。
Start方法:迭代informers成員,調(diào)用informer.run方法啟動(dòng)informer。
InformerFor方法:為informers成員持續(xù)增加entry。
...
deploymentInformer
factory成員:實(shí)現(xiàn)SharedInformerFactory接口的結(jié)構(gòu)變量,此處賦值為sharedInformerFactory struct指針變量。
Informer方法:調(diào)用factory的InformerFor方法,返回sharedIndexInformer指針對(duì)象。
Lister方法:返回informer的indexer成員,用以讀取本地緩存。
...
sharedIndexInformer
indexer成員:實(shí)現(xiàn)Indexer接口,維護(hù)本地緩存(map[string]interface{}),此處賦值為cache struct指針變量。
controller成員:實(shí)現(xiàn)Controller接口,維護(hù)APIServer到本地緩存的同步機(jī)制,同時(shí)保持與processor的通訊,此處賦值為controller struct指針對(duì)象。
processor成員:保持與controller的通訊,觸發(fā)handler對(duì)應(yīng)的方法,此處賦值為sharedProcessor struct 指針對(duì)象。
AddEventHandler方法:創(chuàng)建processorListener struct值對(duì)象,append到processor成員的listeners和syncinglisteners。
HandleDelta方法:迭代controller.config.Queue.items[key](Delta切片),調(diào)用indexer.Add/Delete/Update更新本地緩存,同時(shí)調(diào)用processor.distribute方法,按需迭代processor的listeners和syncinglisteners,下發(fā)消息到listener的消息隊(duì)列。
...
indexer
cacheStorage成員:實(shí)現(xiàn)ThreadSafeStore接口,維護(hù)本地線程安全的緩存map[string]interface{},此處賦值為threadSafeMap struct指針變量。
keyFunc成員:維護(hù)本地緩存key的函數(shù)。
Add/Delete/Update/List方法:支撐對(duì)本地緩存的常用操作。
...
controller
reflector成員:利用resourceVersion機(jī)制銜接調(diào)用listerWatcher.List/Watch方法,從APIServer同步/解碼對(duì)象到config.Queue.items(map[string]Deltas)中,此處賦值為Reflect struct指針對(duì)象。
config成員:維護(hù)鏈隊(duì)列和對(duì)象操作映射(map[string]Deltas),此處賦值為Config struct值對(duì)象。
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成員:實(shí)現(xiàn)Store接口,此處賦值為DeltaFIFO struct指針對(duì)象。
listerWatcher成員:實(shí)現(xiàn)ListerWatcher的List/Watch方法,從APIServer同步/解碼對(duì)象,此處賦值為ListWatch struct指針變量。
ListAndWatch方法:調(diào)用listerWatcher成員的List/Watch方法,完成對(duì)象從APIServer的同步/解碼,然后調(diào)用syncWith和watchHandler方法,把事件和對(duì)象同步到store的存儲(chǔ)成員中。
syncWith方法:調(diào)用Store接口的Replace方法,同步事件和對(duì)象信息。
watchHandler方法:調(diào)用Store接口的Add/Update/Delete方法,同步事件和對(duì)象信息。
...
config
Queue成員:實(shí)現(xiàn)Queue接口,此處賦值為DeltaFIFO struct指針對(duì)象。
Process成員:值為sharedIndexInformer.HandleDelta方法。
...
DeltaFIFO
items成員:map[string]Deltas,存儲(chǔ)對(duì)象和操作信息。
queue成員:[]string,簡單的鏈隊(duì)列。
knownObjects成員:實(shí)現(xiàn)KeyListerGetter接口,此處賦值為cache struct指針對(duì)象。
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方法消費(fèi)消息。
addCh成員:從調(diào)用add方法生產(chǎn)消息,寫入本地pendingNotifications或者傳遞給nextCh。
pendingNotifications成員:維護(hù)本地緩沖消息,此處賦值為RingGrowing struct值對(duì)象。
pop方法:維護(hù)nextCh和addCh的消息傳遞。
run方法:消費(fèi)nextCh消息,按需調(diào)用processorListener.OnAdd/OnUpdate/OnDelete方法。
...
熟悉Informer實(shí)現(xiàn)的主要策略和機(jī)制之后,會(huì)對(duì)后續(xù)開發(fā)controller帶來很多的信心和好處,方便大家持續(xù)工作在Kubernetes平臺(tái)上。簡單描述informer的主要結(jié)構(gòu),還有一些需要研究的地方,比如說緩存壓縮,protobuf decode/encode機(jī)制,processListener的消息緩存機(jī)制,鎖通知機(jī)制等等,謝謝。
關(guān)于Kubernetes Informer的示例分析是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
分享名稱:KubernetesInformer的示例分析是怎樣的
文章分享:http://chinadenli.net/article16/giddgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、App開發(fā)、響應(yīng)式網(wǎng)站、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)