本篇內(nèi)容介紹了“Kubelet Bootstrap Checkpoint怎么應(yīng)用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司,為您提供成都網(wǎng)站建設(shè)公司、成都網(wǎng)站制作公司、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計(jì),對服務(wù)成都高空作業(yè)車租賃等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報(bào)價(jià)服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!
Kubelet Bootstrap Checkpoint是kubelet對特定的Pods的進(jìn)行備份、恢復(fù)的kubelet內(nèi)置模塊。
Kubelet Bootstrap Checkpoint是對當(dāng)前Node上帶有Annotation:node.kubernetes.io/bootstrap-checkpoint=true
的Pods的Checkpoint到文件系統(tǒng)機(jī)制。
當(dāng)kubelet重啟時(shí),會檢查checkpoint目錄下各個(gè)Pods對應(yīng)的checkpoint文件,加載所有的checkpoint文件,轉(zhuǎn)換成Pod Object,然后啟動(dòng)這些Pods。
看起來似乎有點(diǎn)像static pod的使用方式:根據(jù)某個(gè)目錄下Pod的描述文件,kubelet監(jiān)控這些文件,根據(jù)文件的變更與否,決定是否刪除、創(chuàng)建、更新對應(yīng)的Pods。又或者有點(diǎn)像DaemonSet的使用場景。
最大的不同是,Kubelet Bootstrap Checkpoint是會對特定Pods的checkpoint,如果Pods通過API發(fā)生變更或者創(chuàng)建,那么最新的Pod數(shù)據(jù)會寫入到Pod對應(yīng)的checkpoint文件中,Pod對應(yīng)的checkpoint文件名格式是Pod_UID.yaml
,存放的內(nèi)容是完整的Pod API Object的Yaml格式內(nèi)容,包括Status。
Kubelet Bootstrap Checkpoint主要的應(yīng)用場景:
self-hosted-kubernetes
用來對k8s托管的apiserver,controller-manager,scheduler,kubelet,etcd,Adds-on組件進(jìn)行升級、維護(hù)的場景。關(guān)于self-hosted-kubernetes
的更多內(nèi)容請參考self-hosted-kubernetes design-proposals,bootkube, kubeadm upgrade等都與此相關(guān)。這也是社區(qū)設(shè)計(jì)這一特性的主要?jiǎng)訖C(jī)。下圖是bootkube的原理圖。
那么,對于用戶來說,部署普通應(yīng)用時(shí)給Pod加上Annotation:node.kubernetes.io/bootstrap-checkpoint=true
來給該P(yáng)od提供bootstrap checkpoint會帶來什么好處嗎?
對于用戶而言,如果apiserver能正常訪問,那么bootstrap checkpoint確實(shí)沒有什么用處,因?yàn)閑tcd中已經(jīng)有Pods API Object信息了,checkpoint就顯得多此一舉了。如果checkpoint文件和etcd中數(shù)據(jù)存在不一致的情況,反而會導(dǎo)致Pod先通過checkpoint恢復(fù)后,很快又根據(jù)etcd中Object Info進(jìn)行重建的問題。
但是,對于Node上一些特殊的常駐Agent,比如cmdb agent,需要定期上報(bào)Node的狀態(tài)等信息,以DaemonSet Pod方式運(yùn)行在Node上,如果在對Kubernetes進(jìn)行升級時(shí)方式不對或者不順暢,Node系統(tǒng)重啟并長時(shí)間無法與apiserver進(jìn)行通信(比如apiserver升級失?。@將導(dǎo)致Node上無法運(yùn)行DaemonSet Pod,那么這個(gè)Node上的cmdb agent就無法正常上報(bào)信息。對于這種情況,如果我們給這個(gè)DaemonSet Pod設(shè)置了對應(yīng)Annotation和啟用了Kubelet Bootstrap Checkpoint,那么kubelet可以在不依賴apiserver的情況下,通過本地的checkpoint文件恢復(fù)之前備份的Pods。
因此,給一些per-node上的關(guān)鍵用戶組件使用Bootstrap Checkpoint是有價(jià)值的。
Kubelet啟動(dòng)參數(shù)中配置--bootstrap-checkpoint-path
,默認(rèn)為“”
,意味著默認(rèn)Disable。
給需要Bootstrap Checkpoint的Pods加上Annotation:node.kubernetes.io/bootstrap-checkpoint=true
。
kubelet啟動(dòng)時(shí),在NerMainKubelet中會檢查--bootstrap-checkpoint-path
是否不為空,如果不為空,就會創(chuàng)建checkpointManager。
當(dāng)用戶提交創(chuàng)建Pod請求后,經(jīng)過scheduler調(diào)度,最后由kubelet發(fā)現(xiàn)調(diào)度到本節(jié)點(diǎn),由kubelet開始Pod的創(chuàng)建流程。
checkpointManager不為空的情況下,kubelet會檢查Pod是都有Annotation:node.kubernetes.io/bootstrap-checkpoint=true
,kubelet在HandlePodAddtions時(shí)會遍歷所有Pods,在dispatchWorker去創(chuàng)建Pod前,PodManager會調(diào)用checkpoint.WritePod接口先將滿足Annotation的Pods寫入到它們對應(yīng)的checkpoint文件(Pod_UID.yaml)中。
同樣的,當(dāng)Pod Spec發(fā)生變更,kubelet通過HandlePodUpdates遍歷所有Pods,由PodManager調(diào)用checkpoint.WritePod接口將滿足Annotation的Pods最新內(nèi)容寫入到它們對應(yīng)的的checkpoint文件中。
如果checkpoint.WritePod發(fā)生Error,可以在kubelet日志中看到,但是并不會引發(fā)流程異常,也就是說,Pod還會繼續(xù)創(chuàng)建起來,但是checkpoint失敗。
當(dāng)用戶提交刪除Pod請求后,kubelet通過HandlePodRemove遍歷所有Pods,由PodManager調(diào)用checkpoint.DeletePod接口將Pod對應(yīng)的checkpoint文件刪除。
如果Pod對應(yīng)的checkpoint文件不存在,不會有異常返回,也不應(yīng)該有異常返回。
如果Pod對應(yīng)的checkpoint文件存在,但是刪除失敗,那么會有kubelet Error日志,但是流程不會失敗。
注意,這里并不會去檢查Pod的Annotation是否滿足條件,而是對所有Pods都試圖去刪除對個(gè)格式的文件名。為什么不先檢查Annotation呢?這樣性能不是會更高么?試想一下這種場景,Pod的Checkpoint Annotation在變更時(shí)被刪除了,那么他的checkpoint文件就會被殘留。之后該P(yáng)od被刪除了,然后kubelet發(fā)生重啟時(shí),還會從checkpoint中恢復(fù)這個(gè)已經(jīng)被刪除的Pod,這很糟糕。當(dāng)然,很快這個(gè)Pod會從apiserver中同步中知道已經(jīng)被刪除了,然后kubelet再次刪除這個(gè)Pod.
當(dāng)kubelet發(fā)生冷重啟時(shí),會先檢查--bootstrap-checkpoint-path
是否配置了,如果是,就會調(diào)用checkpoint.LoadPods根據(jù)配置的目錄下的所有Pod_UID.yaml格式的文件,并通過FNV Hash算法進(jìn)行CheckSum檢查。
檢查通過后,將checkpoint yaml文件內(nèi)容轉(zhuǎn)換成Pod API Object,然后把這些Pods對象通過kubetypes.PodUpdate類型的channel一直傳遞給Kubelet.syncLoopIteration,最終由dispatch給Kubelet podWorkers去創(chuàng)建對應(yīng)的Pods實(shí)例。
Bootstrap Checkpoint的代碼很簡單,也不多,這里直接貼出對應(yīng)的代碼流程概要圖。
目前Bootstrap Checkpoint只是對本節(jié)點(diǎn)的特定Pods進(jìn)行Checkpoint,并不包括其他Kubernetes Object的Checkpoint。
更不是對kubelet內(nèi)存數(shù)據(jù)的Checkpoint。這些都不是它想做的事,更不是應(yīng)該做的事,集群狀態(tài)存儲的地方越多,問題就會越多。
“Kubelet Bootstrap Checkpoint怎么應(yīng)用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!