Kubelet (Kubernetes): deep in code

cmd/kubelet/kubelet.go 進程入口函數(shù)全庸,調(diào)用 server.go Run

Run 初始化 KubeClient乞娄、EventClient衅码、CAdvisorInterface咧最、ContainerManager

Run 中的函數(shù) RunKubelet 繼續(xù)啟動 kubelet翩腐,做一些配置檢查

RunKubelet 中的函數(shù) startKubelet 最終啟動 kubelet慈鸠,當(dāng)然之前需要初始化 Kubelet蓝谨,CreateAndInitKubelet->NewMainKubelet

// start the kubelet
go wait.Until(func() { k.Run(podCfg.Updates()) }, 0, wait.NeverStop)

這塊有兩個分支,一支為 k.Run林束,另一支為 podCfg.Updates()

  • k.Run 函數(shù)從 podCfg.Updates() 返回的 channel 中獲取到 updates 的 pod 信息
  • podCfg 負責(zé)將從 file / url / apiserver 獲得的 pod updates 信息融合到一個 channel 中

k.Run 開始 syncLoop 之前(開始處理 updates 信息之前)像棘,會啟動一系列周期 goroutine,如

  • volumeManager
  • syncNodeStatus(從 apiserver 獲得 metadata.name==kl.nodename 的
    node 信息壶冒,更新本地 node 信息缕题,隨后又 update apiserver 上的對應(yīng) node 的信息)
  • syncNetworkStatus
  • updateRuntimeUp
  • syncNetworkUtil(刷 iptables 這兩個規(guī)則 KUBE-MARK-DROP、KUBE-MARK-MASQ)
  • podKiller (刪除沒被 podWorker 正確處理的 pod)

還會啟動一些 manager胖腾,如

  • go kl.volumeManager.Run(kl.sourcesReady, wait.NeverStop)
  • statusManager.Start() (syncPeriod=10s syncBatch 周期烟零,或者從 podStatusChannel 中獲取更新信息,直接 syncPod咸作;syncPod 首先去本地 cache 確認是否需要更新锨阿,不需要更新直接返回,需要更新繼續(xù)將本地 pod status 更新到 apiserver记罚,如果 pod DeletionTimestamp 不為 nil墅诡,則該 pod 被標記刪除,如果該 pod 仍有在運行的 container桐智,則返回末早;否則調(diào)用 apiserver 刪除 api烟馅,將 pod 從 etcd 中刪除,成功后然磷,本地 cache 通過 pod uid 將該 pod 刪除郑趁。至于 syncBatch,從 podStatuses map 中獲取到所有需要 update姿搜、reconcile 的 status寡润,逐一調(diào)用 syncPod 處理這些 status。其中 podStatuses 的信息來源為舅柜,SetPodStatus -> updateStatusInternal梭纹,首先將 status 和 cache 比,相同且沒有設(shè)置 forceUpdate 的話致份,就不用更新了栗柒;否則生成新的 versionedPodStatus,version + 1知举,存入本地 cache,即 podStatuses太伊。若 podStatusChannel 未滿雇锡,則將該 status podStatusSyncRequest{pod.UID, newStatus} 放入其中
    ,否則交由 syncBatch 處理僚焦,因為該 status 已經(jīng)在 podStatuses 中了)
  • probeManager.Start()
  • pleg.Start() (pod lifecycle event generator)

syncLoop 重頭戲

  • syncTicker(1s)
  • housekeepingTicker(2s)
  • pleg.Watch()
  • 如果有 runtimeErrors锰提,則 skip sync and sleep 5s;否則 syncLoopIteration(updates, handler)芳悲,這里的 updates 不是 status 是 PodUpdate立肘,可能從 configCh(PodUpdate) 來的更新:ADDUPDATE名扛、REMOVE谅年、RECONCILEDELETE肮韧,交由各個 handle 去處理融蹂;從 plegCh 來的事件 HandlePodSyncs;從 syncCh 來的 tick弄企,HandlePodSyncs超燃;從 livenessManager 來的 updates,HandlePodSyncs拘领;housekeepingCh 來的 tick意乓,sourcesReady.AllReady() 時,HandlePodCleanups()约素;最后這個 handler 傳入的其實就是 Kubelet

