Author: xidianwangtao@gmail.com , Version: Kubernetes 1.12node
摘要:本文對Kubelet Bootstrap Checkpoint的使用方法、應用場景、工做機制及其代碼工做流程進行了全面分析,目前仍處於Alpha階段,不肯定性較大,但值得持續的關注它在self-hosted kubernetes, kubeadm upgrade, bootkube等方向的應用,相信Kubernetes的部署和升級還會變的更加簡單。git
Kubelet Bootstrap Checkpoint是kubelet對特定的Pods的進行備份、恢復的kubelet內置模塊。github
node.kubernetes.io/bootstrap-checkpoint=true
的Pods的Checkpoint到文件系統機制。看起來彷佛有點像static pod的使用方式:根據某個目錄下Pod的描述文件,kubelet監控這些文件,根據文件的變動與否,決定是否刪除、建立、更新對應的Pods。又或者有點像DaemonSet的使用場景。算法
最大的不一樣是,Kubelet Bootstrap Checkpoint是會對特定Pods的checkpoint,若是Pods經過API發生變動或者建立,那麼最新的Pod數據會寫入到Pod對應的checkpoint文件中,Pod對應的checkpoint文件名格式是Pod_UID.yaml
,存放的內容是完整的Pod API Object的Yaml格式內容,包括Status。bootstrap
Kubelet Bootstrap Checkpoint主要的應用場景:api
self-hosted-kubernetes
用來對k8s託管的apiserver,controller-manager,scheduler,kubelet,etcd,Adds-on組件進行升級、維護的場景。關於self-hosted-kubernetes
的更多內容請參考self-hosted-kubernetes design-proposals,bootkube, kubeadm upgrade等都與此相關。這也是社區設計這一特性的主要動機。下圖是bootkube的原理圖。那麼,對於用戶來講,部署普通應用時給Pod加上Annotation:node.kubernetes.io/bootstrap-checkpoint=true
來給該Pod提供bootstrap checkpoint會帶來什麼好處嗎?oop
對於用戶而言,若是apiserver能正常訪問,那麼bootstrap checkpoint確實沒有什麼用處,由於etcd中已經有Pods API Object信息了,checkpoint就顯得畫蛇添足了。若是checkpoint文件和etcd中數據存在不一致的狀況,反而會致使Pod先經過checkpoint恢復後,很快又根據etcd中Object Info進行重建的問題。性能
可是,對於Node上一些特殊的常駐Agent,好比cmdb agent,須要按期上報Node的狀態等信息,以DaemonSet Pod方式運行在Node上,若是在對Kubernetes進行升級時方式不對或者不暢,Node系統重啓並長時間沒法與apiserver進行通訊(好比apiserver升級失敗),這將致使Node上沒法運行DaemonSet Pod,那麼這個Node上的cmdb agent就沒法正常上報信息。對於這種狀況,若是咱們給這個DaemonSet Pod設置了對應Annotation和啓用了Kubelet Bootstrap Checkpoint,那麼kubelet能夠在不依賴apiserver的狀況下,經過本地的checkpoint文件恢復以前備份的Pods。spa
所以,給一些per-node上的關鍵用戶組件使用Bootstrap Checkpoint是有價值的。設計
Kubelet啓動參數中配置--bootstrap-checkpoint-path
,默認爲「」
,意味着默認Disable。
給須要Bootstrap Checkpoint的Pods加上Annotation:node.kubernetes.io/bootstrap-checkpoint=true
。
--bootstrap-checkpoint-path
是否不爲空,若是不爲空,就會建立checkpointManager。node.kubernetes.io/bootstrap-checkpoint=true
,kubelet在HandlePodAddtions時會遍歷全部Pods,在dispatchWorker去建立Pod前,PodManager會調用checkpoint.WritePod接口先將知足Annotation的Pods寫入到它們對應的checkpoint文件(Pod_UID.yaml)中。注意,這裏並不會去檢查Pod的Annotation是否知足條件,而是對全部Pods都試圖去刪除對個格式的文件名。爲何不先檢查Annotation呢?這樣性能不是會更高麼?試想一下這種場景,Pod的Checkpoint Annotation在變動時被刪除了,那麼他的checkpoint文件就會被殘留。以後該Pod被刪除了,而後kubelet發生重啓時,還會從checkpoint中恢復這個已經被刪除的Pod,這很糟糕。固然,很快這個Pod會從apiserver中同步中知道已經被刪除了,而後kubelet再次刪除這個Pod.
當kubelet發生冷重啓時,會先檢查--bootstrap-checkpoint-path
是否配置了,若是是,就會調用checkpoint.LoadPods根據配置的目錄下的全部Pod_UID.yaml格式的文件,並經過FNV Hash算法進行CheckSum檢查。
檢查經過後,將checkpoint yaml文件內容轉換成Pod API Object,而後把這些Pods對象經過kubetypes.PodUpdate類型的channel一直傳遞給Kubelet.syncLoopIteration,最終由dispatch給Kubelet podWorkers去建立對應的Pods實例。
Bootstrap Checkpoint的代碼很簡單,也很少,這裏直接貼出對應的代碼流程概要圖。
本文對Kubelet Bootstrap Checkpoint的使用方法、應用場景、工做機制及其代碼工做流程進行了全面分析,目前仍處於Alpha階段,不肯定性較大,但值得持續的關注它在self-hosted kubernetes, kubeadm upgrade, bootkube等方向的應用,相信Kubernetes的部署和升級還會變的更加簡單。