深入源碼分析kubernetes informer機制(三)Resync


[閱讀指南]
這是該系列第三篇
基于kubernetes 1.27 stage版本
為了方便閱讀,后續所有代碼均省略了錯誤處理及與關注邏輯無關的部分。


文章目錄

  • 為什么需要resync
  • resync做了什么

為什么需要resync

如果看過上一篇,大概能了解,client數據主要通過reflector 的list/watch進行同步。

回顧一下informer整體的數據同步邏輯。

  1. informer初始化時,調用list接口獲取制定類型的全量資源數據,此時的resource version默認為0。假如指定資源類型為pod,那么就是獲取所有pod數據
  2. list 獲取到數據后,將全量數據同步到本地緩存。首次list完成后,informer后續都將通過watch來同步資源更新
  3. watcher監控到資源更新事件,將接收到的事件放入存儲隊列中(delta FIFO)
  4. informer 的另一個process會不斷取出存儲隊列中的delta事件進行數據更新
  5. 緩存數據更新成功后,將數據變化通過回調函數同步至custom controller workqueue中
  6. custom controller順序處理workqueue中的數據變更事件
    在這里插入圖片描述

流程包括了三端的數據同步。

  • 首先api-server與informer中間通過sourceVersion可以保證數據的一致性
    client攜帶本地的sourceVersion請求api-server,api-server會將最新版本的增量變化通過事件返回給client。
    如圖所示,在此期間,如果數據連接發生任何異常,informer會在重新建立watcher連接時,攜帶上個版本的sourceVersion,并再次更新所有的增量變化。
    在這里插入圖片描述

  • 然后是本地informer與custom之間,通過workqueue來進行事件通知。
    informer的協程將FIFO隊列中的事件取出更新至本地后,還會將事件同步回調至custom controller,加入到workqueue隊列中。
    但是回看informer的代碼,informer在處理回調事件時,并不會關注回調的結果。
    在這里插入圖片描述

也就是說,如果custom controller側的消費出現異常導致數據同步失敗,informer是不知情的。

所以還需要引入別的機制來保障custom數據與本地緩存的一致性,以維持體的可靠性,也就是resync。
(當然如果controller本身也存在對比sourceVersion的邏輯,其實不需要這一機制也是可以確保數據一致的,resync相當于從框架層增加了一層保護,這篇博客有對相關的問題進行探討)

resync做了什么

resync的邏輯非常簡單,就是定時將本地緩存中所有的資源對象生成事件重新推送到FIFO中,重新觸發controller的回調。
參考《Programming Kubernetes》一書中的概念,其實就是在邊緣觸發,水平驅動的基礎上,附加了定時同步的能力。
在這里插入圖片描述

具體來看下resync的代碼實現。

informer在初始化時指定了resync執行間隔。

// informer創建方法
func NewIndexerInformer(lw ListerWatcher,objType runtime.Object,resyncPeriod time.Duration, // Resync執行周期h ResourceEventHandler,indexers Indexers,
) (Indexer, Controller) {}// workqueue調用示例
// 0 代表不重復執行
indexer, informer := cache.NewIndexerInformer(podListWatcher, &v1.Pod{}, 0, cache.ResourceEventHandlerFuncs{...})

在informer初始化完成后,拉起一個協程進行定時resync

func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error {...go r.startResync(stopCh, cancelCh, resyncerrc)return r.watch(w, stopCh, resyncerrc)
}

該協程會按照informer配置的時間間隔定時調用存儲對象的resync方法。
比較特殊的是,sharedIndexInformer類型的informer會另外有ShouldResync方法來輪詢每個監聽了當前資源對象的listener的是否需要進行resync操作。

func (r *Reflector) startResync(stopCh <-chan struct{}, cancelCh <-chan struct{}, resyncerrc chan error) {resyncCh, cleanup := r.resyncChan() // 返回一個觸發resync的信號,內部實現就是一個timerdefer func() {cleanup() // Call the last one written into cleanup}()for {select {case <-resyncCh:case <-stopCh:returncase <-cancelCh:return}// sharedIndexInformer 中用ShouldResync()來管理各個listener的resyncif r.ShouldResync == nil || r.ShouldResync() {if err := r.store.Resync(); err != nil { resyncerrc <- err return}}cleanup()resyncCh, cleanup = r.resyncChan()}
}

