PodConfig 的監(jiān)控

在 makePodSourceConfig 中梗脾,Pod資源以三種方式獲得:

cfg := config.NewPodConfig(config.PodConfigNotificationIncremental, kubeDeps.Recorder)

cfg.Channel 方法會(huì)返回一個(gè) chennel,并有一個(gè) goroutine 監(jiān)聽(tīng)在上面刑然,如果有內(nèi)容寫入到這個(gè) chan 里面,則會(huì)觸發(fā) Merge 方法寫入到 cfg.updates里面魄幕。

第一種是通過(guò)文件獲得尊浪,文件一般放在/etc/kubernetes/manifests目錄下面,啟動(dòng)kubelet時(shí)可以通過(guò)指定–config覆蓋甜滨;

config.NewSourceFile(kubeCfg.PodManifestPath, nodeName, kubeCfg.FileCheckFrequency.Duration, cfg.Channel(kubetypes.FileSource))

第二種也是通過(guò)文件過(guò)得,只不過(guò)文件是通過(guò)URL獲取的,URL可以在啟動(dòng)kubelet時(shí)通過(guò)ManifestURL指定瘤袖;

config.NewSourceURL(kubeCfg.ManifestURL, manifestURLHeader, nodeName, kubeCfg.HTTPCheckFrequency.Duration, cfg.Channel(kubetypes.HTTPSource))

第三種是通過(guò)watch kube-apiserver獲纫履Α;

config.NewSourceApiserver(kubeDeps.KubeClient, nodeName, updatechannel)

1. NewSourceFile 方法在?/kubelet/config/file.go

使用 “golang.org/x/exp/inotify” 來(lái)watch文件的改變捂敌,然后通過(guò)?extractFromFile 讀取變化內(nèi)容昭娩,把更新內(nèi)容返回給 updates

2. NewSourceURL 方法在 /kubelet/config/http.go

TODO

3. NewSourceApiserver 方法在 /kubelet/config/apiserver.go

簡(jiǎn)單的理解這個(gè)方法,就是監(jiān)控 apiserver 上 pod 的變化黍匾,將變化寫到 PodConfig.updates 這個(gè) channel 里面。

1.?調(diào)用NewListWatchFromClient方法呛梆;

2. 調(diào)用newSourceApiserverFromLW方法锐涯;

看一下?NewListWatchFromClient 在 /client-go/tools/cache/listwatch.go

1. NewListWatchFromClient方法將返回一個(gè)ListWatch結(jié)構(gòu)體,定義listFunc和watchFunc填物;

2. listFunc用于List纹腌,watchFunc用于Watch霎终;

? ? ? *? listFunc首先Get()方法,說(shuō)明發(fā)起一個(gè)Get請(qǐng)求升薯,再看看Namespace(namespace)莱褒,其實(shí)只是在request設(shè)置namespace字段,再看看Resource函數(shù),設(shè)置request的resource字段,VersionedParams主要對(duì)options進(jìn)行序列化涎劈,options主要包括ResourceVersion和TimeoutSeconds這兩個(gè)參數(shù)广凸,F(xiàn)ieldsSelectorParam函數(shù)主要將filter函數(shù)進(jìn)行序列化,深入分析這個(gè)函數(shù)蛛枚,你可以發(fā)現(xiàn)其實(shí)他將他序列化到一個(gè)嵌套的map里面谅海。Do()函數(shù)發(fā)起真正的請(qǐng)求,并收到response蹦浦,然后用r.transformResponse去處理response扭吁,包裝成Result返回。Get()方法則主要對(duì)Result進(jìn)行反序列化盲镶。最后返回結(jié)果;

? ? ? *? Watch()方法將返回watch.Interface侥袜,這個(gè)watch.Interface專門用來(lái)傳送kubelet想要watch的資源。Watch首先會(huì)發(fā)起一個(gè)request溉贿,然后反序列化response枫吧,從response中獲得watch.Interface;(具體返回是StreamWatcher對(duì)象)? ?獲得watcher以后,reflector會(huì)調(diào)用r.watchHandler(w, &resourceVersion, resyncerrc, stopCh)去處理這個(gè)watcher顽照;