神奇的在 pkg 下的 kubelet.go 又看到一個 syncPod fun届良,這個是 real syncPod笆凌,之前那個是 status_manager 的 syncPod,是 sync status of pod 的伙窃;那么來解讀一下 kubelet.go 的 syncPod 吧

  • 若 SyncPodKill: 則 kill pod 并 kl.statusManager.SetPodStatus(pod, apiPodStatus)
  • SyncPodCreate: metrics 記錄第一次被 apiserver 看到的時間菩颖;生成 apiPodStatus (generateAPIPodStatus);如果 pod 仍未啟動为障,則記錄啟動時延
  • 判斷是否能 runPod晦闰,不能則給出 Reason 和 Message
  • 更新 status kl.statusManager.SetPodStatus(pod, apiPodStatus)
  • 創(chuàng)建 pcm (pod container manager)
  • 為 pod 啟動做一系列動作,如創(chuàng)建 data 目錄鳍怨,掛卷(AttachAndMount)等
  • result := kl.containerRuntime.SyncPod(pod, apiPodStatus, podStatus, pullSecrets, kl.backOff) 使用 container 啟動 pod (不過 SyncPod 是 Runtime 接口的一個方法呻右,再找實現(xiàn)就不知道在哪里了,求問 go 里面怎么找接口實現(xiàn)鞋喇,一臉懵逼)

pod 的創(chuàng)建似乎和 cgroups 有關(guān)声滥,這塊后繼需要再了解一下

想想 kubelet 組件的作用不就是 create、update侦香、delete pod 么

多處都使用到 HandlePodSyncs落塑,有時間繼續(xù)解析

另外 NewMainKubelet 這個也是重頭,主要是創(chuàng)建 Kubelet罐韩,就是都要用到的 kl憾赁,初始化一系列東西

** 看這些主要是為了理出比較明確的 node 和 pod 的 status **

現(xiàn)在并沒有看到 local 的 pod 信息在那寫入的,當(dāng)然 file 算一種散吵,不過類似 OOM 這種運行時錯誤的上報沒有發(fā)現(xiàn)龙考;如果 pod 一開始就不能 Admit 當(dāng)然是會立刻生成 status 的

先寫到這 to be cont.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市矾睦,隨后出現(xiàn)的幾起案子晦款,更是在濱河造成了極大的恐慌,老刑警劉巖枚冗,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缓溅,死亡現(xiàn)場離奇詭異,居然都是意外死亡官紫,警方通過查閱死者的電腦和手機肛宋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來束世,“玉大人酝陈,你說我怎么就攤上這事』偕妫” “怎么了沉帮?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我穆壕,道長待牵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任喇勋,我火速辦了婚禮缨该,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘川背。我一直安慰自己贰拿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布熄云。 她就那樣靜靜地躺著膨更,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缴允。 梳的紋絲不亂的頭發(fā)上荚守,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音练般,去河邊找鬼矗漾。 笑死,一個胖子當(dāng)著我的面吹牛薄料,可吹牛的內(nèi)容都是我干的缩功。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼都办,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虑稼?” 一聲冷哼從身側(cè)響起琳钉,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛛倦,沒想到半個月后歌懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡溯壶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年及皂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片且改。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡验烧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出又跛,到底是詐尸還是另有隱情碍拆,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站感混,受9級特大地震影響端幼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弧满,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一婆跑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庭呜,春花似錦滑进、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至近哟,卻和暖如春驮审,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吉执。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工疯淫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戳玫。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓熙掺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咕宿。 傳聞我的和親對象是個殘疾皇子币绩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • docker實現(xiàn)了更便捷的單機容器虛擬化的管理, docker的位置處于操作系統(tǒng)層與應(yīng)用層之間; 相對傳統(tǒng)虛擬化(...
    Harvey_L閱讀 19,901評論 3 44
  • Kubernetes作為容器應(yīng)用的管理中心,通過對Pod的數(shù)量進行監(jiān)控府阀,并且根據(jù)主機或容器失效的狀態(tài)將新的Pod調(diào)...
    輝耀輝耀閱讀 4,604評論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理缆镣,服務(wù)發(fā)現(xiàn),斷路器试浙,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 左滑刪除 編輯狀態(tài)下刪除 與左滑返回區(qū)別: 設(shè)置編輯狀態(tài)為YES 點擊編輯,出現(xiàn)減號壹哺,再點擊減號 出現(xiàn)左滑返回按鈕...
    CoderCurtis閱讀 587評論 0 1
  • 你生氣時抄伍, 我在微笑。 生氣是你的標簽管宵, 微笑是我的標簽逝慧。
    小劇在成長閱讀 248評論 0 2