本篇内容介绍了“Kubelet Bootstrap Checkpoint怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联公司,为您提供成都网站建设公司、成都网站制作公司、网站营销推广、网站开发设计,对服务成都高空作业车租赁等多个行业拥有丰富的网站建设及推广经验。成都创新互联公司网站建设公司成立于2013年,提供专业网站制作报价服务,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏心悦目的作品。 与客户共同发展进步,是我们永远的责任!
Kubelet Bootstrap Checkpoint是什么
Kubelet Bootstrap Checkpoint是kubelet对特定的Pods的进行备份、恢复的kubelet内置模块。
Kubelet Bootstrap Checkpoint是对当前Node上带有Annotation:
node.kubernetes.io/bootstrap-checkpoint=true
的Pods的Checkpoint到文件系统机制。当kubelet重启时,会检查checkpoint目录下各个Pods对应的checkpoint文件,加载所有的checkpoint文件,转换成Pod Object,然后启动这些Pods。
Kubelet Bootstrap 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。
Kubelet Bootstrap Checkpoint主要的应用场景:
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会带来什么好处吗?
对于用户而言,如果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。
因此,给一些per-node上的关键用户组件使用Bootstrap Checkpoint是有价值的。
怎么启用Kubelet Bootstrap Checkpoint
Kubelet启动参数中配置
--bootstrap-checkpoint-path
,默认为“”
,意味着默认Disable。给需要Bootstrap Checkpoint的Pods加上Annotation:
node.kubernetes.io/bootstrap-checkpoint=true
。
Bootstrap Checkpoint工作机制
kubelet启动时,在NerMainKubelet中会检查
--bootstrap-checkpoint-path
是否不为空,如果不为空,就会创建checkpointManager。
创建或者变更Pod
当用户提交创建Pod请求后,经过scheduler调度,最后由kubelet发现调度到本节点,由kubelet开始Pod的创建流程。
checkpointManager不为空的情况下,kubelet会检查Pod是都有Annotation:
node.kubernetes.io/bootstrap-checkpoint=true
,kubelet在HandlePodAddtions时会遍历所有Pods,在dispatchWorker去创建Pod前,PodManager会调用checkpoint.WritePod接口先将满足Annotation的Pods写入到它们对应的checkpoint文件(Pod_UID.yaml)中。同样的,当Pod Spec发生变更,kubelet通过HandlePodUpdates遍历所有Pods,由PodManager调用checkpoint.WritePod接口将满足Annotation的Pods最新内容写入到它们对应的的checkpoint文件中。
如果checkpoint.WritePod发生Error,可以在kubelet日志中看到,但是并不会引发流程异常,也就是说,Pod还会继续创建起来,但是checkpoint失败。
删除Pod
当用户提交删除Pod请求后,kubelet通过HandlePodRemove遍历所有Pods,由PodManager调用checkpoint.DeletePod接口将Pod对应的checkpoint文件删除。
如果Pod对应的checkpoint文件不存在,不会有异常返回,也不应该有异常返回。
如果Pod对应的checkpoint文件存在,但是删除失败,那么会有kubelet Error日志,但是流程不会失败。
注意,这里并不会去检查Pod的Annotation是否满足条件,而是对所有Pods都试图去删除对个格式的文件名。为什么不先检查Annotation呢?这样性能不是会更高么?试想一下这种场景,Pod的Checkpoint Annotation在变更时被删除了,那么他的checkpoint文件就会被残留。之后该Pod被删除了,然后kubelet发生重启时,还会从checkpoint中恢复这个已经被删除的Pod,这很糟糕。当然,很快这个Pod会从apiserver中同步中知道已经被删除了,然后kubelet再次删除这个Pod.
Kubelet重启
当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工作流
Bootstrap Checkpoint的代码很简单,也不多,这里直接贴出对应的代码流程概要图。
其他注意事项
目前Bootstrap Checkpoint只是对本节点的特定Pods进行Checkpoint,并不包括其他Kubernetes Object的Checkpoint。
更不是对kubelet内存数据的Checkpoint。这些都不是它想做的事,更不是应该做的事,集群状态存储的地方越多,问题就会越多。
“Kubelet Bootstrap Checkpoint怎么应用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
名称栏目:KubeletBootstrapCheckpoint怎么应用
转载注明:http://scgulin.cn/article/gspgio.html