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