什么是informer机制
Informer機制是kubernetes中不依賴任何中間件的情況下僅通過HTTP協議實現消息的實時性、可靠性、順序性通信的一種機制。
k8s是典型的server-client架構。etcd存儲集群的數據信息,apiserver作為統一的操作入口,任何對數據的操作都必須經過apiserver。
客戶端通過ListAndWatch機制查詢apiserver,而informer模塊則封裝了List-watch。
ListAndwatch是k8s統一的異步消息處理機制,保證了消息的實時性、可靠性、順序性等,為聲明式風格的API奠定了良好的基礎,是k8s架構的精髓。
Informer也被稱為Shared Informer,它是可以共享使用的。
1. Reflector
Reflector 用于監控(Watch)指定的Kubernetes資源,當監控的資源發生變化時,觸發相應的變更事件,例如Added事件,Updated事件,Deleted事件,并將其資源對象存放到本地緩存DeltaFIFO中。
List在Controller重啟或Watch中斷的情況下,調用資源的list API羅列資源對象以進行全量更新,基于HTTP短鏈接實現
curl http://127.0.0.1:8080/api/v1/pods(1)r.listerWatcher.List用于獲取資源下的所有對象的數據,例如,獲取所有Pod的資源數據。獲取資源數據是由options的ResourceVersion控制的。如果ResourceVersion為0,則表示獲取所有Pod的資源數據;如果ResourceVersion非0,則表示根據資源版本號繼續獲取。
(2)listMetaInterface.GetResourceVersion用于獲取資源版本號。
(3)meta.ExtractList用于將資源數據(runtime.Object對象)轉換成資源對象列表([]runtime.Object對象)。
因為r.listerWatcher.List獲取的是資源下的所有對象的數據,例如所有的Pod資源數據,所以它是一個資源列表。
(4)r.syncWith用于將資源對象列表中的資源對象和資源版本號存儲至DeltaFIFO中,并會替換已存在的對象。
(5)r.setLastSyncResourceVersion用于設置最新的資源版本號。
Watch則在多次List之間進行,調用資源的watch API,基于當前的資源版本號監聽資源變更(如Added、Updated、Deleted)事件。
通過在Http請求中帶上watch=true,表示采用Http長連接持續監聽apiserver發來的資源變更事件。
curl http://127.0.0.1:8080/api/v1/watch/pods?watch=trueapiserver在response的HTTP Header中設置Transfer-Encoding的值為chunked,表示采用分塊傳輸編碼。每當有事件來臨,返回一個WatchEvent。
2. DeltaFIFO
DeltaFIFO可以分開理解,FIFO是一個先進先出的隊列,它擁有隊列操作的基本方法,例如Add、Update、Delete、List、Pop、Close等,而Delta是一個資源對象存儲,它可以保存資源對象的操作類型,例如Added操作類型、Updated操作類型、Deleted操作類型、Sync操作類型等。
DeltaFIFO與其他隊列最大的不同之處是,它會保留所有關于資源對象的操作類型,隊列中會存在擁有不同操作類型的同一個資源對象,消費者在處理該資源對象時能夠了解該資源對象所發生的事情。queue字段存儲資源對象的key,item字段通過map數據結構的方式存儲,value存儲的是對象的Delta數組。
DeltaFIFO本質上是一個先進先出的隊列,有數據的生產者和消費者,其中生產者是Reflector調用Add方法,消費者是Controller調用的Pop方法。
3. Indexer
Indexer是client-go用來存儲資源對象并自帶索引功能的本地存儲,Reflector從DeltaFIFO中將消費出來的資源對象存儲至Indexer。Indexer與Etcd集群中的數據完全保持一致。client-go可以很方便地從本地存儲中讀取相應的資源對象數據,而無需每次從遠程Etcd集群中讀取,以減輕Kubernetes API Server和Etcd集群的壓力。
總結
以上是生活随笔為你收集整理的什么是informer机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes Controlle
- 下一篇: 如何优化Golang中重复的错误处理