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。
相似场景:
1、static pod:根据某个目录下Pod的描述文件,kubelet监控这些文件,根据文件的变更与否,
决定是否删除、创建、更新对应的Pods。
2、DaemonSet
不同点:
Kubelet Bootstrap Checkpoint是会对特定Pods的checkpoint,如果Pods通过API发生变更或者创建,
那么最新的Pod数据会写入到Pod对应的checkpoint文件中,Pod对应的checkpoint文件名格式是
Pod_UID.yaml,存放的内容是完整的Pod API Object的Yaml格式内容,包括Status。
Kubelet Bootstrap Checkpoint主要的应用场景:
对于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。
Kubelet启动参数中配置--bootstrap-checkpoint-path,默认为“”,意味着默认Disable。
给需要Bootstrap Checkpoint的Pods加上:
Annotation:node.kubernetes.io/bootstrap-checkpoint=true
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,并不会引发流程异常,
Pod还会继续创建起来,但是checkpoint失败。
删除Pod
当用户提交删除Pod请求后,kubelet通过HandlePodRemove遍历所有Pods,
由PodManager调用checkpoint.DeletePod接口将Pod对应的checkpoint文件删除。
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只是对本节点的特定Pods进行Checkpoint,并不包括其他Kubernetes Object的Checkpoint。