kubelet判断机器是否重启逻辑

如果K8s中某个Node节点重启,在Event信息中会有一条消息,大致内容如Node xxxxx has been rebooted, boot id: xxx,而如果是重启kubelet,则不会有这条消息,所以kubelet是怎么判断是自己重启了还是机器重启了呢?

搜索了一下代码,在https://github.com/kubernetes/kubernetes/blob/v1.10.12/pkg/kubelet/kubelet_node_status.go#L621这里,会判断上次记录的Node的BootID和当前从cAdvisor获取的BootID是否相同,如果不同则说明机器重启了。

那么cAdvisor是怎么获得这个BootID的呢?看了一下cAdvisor的文档,发现默认是从/proc/sys/kernel/random/boot_id这个文件读取的。针对这个文件,找到一段解析:

/proc/sys/kernel/random/boot_id: A random ID that is regenerated on each boot. As such it can be used to identify the local machine’s current boot. It’s universally available on any recent Linux kernel. It’s a good and safe choice if you need to identify a specific boot on a specific booted kernel.

是内核暴露的一个接口,每次启动都会随机生成一个ID,是一个比较通用和安全的判断启动的办法。

参考:

  1. http://0pointer.de/blog/projects/ids.html