resync只做一件事,將本地緩存里的資源對象全部重新添加到FIFO隊列中,再觸發contronller處理一次。
不過,為了避免與最新的變更發生沖突,FIFO隊列中已有delta且還沒有處理的資源對象,不會被重新添加。

func (f *DeltaFIFO) Resync() error {f.lock.Lock()defer f.lock.Unlock()if f.knownObjects == nil {return nil}// f.knownObjects 可以獲取到本地緩存中所有資源對象的列表keys := f.knownObjects.ListKeys()for _, k := range keys {// 過濾掉已經有新的事件在隊列中等待處理的資源對象// 把所有資源對象以resync類型添加到隊列中if err := f.syncKeyLocked(k); err != nil {return err}}return nil
}

參考:
https://www.kubernetes.org.cn/2693.html
https://github.com/cloudnativeto/sig-kubernetes/issues/11
https://www.cnblogs.com/WisWang/p/13897782.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40169.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1、基于 CentOS 7 構建 LVS-DR 群集。 2、配置nginx負載均衡

一、基于CentOS7和、構建LVS-DR群集 準備四臺虛擬機 ip作用192.168.27.150客戶端192.168.27.151LVS192.168.27.152RS192.168.27.152RS 關閉防火墻 [rootlocalhost ~]# systemctl stop firewalld安裝ifconfig yum install net-tools.x86_64 -y1、DS上 1.1 配置LVS虛擬IP …

uniapp開發微信小程序使用painter將頁面轉換為圖片并保存到本地相冊

引言 我使用到painter的原因是&#xff0c;在uniapp開發微信小程序時&#xff0c;需要將一個頁面的內容轉換成圖片保存到本地相冊。 起初在網上找到很多都是在uniapp中使用 html2canvas 將網頁轉換成圖片再jspdf將圖片轉換為pdf&#xff0c;但是這種方式在小程序環境不支持&am…

opencv進階08-K 均值聚類cv2.kmeans()介紹及示例

K均值聚類是一種常用的無監督學習算法&#xff0c;用于將一組數據點分成不同的簇&#xff08;clusters&#xff09;&#xff0c;以便數據點在同一簇內更相似&#xff0c;而不同簇之間差異較大。K均值聚類的目標是通過最小化數據點與所屬簇中心之間的距離來形成簇。 當我們要預測…

opencv實現以圖搜圖

這里寫目錄標題 1. 步驟1.1 導入OpenCV庫&#xff1a;1.2 加載圖像1.3 提取特征1.4 匹配特征1.5 顯示結果 2. 完整代碼3. 測試圖片及效果 1. 步驟 1.1 導入OpenCV庫&#xff1a; 在您的C代碼中&#xff0c;首先需要導入OpenCV庫。您可以使用以下語句導入核心模塊&#xff1a;…

人工智能算法-SVM, KNN

目錄 SVM, KNN區別 一、KNN算法概述 算法的描述: 二、關于K的取值 K的取法: 三、關于距離的選取 Euclidean Distance 定義: 四、總結 SVM, KNN區別

化繁為簡,使用Hibernate Validator實現參數校驗

前言 在之前的悅享校園的開發中使用了SSM框架&#xff0c;由于當時并沒有使用參數參數校驗工具&#xff0c;方法的入參判斷使用了大量的if else語句&#xff0c;代碼十分臃腫&#xff0c;因此最近在重構代碼時&#xff0c;將框架改為SpringBoot后&#xff0c;引入了Hibernate V…

有一種新型病毒在 3Ds Max 環境中傳播,如何避免?

3ds Max渲染慢&#xff0c;可以使用渲云渲染農場&#xff1a; 渲云渲染農場解決本地渲染慢、電腦配置不足、緊急項目渲染等問題&#xff0c;可批量渲染&#xff0c;批量出結果&#xff0c;速度快&#xff0c;效率高。 此外3dmax支持的CG MAGIC插件專業版正式上線&#xff0c;…

機器學習筆記(1):機器學習入門的概念

導航 一、 人工智能&#xff0c;機器學習&#xff0c;深度學習和傳統學習二、數學基礎三、編程語言 如果你剛剛入門機器學習&#xff0c;會接觸到了非常多的概念。比如人工智能&#xff0c;機器學習&#xff0c;深度學習&#xff0c;神機網絡&#xff0c;強化學習&#xff0c;各…

0基礎學習VR全景平臺篇 第85篇:智慧眼-如何分配角色的權限?

