同时,控制平面将通过垃圾收集孤立的 pod 对象并(通过部署控制器等)将它们重新调度到其他节点来响应已删除的节点。由于 kubelet 还会持续监控相关的 pod 对象,这将触发它终止在原始主机上运行的相应容器(包括守护进程集)。
在动态扩展的集群中,集群自动扩展程序使用云提供商 API 来关闭和放弃已耗尽 Pod 的机器(并根据需要启动新机器)。当它所管理的机器变得无法由任何节点对象表示时,集群自动缩放程序可能无法准备好进行处理。请注意,删除节点的责任应该属于云控制器,但是云节点控制器无法为仍在运行的机器重新创建节点对象(因为它无法判断机器是否仍在运行 kubelet,实际上是系统管理员)可以将该框重新用于与 kubernetes 集群无关的某些角色)。因此,僵尸主机可能会处于空闲状态。
请注意,理想情况下 kubelet 本身可能会恢复和维护节点对象(这样手动删除节点对象,就像手动删除属于部署的 pod 一样,不会产生持久效果),并且只有在 kubelet 执行以下任一操作时,节点对象才会被删除:优雅退出或控制平面与其失去联系。但这不是当前的行为。
从源代码来看,当 kubelet 运行时,它会生成一个 goroutine来不断更新节点对象(通过 kubernetes API 服务器)以匹配 kubelet 自己的内部数据。(kubelet 第一次启动时能够创建节点对象,但是一旦节点对象存在,如果节点对象消失,当前 kubelet将不会重新尝试创建节点对象。)节点对象获取后,节点同步将开始失败已删除(使用 可以在主机上看到洪泛日志
journalctl -u kubelet
),但对 kubelet 的功能没有直接反馈。同时,控制平面将通过垃圾收集孤立的 pod 对象并(通过部署控制器等)将它们重新调度到其他节点来响应已删除的节点。由于 kubelet 还会持续监控相关的 pod 对象,这将触发它终止在原始主机上运行的相应容器(包括守护进程集)。
在动态扩展的集群中,集群自动扩展程序使用云提供商 API 来关闭和放弃已耗尽 Pod 的机器(并根据需要启动新机器)。当它所管理的机器变得无法由任何节点对象表示时,集群自动缩放程序可能无法准备好进行处理。请注意,删除节点的责任应该属于云控制器,但是云节点控制器无法为仍在运行的机器重新创建节点对象(因为它无法判断机器是否仍在运行 kubelet,实际上是系统管理员)可以将该框重新用于与 kubernetes 集群无关的某些角色)。因此,僵尸主机可能会处于空闲状态。
请注意,理想情况下 kubelet 本身可能会恢复和维护节点对象(这样手动删除节点对象,就像手动删除属于部署的 pod 一样,不会产生持久效果),并且只有在 kubelet 执行以下任一操作时,节点对象才会被删除:优雅退出或控制平面与其失去联系。但这不是当前的行为。