vCenter虚拟机HA不生效,核心原因通常不在HA开关本身,而是主机代理心跳异常、网络隔离地址不可达、准入控制阻挡或虚拟机未纳入HA监控这四类问题,按顺序排查vCenter告警、主机认证、隔离网络和管理网络配置,多数情况下能快速定位。
先搞清楚HA不生效卡在哪个环节
不少朋友跟我说,vCenter里HA明明显示“已启用”,但一台ESXi主机宕机后,上面的虚拟机就是不动,这种情况多半不是HA没配置,而是触发链路断了。
vSphere HA的逻辑其实不复杂:每台主机上跑着FDMAgent(代理进程),它负责心跳上报和故障检测,主机突然失联后,其他主机的代理发现心跳丢失,再结合隔离地址的探测结果,决定是重启虚拟机还是让它继续跑,判断出问题前,先看主机状态是“已断开”还是“已隔离”,这两个结果的处理方式完全不同。
主机显示“已断开”还是“已隔离”
- 已断开:意味着其他主机完全收不到这台主机的网络心跳,也收不到存储心跳,此时HA会把虚拟机在其他主机上重启。
- 已隔离:意味着管理网络不通,但存储心跳还活着,主机自己还活着,此时取决于隔离响应,默认是“不迁移”的。
如果被隔离的主机保持“完全隔离但未关机”的状态,而虚拟机上又没有配置“VM重启优先级”,那它就是不会动,先打开vSphere Client,进到集群的“监控”页签看主机状态,这一步能省掉大半排查时间。
vcenter虚拟机HA不生效的排查路径
我见过不少用户在vCenter里折腾半天,结果问题出在最初级的环节,这里给出一套完整的排查步骤,建议照着走一遍。
第一步:确认vCenter层的HA状态
在vSphere Client里进入集群,看“配置 > vSphere Availability”,正常情况下状态是绿色的“已启用”,如果是黄色感叹号或红色警告,点进去看具体报错。常见报错有两类:
- 主机不支持vSphere HA功能
- 主机上的HA代理未正确安装或运行异常
看到第二类报错,大概率主机上的FDMAgent崩了或版本与vCenter不一致,此时先把主机进入维护模式,再退出维护模式,让vCenter重新推送HA代理,如果还不行,重启主机的management服务:
/etc/init.d/vpxa restart
第二步:检查主机认证和许可证
这是最容易被忽略的坑,ESXi主机的vCenter账号如果密码过期或权限被改,vCenter会失去对主机的管理通道,HA自然不触发,到vCenter的“主机”页面里,右键选择“重新建立连接”,确认认证状态恢复。
许可证授权范围也要留意,据VMware官方文档说明,vSphere Standard及以上版本才完整支持HA功能,Essentials授权的HA能力是受限的,如果你的环境用的是嵌套虚拟化或授权不完整,HA可能只显示启用但不干活。
第三步:查看HA心跳网络和隔离地址
HA的心跳是通过管理网络传输的,默认走管理网络,如果你给集群单独配置了HA心跳网络,而这块网络实际上不通,那故障时其他主机无法感知,也就不会启动故障转移。
隔离地址更关键,所谓隔离地址,就是每台主机用来探测“自己是否被网络隔断”的网关IP或特定主机IP,如果这个地址本身不可达(比如把网关写错了),主机在故障时就会误判自己已隔离,从而不触发迁移。
检查命令:
esxcli network ip connection list | grep -i vmk
看疑似的HA心跳网卡状态是否正常,正常时多块主机之间的心跳是双向可达的。
第四步:核对准入控制策略
vCenter集群默认开启准入控制,意思是故障转移要预留足够的资源,如果集群配置了“插槽大小”或“保留主机资源”,而当前可用资源不足以承载额外虚拟机,HA就会拒绝执行迁移,这种情况在漫展、教学场景的迷你集群里特别常见集群总共就两台主机,还设置了高比例的CPU预留。
建议在测试环境直接关闭准入控制,把策略设为“允许任何VM重新启动”,再验证故障转移是否正常,生产环境不建议长期关闭,但可以用“仅计算预留”模式减少误阻挡。
第五步:确认虚拟机本身纳入HA监控
大量失误是虚拟机没有勾选HA监控,在虚拟机“配置”里看“vSphere HA”,如果显示“未配置”,那它压根不在HA的保护名单里,默认情况下,vSphere HA对虚拟机的监控是开启的,但如果你在创建虚拟机时改过设置,可能将其调成了“禁用”。
还有一种情况,虚拟机上开了快照或绑定了独立磁盘(RDM物理模式),HA对这些虚拟机的处理会不同,但一般不会完全不触发,若虚拟机上挂了独立非共享磁盘,重启时容易出现“磁盘锁”冲突,表现为HA已触发但虚拟机起不来。
vCenter HA配置正确但虚拟机就是不迁移
有相当一部分用户的问题是:集群配置看起来是正常的,主机状态也是绿色,但宕机后虚拟机纹丝不动,这类情况重点查以下几个隐蔽点。
存储心跳与内存快照
传统模式下,vSphere HA通过主机的存储心跳来确认主机是否真正失联,如果虚拟机存放在独立的本地盘上,而不是共享存储,那么其他主机根本拿不到这台虚拟机的磁盘文件,只能被迫不迁移,也就是说,HA只对放在共享存储上的虚拟机生效。
用vSAN或NFS挂载的存储没问题,但要注意存储心跳默认依赖“数据存储心跳”,如果数据存储压力过大,心跳丢失会导致误判,反而阻止迁移,排查时到vCenter的“监控 > vSphere HA”里查看“存储心跳”的状态,确保是“两个都正常”。
vCenter HA网络隔离误判
这个词你可以直接理解为:vcenter ha 网络隔离后,主机自认为是“只能自己过”,不会主动去抢虚拟机,部分场景下隔离响应配置成了“保持开启电源”,导致故障机一直占用着虚拟机份额。
好在排查很容易:在集群的HA设置里,把隔离响应从“保持开启电源”改为“关闭并重启虚拟机”,如果你不确定当前值,进到“编排”页面查看“Host Isolation Response”下拉框。
检查faultDomainManager日志
这是vCenter里记录HA操作的组件,在vCenter的/var/log/vmware/vsphere-ha/目录下,有一个fdm.log文件,里面记录着HA的心跳活动、隔离事件和管理操作,直接看日志是vcenter虚拟机HA不生效时最有效的验证方式:
grep -i "isolation" fdm.log
grep -i "restart" fdm.log
日志会明确告诉你“这台主机认为对方已隔离但虚拟机未重启”的原因,通常会附带一个错误码,把错误码放到搜索引擎里找,大概率能找到现有案例,注意不要只看故障瞬间,要把故障前后10分钟的日志都拉出来对照。
实际场景下的HA故障排查重点
不同环境下,HA不生效的常见原因有很大差异,先分清自己的场景再动手,能省不少时间。
传统三层架构(物理机+共享存储)
这种场景下的主机数量和存储配置相对规范,HA不生效要么出在虚拟化软件层,要么出在网络二层隔离,优先看存储心跳是否正常,以及分布式交换机上的端口组是否同时承载了管理流量和vMotion流量,如果两者混在一起且带宽被占满,心跳会造成抖动,长时抖动会被vCenter误判为失联。
vSAN环境
vSAN的HA依赖主机间通信,vSAN本身又对网络延迟极其敏感,如果vSAN网络的MTU值不一致、组播被隔离,vSAN健康状态会闪红,而HA逻辑在vSAN不健康时默认不执行迁移,查一下vSAN的健康状态面板,行业共识是,这类问题的根因多数在基础网络,和HA本身关系不大。
小型双节点测试集群
只有两台ESXi主机时,加入vCenter的HA效果非常容易踩坑。双节点环境下必须配置群集级故障转移授权(vCenter Server HA)或搭配辅助节点投票器,否则一台宕机后,剩余的节点无法通过仲裁,集群状态直接进入“只读”,虚拟机不会迁移。
快速验证HA是否正常的办法
建议在正式环境改动前,先做一次“拉闸测试”,选一个低峰期,将某台主机上的业务虚拟机迁移走,然后直接拔掉该主机的电源线或强制关机,观察2-3分钟,看虚拟机是否在另一台主机上自动启动。
如果你不方便做物理断电,可以用下面命令模拟:
esxcli vm process kill --type=poweroff --world-id <虚拟机world ID>
强制关闭一台虚拟机,观察它是否在其他主机上被重新拉起,这是验证HA配置的最小成本操作,但注意,模拟杀VM不经过主机故障检测流程,只能验证虚拟机重启策略,无法验证主机故障检测链路。
Q&A:日常高频问题
vCenter集群HA配置了但主机宕机后虚拟机不自启动,该从哪里入手?
先看主机在HA面板中的显示状态,如果状态是“已隔离”,检查隔离响应设置;如果状态是“已断开”,看存储心跳和网络心跳,其次确认虚拟机的vSphere HA监控字段是“已启用”,最后看faultDomainManager日志里的具体错误码,按码索骥。
vSphere虚拟机没启用HA,但主机HA是开的,怎么让它参与故障转移?
不需要重新创建虚拟机,编辑虚拟机设置,进入“应用程序和OS”相关的“vSphere HA”选项,将“VM Monitoring”设为“已启用”,重启机器生效,前提是虚拟机必须在共享存储上,且集群的HA处于激活状态。
双主机vCenter环境里,关掉一台就直接失效,为什么总是无法实现自动漂移?
双节点环境通常触发了仲裁阈值问题,HA本质是少数服从多数,两台机器各占一票,一台离线后只剩一票,达不到多数要求,集群就失去仲裁能力,你需要给集群配置一台群集见证主机(在NAS中挂载一个iSCSI LUN),或者增加一台第三方仲裁设备来自动实现故障转移。