kubelet 的工作流程

簡(jiǎn)介

kubernetes 是一個(gè)分布式的集群管理系統(tǒng)惭每,在每個(gè)節(jié)點(diǎn)(node)上都要運(yùn)行一個(gè) worker 對(duì)容器進(jìn)行生命周期的管理,這個(gè) worker 程序就是?kubelet。

簡(jiǎn)單地說(shuō),kubelet?的主要功能就是定時(shí)從某個(gè)地方獲取節(jié)點(diǎn)上 pod/container 的期望狀態(tài)(運(yùn)行什么容器、運(yùn)行的副本數(shù)量饥努、網(wǎng)絡(luò)或者存儲(chǔ)如何配置等等)捡鱼,并調(diào)用對(duì)應(yīng)的容器平臺(tái)接口達(dá)到這個(gè)狀態(tài)八回。

kubelet 除了這個(gè)最核心的功能之外,還有很多其他特性:

? ? * 定時(shí)匯報(bào)當(dāng)前節(jié)點(diǎn)的狀態(tài)給 apiserver驾诈,以供調(diào)度的時(shí)候使用

? ? *?鏡像和容器的清理工作缠诅,保證節(jié)點(diǎn)上鏡像不會(huì)占滿磁盤(pán)空間,退出的容器不會(huì)占用太多資源

? ? * 運(yùn)行 HTTP Server乍迄,對(duì)外提供節(jié)點(diǎn)和 pod 信息管引,如果在 debug 模式下,還包括調(diào)試信息

? ? * 等等……

集群狀態(tài)下闯两,kubelet 會(huì)從 master 上讀取信息褥伴,但其實(shí) kubelet 還可以從其他地方獲取節(jié)點(diǎn)的 pod 信息。目前 kubelet 支持三種數(shù)據(jù)源:

? ? *?本地文件

? ? *?通過(guò) url 從網(wǎng)絡(luò)上某個(gè)地址來(lái)獲取信息

? ? *?API Server:從 kubernetes master 節(jié)點(diǎn)獲取信息

從管理的對(duì)象來(lái)說(shuō)漾狼,kubelet 目前支持dockerrkt重慢,默認(rèn)情況下使用的 docker。


kubelet 主要功能

Pod 管理

在 kubernetes 的設(shè)計(jì)中逊躁,最基本的管理單位是 pod似踱,而不是 container。pod 是 kubernetes 在容器上的一層封裝稽煤,由一組運(yùn)行在同一主機(jī)的一個(gè)或者多個(gè)容器組成核芽。如果把容器比喻成傳統(tǒng)機(jī)器上的一個(gè)進(jìn)程(它可以執(zhí)行任務(wù),對(duì)外提供某種功能)酵熙,那么 pod 可以類比為傳統(tǒng)的主機(jī):它包含了多個(gè)容器轧简,為它們提供共享的一些資源。

之所以費(fèi)功夫提供這一層封裝匾二,主要是因?yàn)槿萜魍扑]的用法是里面只運(yùn)行一個(gè)進(jìn)程哮独,而一般情況下某個(gè)應(yīng)用都由多個(gè)組件構(gòu)成的庐橙。

pod 中所有的容器最大的特性也是最大的好處就是共享了很多資源,比如網(wǎng)絡(luò)空間借嗽。pod 下所有容器共享網(wǎng)絡(luò)和端口空間态鳖,也就是它們之間可以通過(guò)?localhost?訪問(wèn)和通信,對(duì)外的通信方式也是一樣的恶导,省去了很多容器通信的麻煩浆竭。

除了網(wǎng)絡(luò)之外,定義在 pod 里的 volume 也可以 mount 到多個(gè)容器里惨寿,以實(shí)現(xiàn)共享的目的邦泄。

最后,定義在 pod 的資源限制(比如 CPU 和 Memory) 也是所有容器共享的裂垦。

容器健康檢查

創(chuàng)建了容器之后顺囊,kubelet 還要查看容器是否正常運(yùn)行,如果容器運(yùn)行出錯(cuò)蕉拢,就要根據(jù)設(shè)置的重啟策略進(jìn)行處理特碳。檢查容器是否健康主要有三種方式:執(zhí)行命令,http Get晕换,和tcp連接午乓。

