OpenVSwitch介绍
OpenVSwitch介绍
1、概述
- 1.1 OpenVSwitch的定义
- OpenvSwitch 是一个生产环境质量级的、开源的虚拟交换机软件。在虚拟化环境中,单个物理机上的不同虚拟机、多个物理机上的不同虚拟机之间通过它进行网络通信。OpenvSwitch 被设计为可以与当下流行的交换机芯片兼容,这意味着它可以与物理交换机协同工作,并提供*、灵活的管理手段。OpenvSwitch 支持运行在 Linux上的虚拟化平台包括:KVM,VirtualBox,Xen,Xen Cloud Platform,XenServer。相比于简单的 Linux Bridge,OpenvSwitch可以实现网络隔离、QoS配置、流量监控、数据包分析等物理交换网络所具有的功能。
- 1.2 OpenvSwitch的运行原理
- OVS的核心组件包括ovsdb-server,ovs-vswitchd,ovs kernel module。如下图所示:
其运行原理是:内核模块实现了多个“数据路径”(datapath,类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。每个数据路径也通过关联流表(flow table)来设置操作,而这些流表中的流都是用户空间(userspace)在报文头和元数据的基础上映射的关键信息。一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息,并在流表中查找这些关键信息。当有一个匹配的流时,便执行对应的操作。如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流,用于以后碰到相同类型的数据包时,可以在内核中执行某操作)。细节如下图所示:
OpenvSwitch实现的严密流量控制,大多是通过OpenFlow交换协议实现的。OpenFlow使网络控制器软件能够通过网络,访问交换机或路由器的数据路径。网络管理员可以使用这个技术在一台PC上远程控制数据管理,这样他们就能够进行精细的路由和交换控制,并实现复杂的网络策略。有了OpenvSwitch中的这些远程管理功能,多租赁云计算的集成商和供应商就能够向客户提供在一台PC上持续管理各自虚拟网络、应用和策略的功能。
OVS的核心组件及其管理工具,详细介绍如下:ovs-vswitchd:OVS的守护进程,它是OVS的核心部件,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换(flow-based switching)。ovs-vswitchd与上层controller通信遵从OpenFlow协议,与ovsdb-server通信使用OVSDB协议,与内核模块通过netlink通信。支持多个独立的datapath(网桥),它通过更改flow table实现了绑定和VLAN等功能。
ovsdb-server:OVS轻量级的数据库服务器,用于整个OVS的配置信息,包括接口,交换内容,VLAN等等。ovs-vswitchd根据数据库中的配置信息工作。它与manager和ovs-vswitchd交换信息使用了OVSDB(JSON-RPC)的方式。
ovs-dpctl:配置交换机内核模块,也可以控制转发规则。
ovs-vsctl:获取或更新ovs-vswitchd的配置信息。此工具操作时,会更新ovsdb-server中的数据库。
ovs-appctl:向OVS守护进程(ovs-vswitchd)发送命令的。
ovsdbmonitor:GUI工具,用来显示ovsdb-server中的数据信息(可以远程获取OVS数据库和OpenFlow的流表)。
ovs-controller:一个简单的OpenFlow控制器。
ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时候的流表内容。
ovs-pki:OpenFlow交换机创建和管理公钥框架。
ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息。 -
在Newton版本之前,neutron-openvswitch-agent默认使用“ovs-ofctl”和“ovsdb”接口驱动。而自Newton版本开始,改为“native”接口驱动,提高了性能。
ovs-ofctl驱动:即调用ovs-ofctl命令进行openflow流表下发,启动ovs-ofctl命令需要花很多时间,而“native”驱动是通过调用ryu控制器接口,通过openflow协议下发openflow流表。
ovs-vsctl驱动:即调用ovs-vsctl命令进行端口、bridge的增删,启动ovs-vsctl命令需要花很多时间,而“native”驱动是通过调用ovs提供的python api接口,通过ovsdb协议来操作。
2 启用OpenvSwitch
- 2.1 设置mechanism driver
- 编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件:
[ml2]
……
mechanism_drivers = openvswitch
注:控制节点和计算机点均需配置
- 2.2 重启服务
- 重启neutron和openvswitch服务:
systemctl restart neutron-server.service neutron-openvswitch.service
检测状态(注意控制节点和计算节点均需正常启动):
3 命令行
OpenvSwitch常用命令如下:
ovs-vsctl add-br br-test #创建网桥
ovs-vsctl add-port br-test enp4s0 #为网桥添加物理接口
ovs-vsctl set port enp4s0 tag=10 #将端口设置为access口
ovs-vsctl add-port br-test enp4s0 tag=10 #为网桥添加access口(等价于上两条命令)
ovs-vsctl add-port br-test enp4s0 trunk=3,4,5,6 #为网桥添加trunk口
ovs-vsctl del-br br-test #删除网桥
ovs-vsctl del-port br-test enp4s0 #删除网桥接口
ovs-vsctl show #查看所有网桥
ovs-vsctl list-br #列出所有网桥
ifconfig br-test #查看网桥
ovs-vsctl port-to-br enp4s0 #列出挂载网络接口enp4s0的所有网桥
ovs-vsctl set interface enp4s0 type=internal #设置enp4s0的类型
ovs-vsctl set interface enp4s0 type=gre options:remote_ip=1.2.3.4 #设置GRE tunnel
ovs-vsctl set interface enp4s0 ofport_request=9 #设置OpenFlow port number为9
ovs-vsctl set interface enp4s0 type=vxlan option:remote_ip=1.2.3.4 option:key=66 #设置VXLAN(VNI为66)端口
ovs-vsctl set interface enp4s0 type=vxlan option:remote_ip=1.2.3.4 option:key=flow #设置VNI flow
#以下两条命令针对网络接口enp4s0作QoS流量限速1000±100kbps
ovs-vsctl set interface enp4s0 ingress_policing_rate=1000
ovs-vsctl set interface enp4s0 ingress_policing_burst=100
ovs-ofctl show br-test #查看网桥
ovs-ofctl dump-ports br-test #查看网桥上所有端口的状态
ovs-ofctl dump-flows br-test #查看网桥上面的流表规则
ovs-ofctl add-flow br-test idle_timeout=120,in_port=2,actions=drop #添加一条流表规则,丢弃从port 2上发来的所有数据表
ovs-ofctl add-flow br-test table=0,dl_src=01:00:00:00:00:00/01:00:00:00:00:00,actions=drop #屏蔽所有进入 OVS 的以太网广播数据包
ovs-ofctl add-flow br-dp table=0,dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0,actions=drop #屏蔽STP协议的广播数据包
4 OVS问题总结
- 4.1 物理网卡无法设置IP
- 问题现象:在将物理网卡设置为网桥的端口之后,网卡便宕了。
解决办法:一块物理以太网卡,如果作为OpenvSwitch bridge的一部分,则它不能拥有IP地址。如果有,也会完全不起作用。但我们可以将IP地址绑定至某OpenvSwitch internal设备来恢复网络访问功能。
例如,假设你的enp4s0 IP地址为1.2.3.4,在执行上文所述的添加网桥(add-br)和端口(add-port)的命令后,可以使用如下方法来将IP地址绑定至enp4s0上:
ifconfig enp4s0 0.0.0.0
ifconfig br-test 1.2.3.4
- 4.2 网桥绑定两块物理网卡
- 问题现象:创建了bridge之后,将两块物理网卡绑定在该网桥上,如下:
ovs-vsctl add-br br-test
ovs-vsctl add-port br-test eth0
ovs-vsctl add-port br-test eth1
此时,网络便崩溃了,CPU利用率也非常高。
问题分析:这是形成环路造成的。在上面的设置下,OpenvSwitch在eth0上收到一个广播包后会将其发给eth1,然后eth1上的物理交换机又将这个广播包发还给eth0,如此往复。当有多个 switch时,还会产生更复杂的情况。
解决方案1:如果你想将eth0与eth1都绑定至同一个bridge,从而获得更大的带宽、更高的可靠性,可以像下面这样做:
ovs-vsctl add-br br-test
ovs-vsctl add-bond br-test bond0 eth0 eth1
解决方案2:如果你已经拥有了一个复杂或冗余的网络拓扑结构,但你想预防结环,就需要打开生成树协议(spanning tree protocol,STP)。
按照下面的命令,依序创建br0,打开STP,然后将eth0与eth1绑定至 br-test:
ovs-vsctl add-br br-test
ovs-vsctl set bridge br-test stp_enable=true
ovs-vsctl add-port br-test eth0
ovs-vsctl add-port br-test eth1
上一篇: OpenvSwitch key模块详解