在重置OVS时,会用到以下命令
1、ovs-vsctl emer-reset
2、ovs-vsctl init
3、rm -rf /etc/openvswitch/*
但这个ovs-vsctl emer-reset命令会触发一个BUG,导致无法恢复流表信息,甚至引起网络回环。
这个BUG在ocata版本中出现,到现在的queens版本也还有,但在之前的mitaka版本却没有。
下面来看下示例
在ocata版本中
[root@test01 neutron]# ovs-ofctl dump-flows br-tun
NXST_FLOW reply (xid=0x4):
cookie=0x9aec1bf161d6039e, duration=59133.523s, table=0, n_packets=3, n_bytes=416, idle_age=37761, priority=1,in_port=1 actions=resubmit(,2)
cookie=0x9aec1bf161d6039e, duration=59125.488s, table=0, n_packets=2, n_bytes=433, idle_age=37761, priority=1,in_port=2 actions=resubmit(,4)
cookie=0x9aec1bf161d6039e, duration=59125.463s, table=0, n_packets=0, n_bytes=0, idle_age=59125, priority=1,in_port=3 actions=resubmit(,4)
cookie=0x9aec1bf161d6039e, duration=59133.521s, table=0, n_packets=0, n_bytes=0, idle_age=59133, priority=0 actions=drop
cookie=0x9aec1bf161d6039e, duration=59133.518s, table=2, n_packets=1, n_bytes=42, idle_age=37766, priority=1,arp,dl_dst=ff:ff:ff:ff:ff:ff actions=resubmit(,21)
cookie=0x9aec1bf161d6039e, duration=59133.515s, table=2, n_packets=2, n_bytes=374, idle_age=37761, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)
然后执行ovs-vsctl emer-reset 命令
再看流表,发现已清空
[root@test01 neutron]# ovs-ofctl dump-flows br-tun
cookie=0x0, duration=9.061s, table=0, n_packets=0, n_bytes=0, idle_age=9, priority=0 actions=NORMAL
查看 openvswitch-agent.log,则认为OVS is Dead,但是OVS还是正常运行的
这个会引发网络故障甚至在复杂网络环境中影响到物理交换机所透传的部分生产与测试VLAN相关业务,造成事故。
解决:重启 neutron-openvswitch-agent 后,流表恢复正常。(但不一定)
再看M版
在计算节点查看 br-tun 的流表
root@test1:~# ovs-ofctl dump-flows br-tun
NXST_FLOW reply (xid=0x4):
cookie=0x8452729fc5c996cb, duration=16.012s, table=0, n_packets=0, n_bytes=0, idle_age=16, priority=1,in_port=1 actions=resubmit(,2)
cookie=0x8452729fc5c996cb, duration=12.923s, table=0, n_packets=0, n_bytes=0, idle_age=12, priority=1,in_port=4 actions=resubmit(,4)
cookie=0x8452729fc5c996cb, duration=12.230s, table=0, n_packets=0, n_bytes=0, idle_age=12, priority=1,in_port=3 actions=resubmit(,4)
cookie=0x8452729fc5c996cb, duration=16.012s, table=0, n_packets=0, n_bytes=0, idle_age=16, priority=0 actions=drop
......
执行 ovs-vsctl emer-reset
再查看流表,又恢复了
查看 openvswitch-agent.log,openvswitch-agent 认为 OVS is restarted. OVSNeutronAgent will reset bridges
同样的操作,在M版能自动恢复流表,而在O版却报错,应该算是neutron-openvswitch-agent的一个bug,这是一个需要慎用的命令。
补充:openvSwitch工作原理
openvSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,由 Nicira Networks开发,主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被设计位支持跨越多个物理服务器的分布式环境,类似于VMware的vNetwork分布式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多种linux 虚拟化技术,包括Xen/XenServer, KVM和VirtualBox。
openvswitch是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer,KVM以及virtualBox多种虚拟化技术。在这种虚拟化的环境中,一个虚拟交换机主要有两个作用:传递虚拟机之间的流量,以及实现虚拟机和外界网络的通信。
内核模块实现了多个“数据路径”(类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。每个数据路径也通过关联一下流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。当有一个匹配的流时它执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作)。
备注:
新建一个桥(交换机),命名为s1:
ovs-vsctl add-br s1
注意:在进行OVS设置时很容易造成虚拟交换机与物理交换机构成二层环路(比如虚拟交换机包含两块网卡,而这两块网卡都连接到物理交换机上,就是一个环路),一旦有广播报文,比如ARP请求,就会引发广播风暴,使网络瘫痪。因此,应该把虚拟交换机开启STP支持,避免广播风暴:
ovs−vsctl set bridge 交换机名 stp_enable=true
附常用OVS操作
1.添加网桥:ovs-vsctl add-br 交换机名
2.删除网桥:ovs-vsctl del-br 交换机名
3.添加端口:ovs-vsctl add-port 交换机名 端口名(网卡名)
4.删除端口:ovs-vsctl del-port 交换机名 端口名(网卡名)
5.连接控制器:ovs-vsctl set-controller 交换机名 tcp:IP地址:端口号
6.断开控制器:ovs-vsctl del-controller 交换机名
7.列出所有网桥:ovs-vsctl list-br
8.列出网桥中的所有端口:ovs-vsctl list-ports 交换机名
9.列出所有挂接到网卡的网桥:ovs-vsctl port-to-br 端口名(网卡名)
10.查看open vswitch的网络状态:ovs-vsctl show
11.查看 Open vSwitch 中的端口信息(交换机对应的 dpid,以及每个端口的 OpenFlow 端口编号,端口名称,当前状态等等):ovs-ofctl show 交换机名
12.修改dpid:ovs-vsctl set bridge 交换机名 other_config:datapath-id=新DPID
13.修改端口号:ovs-vsctl set Interface 端口名 ofport_request=新端口号
14.查看交换机中的所有 Table:ovs-ofctl dump-tables ovs-switch
15.查看交换机中的所有流表项:ovs−ofctl dump−flows ovs-switch
16.删除编号为 100 的端口上的所有流表项:ovs-ofctl del-flows ovs-switch “in_port=100”
17.添加流表项(以“添加新的 OpenFlow 条目,修改从端口 p0 收到的数据包的源地址为 9.181.137.1”为例):
ovs-ofctl add-flow ovs-switch “priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal”
(更多说明请查阅:《基于 Open vSwitch 的 OpenFlow 实践》)
18.查看 OVS 的版本信息:ovs-appctl –version
19.查看 OVS 支持的 OpenFlow 协议的版本:ovs-ofctl –version