client-go源碼分析(3):Indexer, cache, threadSafeMap

前言

本文聚焦client-go v11.0.0 controller框架Indexer對象,分析源碼indexer的實現(xiàn)。關于client-go的介紹已有優(yōu)秀文章雇卷,可參考第一篇參考文檔洪橘,本文不再贅述。

1 cache - indexer對象關系

golang的struct和interface之間是弱耦合關系帚戳,即struct只需要實現(xiàn)了某個interface的所有方法玷或,就認為該struct實現(xiàn)了該interface。cache和Store對象關系如下:

cache UML組件圖

從類的實現(xiàn)片任、組合關系上可見偏友,cache實現(xiàn)了Store interface和Index interface的所有方法,因此cache可以賦值給Store和Index接口对供。理解threadSafeMap的實現(xiàn)能幫助我們理解cache位他。

2 理解threadSafeMap的實現(xiàn)

幾個內部索引對象及其關系

type IndexFunc func(obj interface) ([]string, error)

type Indexers map[string]indexFunc

type Index map[string]sets.String

type indices map[string]Index

從上述幾個對象的命名和關系看,很難理解幾個對象的依賴關系产场。我們首先梳理幾個對象之間的關系鹅髓,其次分析一個pod對象的增、刪京景、改時窿冯,幾個索引對象的狀態(tài)遷移如何發(fā)生。

2.1 threadSafeMap內部對象關系

threadSafeMap內部對象關系示意圖

Items:

Items類型map[string] interface{}确徙,用來存儲runtime.object醒串,map的key(對象鍵)用函數(shù)MetaNamespaceKeyFunc生成,value是runtime.object本身鄙皇。

Indexers:

indexers類型是map[string]indexFunc芜赌,用來存儲indexFunc(索引鍵計算函數(shù)),map的key是indexFuncName伴逸,value是indexFunc缠沈。注意兩個要點:1. 區(qū)別對象鍵和索引鍵;2. {indexName: indexFunc}是外部調用者傳入错蝴,調用關系參考k8s源碼: kubernetes-master\pkg\client\informers\informers_generated\internalversion\extensions\internalversion\deployment.go:

cache.MetaNamespaceIndexFunc函數(shù)調用

cache.MetaNamespaceIndexFunc函數(shù)注釋:

// MetaNamespaceIndexFunc is a default index function that indexes based on an object's namespace.

Indices:

Indices類型map[string]Index博烂。indices是對象快速索引表,map的key是indexName漱竖,value是Index對象禽篱,即map[string]sets.String。

Index:

Index類型map[string]sets.String馍惹。Index map的key是indexFunc計算的值躺率,如MetaNamespaceIndexFunc返回的是namespace,如果使用indexByPodNodeName(源碼:kubernetes-master\pkg\controller\daemon\daemon_controller.go)那么返回nodename万矾。

indexSet:

IndexSet是筆者自己取的名字悼吱。IndexSet是set.String類型,值是對象鍵objkey良狈。

到此為止后添,相信細心的讀者可能會發(fā)現(xiàn),threadSafeMap做了兩件事:

1)存儲:保存k8s runtime.object到items map薪丁。

2)索引:為items map的每個對象建立三層索引:第一層是indices map的類別索引遇西,如按'namespace', 'nodeName'索引馅精;第二層是index map的詳細類別索引,如'namespace1','namespace2'… 或者'nodeName1','nodeName2'……粱檀;第三層是indexSet的對象鍵洲敢。第三層索引才真正索引到runtime.object。

2.2 threadSafeMap關鍵實現(xiàn)分析

以兩個典型的方法func (c *threadSafeMap) updateIndices(oldObj interface{}, newObj interface{}, key string)和func (c *threadSafeMap) deleteFromIndices(obj interface{}, key string)為例分析threadSafeMap內部對象的狀態(tài)遷移過程茄蚯。

deleteFromIndices實現(xiàn)

deleteFromIndices被Delete压彭,updateIndices等函數(shù)調用,它的功能是刪除indices的某個索引渗常。deleteFromIndices函數(shù)執(zhí)行步驟如下:

1)遍歷indexFunc map c.indexers獲取第一層索引indices的類別name壮不,并計算第二層索引index的詳細索引類別indexValue;

2)遍歷第二層索引表index,依次刪除第三層索引表indexSet的對象鍵皱碘。

updateIndices實現(xiàn)

updateIndices函數(shù)被Add忆畅,Update,Replace等函數(shù)調用尸执。updateIndices執(zhí)行步驟如下:

1)updateIndices函數(shù)首先刪除oldObj的索引鍵家凯;

2)遍歷indexFunc map c.indexers,獲取第一層索引indices的索引類別name如失,并計算第二層索引Index的詳細索引類別indexValues(數(shù)組)绊诲;

3)遍歷第二層索引Index,依次執(zhí)行:若第三層索引IndexSet為空則添加一個空set褪贵;若非空則添加對象鍵到第三層索引IndexSet掂之。

3 結語

到此為止threadSafeMap的機制基本分析清楚,cache無非threadSafeMap的封裝和擴展脆丁,核心機制是一樣的世舰,就不再細說 。

4 參考文檔

http://www.reibang.com/p/d17f70369c35

https://blog.csdn.net/weixin_42663840/article/details/81530606

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末槽卫,一起剝皮案震驚了整個濱河市跟压,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歼培,老刑警劉巖震蒋,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異躲庄,居然都是意外死亡查剖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門噪窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笋庄,“玉大人,你說我怎么就攤上這事≈鄙埃” “怎么了菌仁?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哆键。 經(jīng)常有香客問我掘托,道長瘦锹,這世上最難降的妖魔是什么籍嘹? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮弯院,結果婚禮上辱士,老公的妹妹穿的比我還像新娘。我一直安慰自己听绳,他們只是感情好颂碘,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椅挣,像睡著了一般头岔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鼠证,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天峡竣,我揣著相機與錄音,去河邊找鬼量九。 笑死适掰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的荠列。 我是一名探鬼主播类浪,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肌似!你這毒婦竟也來了费就?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤川队,失蹤者是張志新(化名)和其女友劉穎受楼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼寸,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡艳汽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了对雪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河狐。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出馋艺,到底是詐尸還是另有隱情栅干,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布捐祠,位于F島的核電站碱鳞,受9級特大地震影響,放射性物質發(fā)生泄漏踱蛀。R本人自食惡果不足惜窿给,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望率拒。 院中可真熱鬧崩泡,春花似錦、人聲如沸猬膨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勃痴。三九已至谒所,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沛申,已是汗流浹背劣领。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留污它,地道東北人剖踊。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像衫贬,于是被迫代替她去往敵國和親德澈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355