一、功能說明 角色權限&#xff0c;是指給智慧眼的所有角色成員分配具體的操作權限。 二、后臺編輯界面 1、點擊“添加權限”&#xff0c;選擇其可操作的“權限”。注意權限只能逐項選擇&#xff0c;所以如果某個角色擁有多項權限的話&#xff0c;那么需要進行多次添加。“快…

uniapp app 實現右上角回首頁;點homeButton返回上一頁;onNavigationBarButtonTap不生效問題

場景&#xff1a; app&#xff0c;Android移動端 實現點擊右上角圖標&#xff0c;回首頁。 問題&#xff1a;用了官網的 homeButton&#xff0c;圖標正常展示了&#xff0c;也可點擊&#xff0c;但每次點擊后是會返回上一頁而非首頁。 后來查到說&#xff0c;要結合onNavigatio…

linux兩臺服務器互相備份文件(sshpass + crontab)

crontab crontab是linux系統自帶的定時調度軟件&#xff0c;可用于設置周期性被執行的指令&#xff0c;一般用在每天的非高峰負荷時間段運行作業&#xff0c;可在無需人工干預的情況下運行作業。支持在一周或一月中的不同時段運行。 crontab命令允許用戶提交、編輯或刪除相應的…

滴滴Ceph分布式存儲系統優化之鎖優化

摘自&#xff1a;https://mp.weixin.qq.com/s/oWujGOLLGItu1Bv5AuO0-A 2020-09-02 21:45 0.引言 Ceph是國際知名的開源分布式存儲系統&#xff0c;在工業界和學術界都有著重要的影響。Ceph的架構和算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat…

Transformers架構系列---transformers庫的使用

Transformers最初是由Google發布的論文 Attention is All You Need (2017) 提出的一種新的深度學習網絡架構,這篇論文證明了序列模型(如 LSTM)可以完全被注意力機制取代,甚至可以獲得更好的性能。Transformers網絡結構自2017年提出之后僅僅一兩年的時間內就一直在NLP領域及…

Vue:使用Promise.all()方法并行執行多個請求

在Vue中&#xff0c;可以使用Promise.all()方法來并行執行多個請求。當需要同時執行多個異步請求時&#xff0c;可以將這些請求封裝為Promise對象并使用Promise.all()方法來執行它們。 示例1&#xff1a; 以下是一個示例代碼&#xff0c;展示了如何通過Promise.all()方法并行…

C語言——動態內存管理

動態內存管理詳解 前言&#xff1a;一、為什么存在動態內存分配二、動態內存函數2.1malloc函數2.2calloc函數2.3realloc函數2.4free函數 三、常見的動態內存錯誤3.1 對NULL指針解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放動態開辟…

Unity UI內存泄漏優化

項目一運行&#xff0c;占用的內存越來越多&#xff0c;不會釋放&#xff0c;導致GC越來越頻繁&#xff0c;越來越慢&#xff0c;這些都是為什么呢&#xff0c;今天從UI方面談起。 首先讓我們來聊聊什么是內存泄漏呢&#xff1f; 一般來講內存泄漏就是指我們的應用向內存申請…

Rabbitmq消息不丟失

目錄 一、消息不丟失1.消息確認2.消息確認業務封裝2.1 發送確認消息測試2.2 消息發送失敗&#xff0c;設置重發機制 一、消息不丟失 消息的不丟失&#xff0c;在MQ角度考慮&#xff0c;一般有三種途徑&#xff1a; 1&#xff0c;生產者不丟數據 2&#xff0c;MQ服務器不丟數據…

設計HTML5列表和超鏈接

在網頁中&#xff0c;大部分信息都是列表結構&#xff0c;如菜單欄、圖文列表、分類導航、新聞列表、欄目列表等。HTML5定義了一套列表標簽&#xff0c;通過列表結構實現對網頁信息的合理排版。另外&#xff0c;網頁中還包含大量超鏈接&#xff0c;通過它實現網頁、位置的跳轉&…

C語言“牽手”微店商品詳情數據方法,微店商品詳情API接口申請指南

微店平臺的商品詳情通常包括以下信息&#xff1a; 商品名稱&#xff1a;展示商品的名稱&#xff0c;用于描述商品的特性和分類。 商品圖片&#xff1a;展示商品的圖片&#xff0c;可以有多張圖片以展示不同角度和細節。 商品價格&#xff1a;顯示商品的銷售價格&#xff0c;可…