k8s之informer简单理解
informer簡(jiǎn)介
Informer是一個(gè)能夠緩存apiserver的對(duì)象到本地、具有索引機(jī)制、并可以注冊(cè) EventHandler 的 client。使用 informer 的目的是為了減輕 apiserver 數(shù)據(jù)交互的壓力,其中本地緩存被稱為 localStore,索引被稱為 Indexer。
Informer流程:informer的listandwatch機(jī)制,默認(rèn)啟動(dòng)時(shí)從apiserver中整體list一次放到localstore中,有add、delete等事件時(shí)會(huì)通過(guò)watch機(jī)制把這個(gè)事件+對(duì)象放到deltaFIFO中,然后根據(jù)deltaFIFO中的內(nèi)容會(huì)先到localstore中更新,之后會(huì)經(jīng)過(guò)eventHandler進(jìn)入workQueue(這部分基于控制器機(jī)制實(shí)現(xiàn)),且workQueue會(huì)有ratelimiter,從而觸發(fā)controller的reconcile邏輯,并且LocalStore會(huì)每隔10h把所有的對(duì)象重新放到DeltaFIFO中,從而觸發(fā)controller。
?
其中eventHandler的具體實(shí)現(xiàn)是predicate。
Informer的詳細(xì)工作流程
(1)Informer 首先會(huì) list/watch apiserver,Reflector 包使用 ListAndWatch 的方法從 apiserver 中 list短連接 該資源的所有實(shí)例,list 會(huì)拿到該對(duì)象最新的 resourceVersion,然后使用 watch長(zhǎng)連接監(jiān)聽(tīng)該 resourceVersion 之后的所有變化,一旦該對(duì)象的實(shí)例有創(chuàng)建、刪除、更新動(dòng)作,Reflector 都會(huì)收到"事件通知",這時(shí)該事件及它對(duì)應(yīng)的API 對(duì)象這個(gè)組合被稱為增量(Delta),它會(huì)被放進(jìn) DeltaFIFO 中。
(2)Informer 會(huì)不斷地從這個(gè) DeltaFIFO 中讀取增量,每拿出一個(gè)對(duì)象,Informer 就會(huì)判斷這個(gè)增量的類型并創(chuàng)建或更新本地的緩存store。
如果事件類型是 Added(添加對(duì)象),那么 Informer 會(huì)通過(guò) Indexer庫(kù)把這個(gè)增量里的 API 對(duì)象保存到本地的緩存中,并為它創(chuàng)建索引,若為刪除操作,則在本地緩存中刪除該對(duì)象。
(3)DeltaFIFO 再 pop 這個(gè)事件到 controller 中,controller 會(huì)根據(jù)事先注冊(cè)的 ResourceEventHandler 回調(diào)函數(shù)進(jìn)行處理。在回調(diào)函數(shù)中其實(shí)只是做了一些簡(jiǎn)單的過(guò)濾,然后將關(guān)心變更的Object放到workqueue里。
(4)Controller從workqueue里面取出Object,啟動(dòng)一個(gè)worker來(lái)執(zhí)行自己的業(yè)務(wù)邏輯,業(yè)務(wù)邏輯通常是計(jì)算目前集群的狀態(tài)和用戶期望的狀態(tài)。在worker中也可以使用lister來(lái)獲取resource,而不用頻繁的訪問(wèn)apiserver,因?yàn)?apiserver中resource的變更都會(huì)反映到本地的cache中。
kubebuilder封裝的整體流程:
1、初始化一個(gè)manager,并創(chuàng)建cache、client。創(chuàng)建Cache主要是創(chuàng)建InformersMap,Scheme里每個(gè)gvk都創(chuàng)建了對(duì)應(yīng)的informer,通過(guò) InformersMap做gvk到informer的映射,每個(gè)informer會(huì)根據(jù)對(duì)應(yīng)的gvk進(jìn)行List和Watch。創(chuàng)建client主要是讀操作使用上面創(chuàng)建的cache,寫操作使用客戶端直連apiserver。
2/初始化reconciler/controller,?并對(duì)Controller 負(fù)責(zé)的 CRD 及CRD 管理的其他資源進(jìn)行watch,并且能夠注冊(cè)eventHandler,kubebuilder注冊(cè)的handler 就是將發(fā)生變更的對(duì)象的 NamespacedName放入workQueue隊(duì)列,然后執(zhí)行 Reconcile邏輯;
3、啟動(dòng) Manager,分別啟動(dòng)cache、controller。Cache的初始化核心是初始化informerMap,即所有的 Informer;Controller的初始化是啟動(dòng)goroutine不斷地查詢隊(duì)列,如果有變更消息則觸發(fā)到我們自定義的reconcile邏輯。
總結(jié)
以上是生活随笔為你收集整理的k8s之informer简单理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021 元宇宙研究报告!
- 下一篇: 轻拢慢捻,微服务熔断大总管