compute节点启动初始化销毁已撤离虚拟机

针对OpenStack HA要不要做故障主机隔离,调研了nova-compute服务启动流程

调研结果:
1、nova-compute服务启动时,首先创建service对象,service来初始化ComputeManager与对应的driver(也就是libvirt);
2、service在start的时候,会调用执行ComputeManager的hook方法,包括init_host()方法,如下图;
compute节点启动初始化销毁已撤离虚拟机

3、init_host()方法逻辑见下图,其中有销毁已安全撤离Instance的方法调用:compute节点启动初始化销毁已撤离虚拟机
4、进一步看self._destroy_evacuated_instances()方法:
逐个Instance判断所属主机是否为本机,如果已经evacated,就将其destroy;
destroy包括:instance以及instance的network,disk。
compute节点启动初始化销毁已撤离虚拟机
compute节点启动初始化销毁已撤离虚拟机
结论:
nova-compute服务在启动时,会逐个检验Hypervisor上所有Instance,是否已经被evacuated(安全撤离了)。
如果已经安全撤离,则将其在本Hypervisor上的信息删除。
也就是说,HA功能不需要做隔离操作。

其他情况:
如果故障主机恢复正常重新启动后,Hypervisor服务正常,但nova-compute出现异常,不能正常启动。
会导致已经安全撤离的Instance无法销毁,与已安全撤离的Instance出现重复的情况。
这种情况下,由于nova-compute服务异常,通过api也无法做任何操作,只能特殊处理。
比如,管理员或者运维人员使用virsh,从libvirt层面手动删除已经安全撤离的Instance。