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服务中,发现服务一直处于不断重启中, 日志不断出现以下的错误:

nova-compute 服务出现Unsupported VIF type binding_failed convert '_nova_to_osvif_vif_binding_failed错误

定位问题

看了一会,并不能看出什么问题,以前从未遇到过。于是深入代码找问题。

先直接到最后报错的代码:

   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服务就会过滤掉。

解决问题

所以整个错误根源就知道在哪了,修复问题也就没什么难度。

只需要将云主机的网卡卸载就可以,或者删除云主机

最后

这仅仅是个人一个排查问题的小记录,每个问题的原因都有可能不一样。这里仅提供一种可能性的参考或者查找方法参考