日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

k8s之client-go的工作邏輯

作者:傅里葉、 更新時間: 2022-07-03 編程語言

(1) Reflector通過clientset來 list和watch(Added/Modified/Deleted/BooMark事件)和resync apiserver的特定資源;

(2) Reflector作為生產者將數據發送到Delta FIFO Queue,其中Reflector的list事件對應Delta FIFO的Replaced事件,Reflector的watch的Added/Modified/Deleted事件對應Delta FIFO的Added/Updated/Deleted事件,Reflector的resync事件對應Delta FIFO的sync事件;

(3) Delta FIFO Queue的消費者之一是Indexer,將資源按照一定的索引緩存到本地;

(4) Delta FIFO Queue的另一個消費者是SharedProcessor,將對應的事件通過eventHandler把namespace/name放到workQueue中;

(5) sharedInformer是Reflector、Delta FIFO Queue、Indexer、SharedProcessor的粘合劑;

(6) Worker從workQueue中拿到namspace/name,再根據namespace/name從indexer中獲取具體的資源;

??????????????

?

client-go代碼邏輯:config、clientset、informerFactory、add event handler、informerFactory.start、 controller.start、reconcile

78、Reflector原理

作用:通過clientset來listAndWatch指定的資源,并更新到delta fifo queue中。

在client-go/tools/cache包下;

List是全量更新,在controller啟動時調用,watch是增量更新;

Watch事件:added/modified/deleted/Bookmark(減少apiserver負載,只獲取最新的resourceVersion)

79、Delta FIFO Queue原理

具有去重功能,并且能夠知道相較于上次發生了哪些變化;

DeltaFIFOQueue的生產者:Reflector的list(Replaced事件)、watch(Added/Updated/Deleted事件)、resync(sync事件);

DeltaFIFOQueue消費者:workQueue、帶索引的本地緩存Indexer;

Delta類型有Added/Updated/Deleted/Replaced/sync類型事件;

80、Indexer原理

將資源按照一定的索引緩存到本地,基于cache即threadSafeMap實現,如指定ns獲取pod。

Type Indexers Map[string]IndexFunc:key是索引的分類名,比如namespace,value是一個方法,通過該方法可以獲取obj的namespace比如default;

Type Indices Map[string]Index:key是索引的分類名,比如namespace;

Type Index Map[string]sets.String:key是IndexFunc計算出來的結果,比如default,value是所有obj的key的集合;

81、SharedInformer原理

作為Reflector、Delta FIFO Queue、Indexer、SharedProcessor的粘合劑,組合起來使用;

其中SharedProcessor是事件監聽處理器;

82、WorkQueue原理

主要有三種隊列:

優先級隊列PriorityQueue:出隊時,最高優先級的元素最先出隊,實現是heap(完全二叉樹);
延遲隊列DelayingQueue:延時阻塞出隊,實現是PriorityQueue+waitingLoop;
限速隊列RateLimitingQueue:實現是令牌桶+DelayingQueue+PriorityQueue;

其中processing 記錄了正在處理的item,dirty記錄了和processing 中重復的待處理item,保證同一時間只有一個相同的item被處理

補充:

83、Client-go代碼目錄結構

client-go:go版本的工具庫,用于與apiserver進行通信,k8s內置的控制器也通過client-go與apiserver進行交互;

Client-go的目錄結構:

Kubernetes 包含所有訪問k8s api的clientset;

Rest包含restclient的邏輯;

Informer包含所有內置資源的informer,便于操作k8s的資源對象;

Listers包含所有內置資源的lister,用于讀取緩存中k8s資源對象中的信息;

Discovery用于發現k8s提供的資源組、資源版本和資源信息,比如kubectl api-versions kubectl api-resources;

dynamic包含dynamic client的邏輯,通過dynamic可以操作任意的k8s對象;

Plugin/pkg/client/auth包含所有可選的認證插件;

Transport包含創建、鏈接、認證的邏輯,被上層的clientset使用;

Tools包含一系列編寫控制器時用到的工具;

Util包含一系列工具類;

84、Client的類型

- `RESTClient`: 最基礎的客戶端,提供最基本的封裝
- `Clientset`:是一個Client的集合,在Clientset中包含了所有K8S內置資源的Client,通過Clientset便可以很方便的操作如Pod、Service這些資源
- `dynamicClient`:動態客戶端,可以操作任意K8S的資源,包括CRD定義的資源
- `DiscoveryClient`:用于發現K8S提供的資源組、資源版本和資源信息,比如:`kubectl api-resources`或`kubectl api-versions`

85、client-go存儲類型

- **cache**:實現Store,利用threadSafeMap存放數據;
- **UndeltaStore**:實現Store,利用cache存放數據,數據變更時通過PushFunc發送當前完整狀態;
- **FIFO**:實現Queue(包含Store),利用自己內部的items數據結構存放數據;
- **DeltaFIFO**: xxx;
- **Heap**:實現Store,利用data數據結構存放數據,實現堆數據結構,用于優先級隊列;
- **ExpirationCache**:實現Store,利用threadSafeMap存放數據;

原文鏈接:https://blog.csdn.net/qq_34562093/article/details/125491472

欄目分類
最近更新