Pod 迁移及虚拟机节点异常关闭恢复
问题描述
无论节点是正常关闭还是发生异常宕机,该节点上运行的虚拟机 Pod 都不会自动迁移到其他健康节点。
原因分析
平台基于开源组件 KubeVirt 实现虚拟机方案,但从 KubeVirt 角度无法区分虚拟机真实宕机和网络等原因导致的连接失败。如果盲目将虚拟机迁移到其他节点,可能导致同一虚拟机存在多个实例。
解决方案
维护虚拟机节点时,需按照本文档进行手动操作。无论是正常关闭还是异常宕机,虚拟机 Pod 都必须手动驱逐或强制删除。
注意:以下命令需在对应集群的主节点上执行。
正常关闭时虚拟机 Pod 迁移
-
在 CLI 工具中执行以下命令获取节点信息,返回信息中的
NAME字段即为Node-Name。输出:
-
(可选)执行以下命令查看该节点下的虚拟机实例。
输出:
-
在正常关闭前,执行以下命令驱逐即将关闭节点上的所有虚拟机 Pod,若输出如下则表示驱逐成功。
输出:
-
在所有虚拟机启动到其他节点后,关闭该节点。
-
节点关闭并重启后,执行以下命令将节点标记为可调度。
输出:
-
此时,该节点上原有的虚拟机实例已迁移至其他健康节点,节点重启后可用于新的 Pod 调度。
异常关闭恢复
-
在 CLI 工具中执行以下命令获取节点信息,返回信息中的
NAME字段即为Node-Name。输出:
-
执行以下命令强制删除该节点上的所有虚拟机 Pod。
-
执行以下命令删除该节点上的 volume attachments。
-
执行以下命令查询异常宕机节点上是否存在带有标签 kubevirt.io=virt-api 的 Pod。
若存在,执行以下命令删除这些 Pod。
-
执行以下命令查询异常宕机节点上是否存在带有标签 kubevirt.io=virt-controller 的 Pod。
若存在,执行以下命令删除这些 Pod。
-
此时,虚拟机实例将在节点异常关闭后迁移至其他健康节点。