不管用什么方式,如果檢測(cè)到容器不健康闸准,kubelet 會(huì)刪除該容器益愈,并根據(jù)容器的重啟策略進(jìn)行處理(比如重啟,或者什么都不做)夷家。

容器監(jiān)控

kubelet 還有一個(gè)重要的責(zé)任蒸其,就是監(jiān)控所在節(jié)點(diǎn)的資源使用情況,并定時(shí)向 master 報(bào)告库快。知道整個(gè)集群所有節(jié)點(diǎn)的資源情況摸袁,對(duì)于 pod 的調(diào)度和正常運(yùn)行至關(guān)重要。

kubelet 使用?cAdvisor?進(jìn)行資源使用率的監(jiān)控缺谴。cAdvisor 是 google 開(kāi)源的分析容器資源使用和性能特性的工具但惶,在 kubernetes 項(xiàng)目中被集成到 kubelet 里,無(wú)需額外配置湿蛔。默認(rèn)情況下膀曾,你可以在?localhost:4194?地址看到 cAdvisor 的管理界面。

除了系統(tǒng)使用的 CPU阳啥,Memory添谊,存儲(chǔ)和網(wǎng)絡(luò)之外,cAdvisor 還記錄了每個(gè)容器使用的上述資源情況察迟。


代碼分析

入口程序

cmd/kublet/kubelet.go? -->? main 方法

1. 創(chuàng)建kubeletFlags數(shù)據(jù)結(jié)構(gòu)(對(duì)應(yīng)kubelet命令行參數(shù))斩狱;

2. 創(chuàng)建kubeletConfigration數(shù)據(jù)結(jié)構(gòu)耳高;

3. 創(chuàng)建kubeletServer數(shù)據(jù)結(jié)構(gòu),此數(shù)據(jù)結(jié)構(gòu)包括kubeletFlags所踊、kubeletConfigration泌枪;

4. 啟動(dòng)kubelet Configuration controller,此功能開(kāi)始配置和狀態(tài)的循環(huán)同步秕岛;

// 創(chuàng)建一個(gè)配置控制器BootstrapKubeletConfigController(defaultConfig*kubeletconfiginternal.KubeletConfiguration,dynamicConfigDir string) {

? ? ?c := dynamickubeletconfig.NewController(defaultConfig, dir)

? ? // 讀取默認(rèn)配置碌燕,并啟動(dòng)一個(gè)goroutine來(lái)更新

? ??kc, err := c.Bootstrap()

? ? return kc, c, nil

}

5. 創(chuàng)建kubeletDeps數(shù)據(jù)結(jié)構(gòu);

kubeletDeps?的名字聽(tīng)起來(lái)很奇怪继薛,其實(shí)它內(nèi)部保存了 kubelet 各個(gè)重要組件的對(duì)象修壕,之所以要把它作為參數(shù)傳遞,是為了實(shí)現(xiàn) dependency injection遏考。簡(jiǎn)單地說(shuō)慈鸠,就是把 kubelet 依賴的組件對(duì)象作為參數(shù)傳進(jìn)來(lái),這樣可以控制 kubelet 的行為灌具。比如在測(cè)試的時(shí)候青团,只要構(gòu)建 fake 的組件實(shí)現(xiàn),就能很輕松進(jìn)行測(cè)試稽亏。KubeDeps?包含的組件很多壶冒,下面列出一些:

CAdvisorInterface:提供 cAdvisor 接口功能的組件缕题,用來(lái)獲取監(jiān)控信息

DockerClientConfig:docker 客戶端截歉,用來(lái)和 docker 交互

KubeClient:apiserver 客戶端,用來(lái)和 api server 通信

Mounter:執(zhí)行 mount 相關(guān)操作

NetworkPlugins:網(wǎng)絡(luò)插件烟零,執(zhí)行網(wǎng)絡(luò)設(shè)置工作

VolumePlugins:volume 插件瘪松,執(zhí)行 volume 設(shè)置工作

TLSOptions:檢查或者生成自簽名證書(shū)和密鑰文件。


啟動(dòng)程序

cmd/kubelet/app/server.go ? -->? Run 方法

1. 判斷kubelet是否以standalone模式運(yùn)行锨阿;

