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没有被设置。那么设置脚本就很简单了: #!/bin/bash LINKS=`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 … 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两台机器上分别运行下面的命令: nsfocus@controller:/$ ovs-ofctl dump-flows tcp:127.0.0.1:6601 NXST_FLOW reply (xid=0x4): cookie=0x20000000000000, duration=25911.957s, table=0, n_packets=25868, n_bytes=2535064, idle_timeout=5, idle_age=2, priority=0,icmp,in_port=4,vlan_tci=0x0000,dl_src=fa:16:3e:aa:30:94,dl_dst=fa:16:3e:be:25:7b,nw_src=100.0.0.19,nw_dst=192.168.1.1,icmp_type=8,icmp_code=0 actions=output:6 cookie=0x20000000000000, duration=25911.953s, table=0, n_packets=25866, n_bytes=2534868, idle_timeout=5, idle_age=0, … Continue reading

用REST获得openvswitch ovsdb的信息

客户端可以通过ovsdb定义的协议访问openvswitch的数据库,协议在http://tools.ietf.org/html/draft-pfaff-ovsdb-proto-02,看来要成为ietf的标准了?怎么查询这些数据其实有一个样例,但是比较简单,我这里略作扩展,说明如何查询ovs的网桥、所连controller和流信息。 准备工作 因为ovs需要认证(公钥)才能访问其数据,我们为了简化直接在ovs所在节点上运行以下命令: ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6632 然后可以直接通过tcp的方式访问ovsdb了 echo发送存活信息 客户端可以使用tcp方式与服务器保持长连接,所以可能定时需要发送echo信息与服务器确认存活。可编写以下脚本: import socket import json OVSDB_IP = ‘127.0.0.1’ OVSDB_PORT = 6632 BUFSIZE = 409600 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((OVSDB_IP, OVSDB_PORT)) query = {“method”:”echo”, “params”:[], “id”: … Continue reading