nova-compute 服务出现Unsupported VIF type binding_failed convert '_nova_to_osvif_vif_binding_failed错误
nova-compute 服务出现Unsupported VIF type binding_failed convert '_nova_to_osvif_vif_binding_failed错误
问题出现
在一次重启nova-compute服务中,发现服务一直处于不断重启中, 日志不断出现以下的错误:
定位问题
看了一会,并不能看出什么问题,以前从未遇到过。于是深入代码找问题。
先直接到最后报错的代码:
LOG.debug("Converting VIF %s", vif)
funcname = "_nova_to_osvif_vif_" + vif['type'].replace(".", "_")
func = getattr(sys.modules[__name__], funcname, None)
if not func:
raise exception.NovaException(
"Unsupported VIF type %(type)s convert '%(func)s'" %
{'type': vif['type'], 'func': funcname})
依旧不能看出什么问题,继续往上找,至到找到倒数第三,也就是以下的代码时,发现了一些有用的东西:
def plug_vifs(self, instance, network_info):
"""Plug VIFs into networks."""
for vif in network_info:
self.vif_driver.plug(instance, vif)
给云主机plug vif的代码,也就是在plug的时候错误了,但是目前的日志无法让我得知究竟是哪个云主机导致的问题,但是这个接口有个network_info的参数,只要将这个打印出来,就能定位到具体的问题根源:
这里就不给出加打印日志后的东西了。
定位到那台云主机之后就用命令查看云主机的具体信息。
查到了以下的信息:
| OS-EXT-STS:power_state | NOSTATE |
| OS-EXT-STS:task_state | None |
| OS-EXT-STS:vm_state | stopped
power_state为NOSTATE的状态,这样的云主机处于异常状态。但是究竟是什么导致的异常。结合上面nova-compute的日志就能推断出是网卡的异常。然后重点查看了云主机的网卡信息。发现云主机是对外部网络直连。然而当前云主机所在的宿主机并没有这个物理网络的配置。
换句话说,这个物理网络在这个宿主机上没有在Linuxbridge的配置文件中绑定一个eth网口。所以结果就是这个物理网络在这个宿主机没有建立qrb-xxxx的网桥。
那么问题就出现了:
云主机的网卡tapxxxx是需要绑定在物理网络的网桥qrbxxxx上的,而nova-compute服务在启动的时候就会对每个正常的云主机(vm_state 不是error)做初始化,对有网络的需要plug vif,也就是上面日志出错的点上。
这里为什么说是正常的云主机,如果云主机处于vm_state 是error的状态下,nova-compute服务就会过滤掉。
解决问题
所以整个错误根源就知道在哪了,修复问题也就没什么难度。
只需要将云主机的网卡卸载就可以,或者删除云主机
最后
这仅仅是个人一个排查问题的小记录,每个问题的原因都有可能不一样。这里仅提供一种可能性的参考或者查找方法参考