手动断电关闭Worker节点是否是模拟K8s节点故障的可靠方式?
嘿,你的理解其实没毛病!手动断电关闭Worker节点确实是模拟K8s节点故障相当可靠(甚至可以说很贴合真实场景)的方式。
先说说你提到的优雅关机情况:
你观察到优雅关机不会触发K8s的故障恢复逻辑,这点完全正确。当你优雅关闭节点时,kubelet会主动向K8s API Server发送通知,把节点状态设为NotReady,还会有条不紊地驱逐节点上的Pod——先给Pod发TERM信号让它们优雅终止,等超时后再强制杀死。整个过程是K8s预期内的主动操作,自然不会启动故障恢复流程。
而手动断电属于非优雅关机,这和真实场景中节点突然故障(比如硬件宕机、网络彻底断连)的情况一模一样。K8s的Node Controller会通过心跳机制监测节点状态,一旦节点失联超过预设的超时时间(默认大概5分钟,由node-monitor-grace-period和pod-eviction-timeout这两个参数控制),就会判定该节点故障,然后触发Pod重新调度:把故障节点上的Pod(除了绑定本地存储的Pod)重新分配到其他健康节点上,这正是K8s应对节点故障的标准恢复流程。
不过要注意,如果节点上有使用本地持久化存储的Pod,K8s不会自动重新调度这些Pod——毕竟数据存在故障节点的本地磁盘上,强制调度也没法访问数据,这也和真实故障场景完全一致,所以用手动断电模拟是很准确的。
总的来说,你的核心理解完全正确:优雅关机是预期内的维护操作,K8s不会当成故障处理;只有非优雅的突然失联(比如手动断电),才会触发K8s的故障恢复机制,也最贴近真实的节点故障场景。
备注:内容来源于stack exchange,提问作者MeanwhileInHell