3. ListWatch會(huì)傳入newSourceApiserverFromLW方法由蘑;

下面是 newSourceApiserverFromLW, 在?/kubelet/config/apiserver.go

1.?首先創(chuàng)建了一個(gè) send 函數(shù)代兵,它將從apiserver獲取的pods傳送到updates channel中尼酿;

2.?通過(guò)構(gòu)建一個(gè)reflector,然后run 從apiserver 獲得Pods信息植影;

接下來(lái)看一下?Reflector 是怎么獲取Pods信息的裳擎。k8s.io/client-go/tools/cache/reflector.go

Reflector 對(duì)象,主要數(shù)據(jù)成員:ListerWatcher思币,ListerWatcher是接口對(duì)象鹿响,包括方法List()和Watch();在此之前 NewListWatchFromClient 方法返回的 ListWatch 對(duì)象將作為 Reflector 的ListerWatcher 數(shù)據(jù)成員谷饿;

Refector 的 Run 方法惶我,啟動(dòng)協(xié)程執(zhí)行執(zhí)行reflector的 ListAndWatch 方法;

wait.Until(func() {

????????if err := r.ListAndWatch(stopCh); err != nil {

????????????????utilruntime.HandleError(err)

????????}

}, r.period, stopCh)

在?ListAndWatch? 方法中

1.?調(diào)用ListFunc和WatchFunc去List和Watch apiserver的資源博投;

2. 調(diào)用reflector的watchHandler方法绸贡;

watchHandler 方法

1.?從channel讀取event,然后更新到 r.store;

2.? r.store 就是在創(chuàng)建的時(shí)候听怕,傳遞的參數(shù)?cache.NewUndeltaStore(send, cache.MetaNamespaceKeyFunc) 生成的?UndeltaStore捧挺;

3.??r.store? 在操作的時(shí)候,執(zhí)行 u.PushFunc(u.Store.List()) 操作尿瞭,PushFunc 函數(shù)是之前注冊(cè)的 send 方法 (此send方法是在pkg/kubelet/config/apiserver.go的NewSourceApiserverFromLW中定義)闽烙,它將從apiserver獲取的pods傳送到updates channel中,kubelet從updates channel獲取到Pod信息進(jìn)行處理声搁;

4.?這里無(wú)論是add黑竞、delete或者modify, u.PushFunc(u.Store.List()) 他會(huì)發(fā)送存儲(chǔ)的所有pods酥艳。因?yàn)樵谶@些操作之前摊溶,它都會(huì)先操作Store里面的pods對(duì)象,確保Store里面存儲(chǔ)的是分配到該節(jié)點(diǎn)的Pod的最新信息充石;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莫换,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骤铃,更是在濱河造成了極大的恐慌拉岁,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惰爬,死亡現(xiàn)場(chǎng)離奇詭異喊暖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)撕瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門陵叽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丛版,你說(shuō)我怎么就攤上這事巩掺。” “怎么了页畦?”我有些...
    開(kāi)封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵胖替,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我豫缨,道長(zhǎng)独令,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任好芭,我火速辦了婚禮燃箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舍败。我一直安慰自己招狸,他們只是感情好碗硬,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瓢颅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弛说。 梳的紋絲不亂的頭發(fā)上挽懦,一...
    開(kāi)封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音木人,去河邊找鬼信柿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛醒第,可吹牛的內(nèi)容都是我干的渔嚷。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稠曼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼形病!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霞幅,我...
    開(kāi)封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漠吻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后司恳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體途乃,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年扔傅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耍共。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猎塞,死狀恐怖试读,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邢享,我是刑警寧澤鹏往,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站骇塘,受9級(jí)特大地震影響伊履,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜款违,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一唐瀑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧插爹,春花似錦哄辣、人聲如沸请梢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毅弧。三九已至,卻和暖如春当窗,著一層夾襖步出監(jiān)牢的瞬間够坐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工崖面, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留元咙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓巫员,卻偏偏與公主長(zhǎng)得像庶香,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子简识,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容