openstack(PIKE) neutron问题排查

搭建opensatck-ovs网络出现问题,现记录解决过程:

问题:网络连接不通
具体表现:ping不通router端口,创建vm 网络节点出现绑定错误ERROR:binding_type = binding_failed

查看网络节点neutron的日志没发现什么问题,openvswitch-agent日志报端口绑定失败警告。openvswitch并无日志输出

定位:neutron网络错误

尝试解决1:重装neutron网络节点。 结果:失败,问题依旧

尝试解决2:换个机器装网络节点。 结果:失败,问题依旧

尝试解决3:重装所有服务。 结果:失败 问题依旧

尝试解决4:

查看port状态
neutron port-list
+--------------------------------------+------+
| id                                   | name | 
+--------------------------------------+------+
| 47e*******************        |      | .....
+--------------------------------------+------+-

neutron port-show 47e*******************
-----------------------+----------------------
| Field                 | Value                
+-----------------------+---------------------
.....
| binding:vif_details   | {}                  
| binding:vif_type      | binding_failed      
| binding:vnic_type     | normal              
.....
+-----------------------+----------------------
正常工作的port状态应该如下:
-----------------------+-----------------------
| Field                 | Value
+-----------------------+-----------------------
....
| binding:vif_details   | {"port_filter": true, ...
| binding:vif_type      | ovs                   
| binding:vnic_type     | normal                
.....
+-----------------------+----------------------

可看到错误来源binding:vif_type = binding_failed
问题定位到端口绑定上:路由端口绑定失败。

查看所有节点所有服务所有日志,包括DEBUG日志,在neutron网络节点看到openvswith-agent.log在进行路由端口绑定的时候出现警告

WARNING: neutron.agent.rpc [req-80c99925-5226-4147-bb77-c16aefd2305c - - - - -] Device Port(***admin_state_up=True,*******8:12Z) is not bound.
WARNING: neutron.plugins.ml2.drivers.openvswitch.agent.ovs_neutron_agent [req-----] Device 0---** not defined on plugin or binding failed。 

信息量还不够,没有绑定失败的原因。

neutron-server的日志输出:

ERROR....neutron.plugins.ml2.managers....:Failed to bind port ....on host....for vnic_type...using segments......

日志并未列出失败原因

尝试解决5:从底层入手,观察network节点在路由绑定时出现的问题,使用strace,ltrace跟踪openvswitch进程,但看到的只是一堆系统调用,没有发现问题。
结果:失败 问题依旧

尝试解决6:百般无解,只能从源码入手了,观察进行路由绑定时抛出的日志,发现只有控制节点出现ERROR,其他节点无ERROR日志,决定从控制节点neutron-server的源码查起。

查看neutron-server的日志
ERROR....neutron.plugins.ml2.managers....:Failed to bind port ....on host....for vnic_type...using segments......

出错误日志的模块是ml2的manager,其py文件是
/usr/lib/python2.7/site-packages/neutron/plugins/ml2/managers.py

在750行有对应绑定处理

context._clear_binding_levels()
        if not self._bind_port_level(context, 0,
                                     context.network.network_segments):
            binding.vif_type = portbindings.VIF_TYPE_BINDING_FAILED
            LOG.error("Failed to bind port %(port)s on host %(host)s "
                      "for vnic_type %(vnic_type)s using segments "
                      "%(segments)s",
                      {'port': context.current['id'],
                       'host': context.host,
                       'vnic_type': binding.vnic_type,
                       'segments': context.network.network_segments})

从代码上看,manager先进行绑定,绑定失败后将vif_type标注为bingding_failed状态,然后输出日志。这也就是port状态是binding:vif_type | binding_failed的原因,

查看_bind_port_level方法

def _bind_port_level(self, context, level, segments_to_bind):
        binding = context._binding
        port_id = context.current['id']
        LOG.debug("Attempting to bind port %(port)s on host %(host)s "
                  "at level %(level)s using segments %(segments)s",
                  {'port': port_id,
                   'host': context.host,
                   'level': level,
                   'segments': segments_to_bind})

        ........
            except Exception:
                LOG.exception("Mechanism driver %s failed in "
                              "bind_port",
                              driver.name)

manager进行端口level绑定时会先输出Attempting to bind port…日志,但在日志中并未发现相应输出,难道是我跟错了?

没关系,可以自己debug看看是咋回事。一个断点排查并不值得我去部署openstack开发环境,所以直接VIM编辑,重启neutron-server,重新绑定路由器查看输出。
修改代码如下,加输出测试

      if not self._bind_port_level(context, 0,
                                     context.network.network_segments):
            binding.vif_type = portbindings.VIF_TYPE_BINDING_FAILED
            LOG.error("my_bind test ===")
            LOG.error("Failed to bind port %(port)s on host %(host)s "
                      "for vnic_type %(vnic_type)s using segments "
                      "%(segments)s",
                      {'port': context.current['id'],
                       'host': context.host,
                       'vnic_type': binding.vnic_type,
                       'segments': context.network.network_segments})

重启neutron-server服务,发现启动较慢,耗时一分钟….

systemctl stop neutron-server.service
systemctl start neutron-server.service

之后尝试重新绑定路由器

neutron router-gateway-set my_router my_provider

查看neutron-server日志,并未发现”my_bind test ====”输出

查看port状态:


neutron port-list
+------------+------+------------------+-----------------------------------------------------+
| id         | name | tenant_id        | mac_address    | fixed_ips      
+---------------------+----------------+-----------------------------------------------------+
| 521******* |      | ad******         | ***************| {.."ip_address": "172.*.*.160"}    |


neutron port-show 521*******
------------------------+-----------------------
| Field                 | Value                
+-----------------------+-----------------------
....
| binding:vif_details   | {"port_filter": true, ...
| binding:vif_type      | ovs
| binding:vnic_type     | normal
.....
+-----------------------+----------------------

绑定成功了???????????
校检:

ping 172.*.*.160
...
64 bytes from 172.*.*.160: icmp_seq=1 ttl=64 time=0.260 ms
64 bytes from 172.*.*.160: icmp_seq=2 ttl=64 time=0.532 ms
64 bytes from 172.*.*.160: icmp_seq=3 ttl=64 time=0.531 ms

??????成功?
启动一个vm测试:控制面板启动vm成功,无报错。

查看network日志,无报错。
查看neutron-server日志:无报错

所以,问题解决了???

问题分析:修改neutron ml2 maneger代码重启服务后问题解决。只是增加一句输出。
据我所理解,应该是修改了manager源码后,python重新编译该py文件到pyc文件,重启花了一分钟时间,执行时使用的是重新编译的pyc文件,绑定成功。
难道之前的pyc文件有问题??。。。。。。

你可能感兴趣的:(openstack(PIKE) neutron问题排查)