網站首頁 編程語言 正文
(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
相關推薦
- 2022-08-10 詳解C語言中雙向循環鏈表的實現_C 語言
- 2022-09-08 Go語言中的Struct結構體_Golang
- 2022-04-18 http通過StreamingHttpResponse完成連續的數據傳輸長鏈接方式_python
- 2022-07-31 pandas中提取DataFrame某些列的一些方法_python
- 2023-02-12 詳解C#如何實現隱式類型轉換_C#教程
- 2022-09-05 Spring的 @Autowired注解底層原理
- 2022-09-23 flutter實現切換頁面緩存_Android
- 2023-10-17 修改火狐瀏覽器滾動條樣式
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支