openvswitch的flow信息获取途径现在通常是通过命令行CLI的方式(ovs-ofctl),或是部署agent,如neutron-ovs-agent,但通常这两种方法都需要在ovs所在的节点上部署,比较麻烦。
还有一种办法是网络controller通过openflow协议获取ovs的信息(如流信息),不过其负载就加重了。那么能否模拟网络controller的功能去获取流信息呢?当然可以,不过如果将ovs的控制器设置为主动模式连接我们的软件的话,那么这个软件就需要实现controller的功能,并且要与其他controller协作,更加麻烦。
其实openvswitch可以以服务端的形态存在,我们的软件可以连接ovs,从而获取其信息。要点在于
- 设置ovs为被动模式
- 设置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, priority=0,icmp,in_port=6,vlan_tci=0x0000,dl_src=fa:16:3e:be:25:7b,dl_dst=fa:16:3e:aa:30:94,nw_src=192.168.1.1,nw_dst=100.0.0.19,icmp_type=0,icmp_code=0 actions=output:4
nsfocus@node1:/$ ovs-ofctl dump-flows tcp:192.168.19.1:6601 NXST_FLOW reply (xid=0x4): cookie=0x20000000000000, duration=25943.909s, table=0, n_packets=25900, n_bytes=2538200, 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=25943.905s, table=0, n_packets=25898, n_bytes=2538004, idle_timeout=5, idle_age=0, priority=0,icmp,in_port=6,vlan_tci=0x0000,dl_src=fa:16:3e:be:25:7b,dl_dst=fa:16:3e:aa:30:94,nw_src=192.168.1.1,nw_dst=100.0.0.19,icmp_type=0,icmp_code=0 actions=output:4
可见从不同主机都可以访问controller节点的br-tun桥,信息相同。
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不是自动化的方法,当时可以使用管道等技术实现程序化的办法。
在此感谢@Outlook的提示