2. 創(chuàng)建對(duì)象kubeClient宵睦、evnetClient,用來(lái)和 apiserver 通信墅诡。 heartbeatClient壳嚎、externalkubeClient、ContainerManager末早;并設(shè)置OOM烟馅。

3.?調(diào)用RunKubelet。 運(yùn)行 kubelet然磷,這個(gè)函數(shù)會(huì)啟動(dòng) goroutine 一直運(yùn)行郑趁,是 kubelet 核心功能執(zhí)行的地方。

RunKubelet(&s.KubeletFlags, &s.KubeletConfiguration, kubeDeps, s.RunOnce) {

? ? //?1. 初始化各個(gè)對(duì)象姿搜,比如 eventBroadcaster寡润,這樣就能給?apiserver?發(fā)送事件了

? ? makeEventRecorder(kubeDeps, nodeName)

……

? ? // 2. 通過(guò) builder 創(chuàng)建并初始化Kubelet

????builder := kubeDeps.Builder

????if builder == nil {

????????builder = CreateAndInitKubelet

? ? }

? ? 調(diào)用builder(......)

? ? // 3. 根據(jù)運(yùn)行模式捆憎,運(yùn)行?Kubelet

? ? startKubelet(k, podCfg, kubeCfg, kubeDeps)

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梭纹,隨后出現(xiàn)的幾起案子躲惰,更是在濱河造成了極大的恐慌,老刑警劉巖变抽,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礁扮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瞬沦,警方通過(guò)查閱死者的電腦和手機(jī)太伊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逛钻,“玉大人僚焦,你說(shuō)我怎么就攤上這事∈锒唬” “怎么了芳悲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)边坤。 經(jīng)常有香客問(wèn)我名扛,道長(zhǎng),這世上最難降的妖魔是什么茧痒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任肮韧,我火速辦了婚禮,結(jié)果婚禮上旺订,老公的妹妹穿的比我還像新娘弄企。我一直安慰自己,他們只是感情好区拳,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布拘领。 她就那樣靜靜地躺著,像睡著了一般樱调。 火紅的嫁衣襯著肌膚如雪约素。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天笆凌,我揣著相機(jī)與錄音圣猎,去河邊找鬼。 笑死菩颖,一個(gè)胖子當(dāng)著我的面吹牛样漆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晦闰,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼放祟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鳍怨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跪妥,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鞋喇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后眉撵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侦香,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年纽疟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罐韩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡污朽,死狀恐怖散吵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蟆肆,我是刑警寧澤矾睦,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站炎功,受9級(jí)特大地震影響枚冗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛇损,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一赁温、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧州藕,春花似錦束世、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沉帮。三九已至锈死,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穆壕,已是汗流浹背待牵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喇勋,地道東北人缨该。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像川背,于是被迫代替她去往敵國(guó)和親贰拿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛤袒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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

  • Kubernetes是Google開(kāi)源的容器集群管理系統(tǒng),其提供應(yīng)用部署膨更、維護(hù)妙真、 擴(kuò)展機(jī)制等功能,利用Kubern...
    devabel閱讀 6,339評(píng)論 0 13
  • 1荚守、基礎(chǔ)架構(gòu) 1.1 Master Master節(jié)點(diǎn)上面主要由四個(gè)模塊組成:APIServer珍德、scheduler...
    阿斯蒂芬2閱讀 10,886評(píng)論 0 44
  • kubernetes 簡(jiǎn)介 一個(gè)迅速過(guò)一遍kubernetes 非常不錯(cuò)的資源:基于Kubernetes構(gòu)建Doc...
    bradyjoestar閱讀 15,289評(píng)論 2 7
  • 《kubernetes權(quán)威指南》是本不可多得的好書(shū),這里記錄一下自己的讀書(shū)筆記以及按照書(shū)中搭建的源代碼矗漾。 kube...
    行書(shū)以鑒閱讀 8,091評(píng)論 1 19
  • 每年的下雨天都是海 都是海里的舊愛(ài)的倒帶 屋檐下還有誰(shuí)誰(shuí)誰(shuí)的宅 一杯清茶锈候,一副耳塞 一坐半個(gè)下午的青睞 你是陽(yáng)光,...
    穎視錄閱讀 170評(píng)論 0 0