Kubelet 发心跳是为了向集群“报平安”并“汇报工作”;而一旦失联,API Server 出于对业务连续性的保护,会主动将该节点“隔离”(NotReady)并把上面的业务“转移”(驱逐),这就是 Kubernetes 强大的自我修复(Self-healing)能力的体现。
● 节点上报心跳: kubelet 会定期向 API Server 发送心跳。在 Kubernetes 中,这种心跳主要通过更新 kube-node-lease 命名空间下的 Lease(租约)对象来实现。默认情况下, kubelet 每 10秒 就会更新一次这个 Lease 对象。
1. 数据持久化:首先,节点上的 kubelet 会定期(默认每10秒)向 API Server 发送请求,更新对应节点的 Lease 对象。API Server 接收到请求后,会将最新的心跳时间戳持久化存储到后端的 etcd 数据库中。
2. 控制器监听:节点控制器并不会直接去读取 etcd,而是通过 API Server 提供的 Watch(监听)机制,实时订阅 Lease 对象的状态变化。
3. 周期性检查:节点控制器默认每隔 5秒(由 --node-monitor-period 参数控制)就会去检查一次所有节点的心跳状态。
● 超时判定:如果节点控制器发现某个节点对应的 Lease 对象长时间没有更新,且失联时间超过了设定的宽限期(即 node-monitor-grace-period ,默认 40秒),节点控制器就会判定该节点失联,并将其状态标记为 NotReady 或 Unknown 。