虚拟机节点正常关机下的 Pod 迁移及异常宕机恢复问题
问题描述
无论节点是 正常关机 还是 异常宕机,运行在该节点上的虚拟机 Pods 都不会自动迁移至其他健康节点。
原因分析
平台基于开源组件 KubeVirt 实现了虚拟机解决方案。然而,从 KubeVirt 的角度来看,无法区分虚拟机是实际宕机还是由于网络或其他原因导致的连接失败。若不加区分地将虚拟机迁移至其他节点,可能导致同一虚拟机的多个实例同时存在。
解决方法
在维护虚拟机节点时,需要根据此文档进行手动操作。针对 正常关机 和 异常宕机 两种情况,需手动驱逐或强制删除虚拟机 Pods。
注意:下述命令均需在对应集群的 Master 节点上执行。
正常关机下的虚拟机 Pods 迁移
-
在 CLI 工具中,执行下述命令获取节点信息。其中,回显信息中的
NAME字段即为Node-Name。回显信息:
-
(可选)执行下述命令查看节点下的虚拟机实例。
回显信息:
-
正常关机前,执行下述命令驱逐需关机节点上的所有虚拟机 Pods,若出现如下回显信息,则表示已成功驱逐。
回显信息:
-
等所有虚拟机在其他节点上启动后,将节点关闭。
-
节点关机并重新开启后,执行下述命令将该节点标记为可调度。
回显信息:
-
至此,该节点上的原虚拟机实例已迁移至其他健康节点,该节点重启后已允许新的 Pods 调度。
异常宕机恢复
-
在 CLI 工具中,执行下述命令获取节点信息。其中,回显信息中的
NAME字段即为Node-Name。回显信息:
-
执行下述命令,强制删除该节点上的所有虚拟机 Pods。
-
执行下述命令删除该节点上的 volume attachments。
-
执行下述命令查询异常宕机节点上是否存在具有标签 kubevirt.io=virt-api 的 Pods。
若存在则执行下述命令删除 Pods。
-
执行下述命令查询异常宕机节点上是否存在具有标签 kubevirt.io=virt-controller 的 Pods。
若存在则执行下述命令删除 Pods。
-
至此,节点异常宕机后,虚拟机实例将迁移至其他健康节点。