neutron中一种常见网络不通的现象,附修复脚本

neutron中经常发现vm ping不通网关,我发现很多情况是因为ovs-plugin没有将qvb连接到qbr桥上,所以解决办法也很简单,就是将其连上,即将qbr设为master。 具体的neutron、ovs、veth和iptables等就不展开讲了,具体可以看下图 当一个vm启动或被硬重启之后,tap接口(当使用gre模式时为tap)和qbr桥会被自动创建,而且tap的master为qbr。理论上qvb的master也应该是qbr,但我经常发现这个link的master没有被设置。那么设置脚本就很简单了:  Bash |   copy code |?1#!/bin/bash2 3LINKS=<code>ip link|grep qvb |awk ‘{print $2}’ |sed s’/.$//’|sed s’/^…//’ for LINK in $LINKS do # a qbr link should appear after hard reboot an instance ip link set “qbr$LINK” up echo … Continue reading

主动查询ovs的信息

openvswitch的flow信息获取途径现在通常是通过命令行CLI的方式(ovs-ofctl),或是部署agent,如neutron-ovs-agent,但通常这两种方法都需要在ovs所在的节点上部署,比较麻烦。 还有一种办法是网络controller通过openflow协议获取ovs的信息(如流信息),不过其负载就加重了。那么能否模拟网络controller的功能去获取流信息呢?当然可以,不过如果将ovs的控制器设置为主动模式连接我们的软件的话,那么这个软件就需要实现controller的功能,并且要与其他controller协作,更加麻烦。 其实openvswitch可以以服务端的形态存在,我们的软件可以连接ovs,从而获取其信息。要点在于 设置ovs为被动模式 ovs-vsctl set-controller br-tun tcp:30.0.0.1 ptcp:6601 这样ovs既可以主动连接网络controller(30.0.0.1:6633),又可以监听6601端口,接受客户端请求。此处br-tun与6601是一对,如果获取其他网桥的信息,则需要监听新的端口 设置ovs-ofctl为远程模式 在controller和node1两台机器上分别运行下面的命令:

可见从不同主机都可以访问controller节点的br-tun桥,信息相同。 虽然ovs-ofctl不是自动化的方法,当时可以使用管道等技术实现程序化的办法。 在此感谢@Outlook的提示

用REST获得openvswitch ovsdb的信息

客户端可以通过ovsdb定义的协议访问openvswitch的数据库,协议在http://tools.ietf.org/html/draft-pfaff-ovsdb-proto-02,看来要成为ietf的标准了?怎么查询这些数据其实有一个样例,但是比较简单,我这里略作扩展,说明如何查询ovs的网桥、所连controller和流信息。 准备工作 因为ovs需要认证(公钥)才能访问其数据,我们为了简化直接在ovs所在节点上运行以下命令:

然后可以直接通过tcp的方式访问ovsdb了 echo发送存活信息 客户端可以使用tcp方式与服务器保持长连接,所以可能定时需要发送echo信息与服务器确认存活。可编写以下脚本:  Python |   copy code |?0102import socket03import json04 05OVSDB_IP = ‘127.0.0.1’06OVSDB_PORT = 663207BUFSIZE = 40960008 09s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)10s.connect((OVSDB_IP, OVSDB_PORT))11 12query = {"method":"echo", "params":[], "id": 0}13s.send(json.dumps(query))14response = s.recv(BUFSIZE)15print response16 执行结果为: {“id”:0,”result”:[],”error”:null} 这是最简单的获取信息方式了,我们接下来要看看OVSDB中到底有些什么数据 获得所有数据库名 脚本中其他不变,最后三行换为以下内容,以后步骤也是类似:  Python |   copy code |?12query = … Continue reading