搭建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文件有问题??。。。。。。