如果删除节点,kubelet 会做什么?

如果删除节点,kubelet 会做什么?

在 Kubernetes 集群中,如果从 API 服务器中删除一个节点,对应机器的 kubelet 会如何响应?

它是否向 API 服务器发送请求以重新创建节点资源,或者关闭并重新启动机器?

答案1

从源代码来看,当 kubelet 运行时,它会生成一个 goroutine持续更新节点对象(通过 kubernetes API 服务器)来匹配 kubelet 自己的内部数据。(kubelet 能够在首次启动时创建一个节点对象,但是一旦节点对象存在,当前 kubelet将不会如果节点对象消失,则重新尝试创建节点对象。)节点对象被删除后,节点同步将开始失败(使用时在主机上可见的日志将被淹没journalctl -u kubelet),但对 kubelet 的功能没有直接反馈。

同时,控制平面将通过垃圾收集孤立的 pod 对象并(通过部署控制器等)将它们重新调度到其他节点来响应已删除的节点。由于 kubelet 还会持续监视相关 pod 对象,因此这将触发它终止在原始主机上运行的相应容器(包括守护进程集)。

在动态扩展的集群中,集群自动扩展器使用云提供商 API 来关闭和放弃已耗尽 Pod 的机器(并根据需要启动新机器)。集群自动扩展器不得做好准备处理它所管理的机器不再被任何节点对象代表的情况。注意责任用于删除节点应该属于云控制器,但云节点控制器不能重新创建仍在运行的机器的节点对象(因为它无法判断机器是否仍在运行 kubelet,事实上系统管理员可能已将该框重新用于与 kubernetes 集群无关的某些角色)。因此,僵尸主机可能会处于空闲状态。

请注意,理想情况下,kubelet 本身可能会恢复并维护节点对象(因此手动删除节点对象(例如手动删除属于部署的 pod)不会产生持久影响),并且只有当 kubelet 正常退出或控制平面与其失去联系时,节点对象才会被删除。但这不是当前的行为。

相关内容