OpenvSwitch完全使用手册.docx
《OpenvSwitch完全使用手册.docx》由会员分享,可在线阅读,更多相关《OpenvSwitch完全使用手册.docx(18页珍藏版)》请在冰豆网上搜索。
OpenvSwitch完全使用手册
OpenvSwitch完全使用手册
本文主要参考 Overviewoffunctionalityandcomponents 以及 FrequentlyAskedQuestions 以及结合自己的理解。
1什么是OpenvSwitch
OpenvSwitch,简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer,KVM,andVirtualBox多种虚拟化技术。
OpenvSwitch还支持多个物理机的分布式环境。
在这种某一台物理机器的虚拟化环境中,一个虚拟交换机(vswitch)主要有如下两个作用:
∙传递虚拟机VM之间的流量
∙以及实现VM和外界网络的通信
如下图所示:
整个OVS代码用C写的。
目前有以下功能:
∙Standard802.1QVLANmodelwithtrunkandaccessports
∙NICbondingwithorwithoutLACPonupstreamswitch
∙NetFlow,sFlow(R),andmirroringforincreasedvisibility
∙QoS(QualityofService)configuration,pluspolicing
∙GRE,GREoverIPSEC,VXLAN,andLISPtunneling
∙802.1agconnectivityfaultmanagement
∙OpenFlow1.0plusnumerousextensions
∙TransactionalconfigurationdatabasewithCandPythonbindings
∙High-performanceforwardingusingaLinuxkernelmodule
2OpenvSwitch的组成
OVS的核心组件包括ovsdb-server,ovs-vswitchd,ovskernelmodule。
如下图所示:
运行原理:
内核模块实现了多个“数据路径(DataPath)”(类似于网桥),每个都可以有多个“vports”(类似于桥内的端口)。
每个数据路径也通过关联流表(flowtable)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。
当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息。
当有一个匹配的流时它执行对应的操作。
如果没有匹配,它会将数据包送到用户空间的处理队列中(作为处理的一部分,用户空间可能会设置一个流用于以后遇到相同类型的数据包可以在内核中执行操作)。
细节如下图所示:
除了核心组件,还包括一些管理工具,详细介绍如下:
∙ovs-vswitchd:
OVS守护进程是OVS的核心部件,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换(flow-basedswitching)。
它和上层controller通信遵从OPENFLOW协议,它与ovsdb-server通信使用OVSDB协议,它和内核模块通过netlink通信,它支持多个独立的datapath(网桥),它通过更改flowtable实现了绑定和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守护进程发送命令的,一般用不上。
autilitythatsendscommandstorunningOpenvSwitchdaemons(ovs-vswitchd)
∙ovsdbmonitor:
GUI工具来显示ovsdb-server中数据信息。
(Ubuntu下是可以使用apt-get安装,可以远程获取OVS数据库和OpenFlow的流表)
∙ovs-controller:
一个简单的OpenFlow控制器
∙ovs-ofctl:
用来控制OVS作为OpenFlow交换机工作时候的流表内容。
∙ovs-pki:
OpenFlow交换机创建和管理公钥框架;
∙ovs-tcpundump:
tcpdump的补丁,解析OpenFlow的消息;
∙brocompat.ko:
Linuxbridgecompatibilitymodule
∙openvswitch.ko:
OpenvSwitchswitchingdatapath
一些用用的OVS命令示例:
sudoovs-vsctlshow
sudoovs-vsctladd-brmybridge
sudoovs-vsctldel-brmybridge
sudoovs-vsctladd-portmybridgeport-name
sudoovs-vsctldel-portmybridgeport-name
sudoovs-vsctllistBridge/Port/Interface/...
sudoovs-appctlfdb/showmybridge
sudoovs-ofctlshowmybridge
sudoovs-ofctldump-flowsmybridge
sudoovs-ofctladd-flowmybridgedl_src=02:
a2:
a2:
a2:
a2:
a2,dl_dst=02:
b2:
b2:
b2:
b2:
b2,in_port=2,dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=output:
6
sudoovs-ofctldel-flowsmybridgedl_src=02:
a2:
a2:
a2:
a2:
a2,dl_dst=02:
b2:
b2:
b2:
b2:
b2,in_port=2,dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2
sudoovs-ofctladd-flowdp0in_port=2,actions=output:
6
#Thiswilldeletealltheflowentriesintheflowtable
Sudoovs-ofctldel-flowsmybridge
3OpenvSwitch和其他vswitch
这里其他的vswitch,包括VMwarevNetworkdistributedswitch以及思科的CiscoNexus1000V。
VMwarevNetworkdistributedswitch以及思科的CiscoNexus1000V这种虚拟交换机提供的是一个集中式的控制方式,。
而OVS则是一个独立的vswitch,他运行在每个实现虚拟化的物理机器上,并提供远程管理。
OVS提供了两种在虚拟化环境中远程管理的协议:
∙一个是OpenFlow,通过流表来管理交换机的行为,
∙一个是OVSDBmanagementprotocol,用来暴露sietch的port状态。
4概念及工作流程
4.1vswitch、Bridge、Datapath
在网络中,交换机和桥都是同一个概念,OVS实现了一个虚拟机的以太交换机,换句话说,OVS也就是实现了一个以太桥。
那么,在OVS中,给一个交换机,或者说一个桥,用了一个专业的名词,叫做DataPath!
要了解OVS如何工作,首先需要知道桥的概念:
网桥也叫做桥接器,连接两个局域网的设备,网桥工作在数据链路层,将两个LAN连接,根据MAC地址来转发帧,可以看成一个“低层的路由器”(路由器工作在网络层,根据IP地质进行转发)。
网桥的工作原理
网桥处理包遵循以下几条规则:
∙在一个接口上接收到的包不会再往那个接口上发送此包。
∙每个接收到的包都要学习其源MAC地址。
∙如果数据包是多播或者广播包(通过2层MAC地址确定)则要向接收端口以外的所有端口转发,如果上层协议感兴趣,则还会递交上层处理。
∙如果数据包的地址不能再CAM表中找到,则向接收端口以外的其他端口转发。
∙如果CAM表中能找到,则转发给相应端口,如果发送和接收都是统一端口,则不发送。
注意,网桥是以混杂模式工作的。
关于网桥更多,请查阅相关资料。
OVS中的bridge
上面,说到,一个桥就是一个交换机。
例如,在OVS中:
root@localhost:
~#ovs-vsctladd-brbr0
root@localhost:
~#ifconfigbr0
br0Linkencap:
EthernetHWaddr1a:
09:
56:
ea:
0b:
49
inet6addr:
fe80:
:
1809:
56ff:
feea:
b49/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
1584errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
6errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
0
RXbytes:
316502(316.5KB)TXbytes:
468(468.0B)
当我们创建了一个交换机(网桥)以后,此时网络功能不受影响,但是会产生一个虚拟网卡,名字就是网桥的名称(br-int),之所以会产生一个虚拟网卡,是为了实现接下来的网桥(交换机)功能。
有了这个交换机以后,还需要为这个交换机增加端口(port),一个端口,就是一个物理网卡,当网卡加入到这个交换机之后,其工作方式就和普通交换机的一个端口的工作方式类似了。
root@localhost:
~#ovs-vsctladd-portbr0port
这里要特别注意,网卡加入网桥以后,要按照网桥的工作标准工作,那么加入的一个端口就必须是以混杂模式工作,工作在链路层,处理2层的帧,所以这个port就不需要配置IP了。
(你没见过哪个交换的端口有IP的吧)
那么接下来你可能会问,通常的交换机不都是有一个管理接口,可以telnet到交换机上进行配置吧,那么在OVS中创建的虚拟交换机有木有这种呢,有的!
上面既然创建交换机brname的时候产生了一个虚拟网口br-int,那么,你给这个虚拟网卡配置了IP以后,就相当于给交换机的管理接口配置了IP,此时一个正常的虚拟交换机就搞定了。
root@localhost:
~#ipaddressadd192.168.1.1/24devbr0
最后,我们来看看一个br的具体信息:
root@localhost:
~#ovs-vsctlshow
bc12c8d2-6900-42dd-9c1c-30e8ecb99a1b
Bridge"br0"
Port"eth0"
Interface"eth0"
Port"br0"
Interface"br0"
type:
internal
ovs_version:
"1.4.0+build0"
首先,这里显示了一个名为br0的桥(交换机),这个交换机有两个接口,一个是eth0,一个是br0,上面说到,创建桥的时候会创建一个和桥名字一样的接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口,实现了桥的功能。
#### OpenvSwitch的典型工作流程
这一部分以一个简单的例子,说明在虚拟化环境中OpenvSwitch的典型工作流程。
前面已经说到,OVS主要是用来在虚拟化环境中。
实现虚拟机之间通信以及一个虚拟机和外网之间通信,如下是一个典型的结构图:
那么,通常情况下的工作流程如下:
1.VM实例instance产生一个数据包并发送至实例内的虚拟网络接口VNIC,图中就是instance中的eth0.
2.这个数据包会传送到物理机上的VNIC接口,如图就是vnet接口。
3.数据包从vnetNIC出来,到达桥(虚拟交换机)br100上.
4.数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理机上的eth0.
5.数据包从eth0出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数据包其实已经不受你的控制了。
一般L2switch连接eth0的这个口是一个trunk口,因为虚拟机对应的VNET往往会设置VLANTAG,可以通过对虚拟机对应的vnet打VALNTAG来控制虚拟机的网络广播域.如果跑多个虚拟机的话,多个虚拟机对应的vnet可以设置不同的vlantag,那么这些虚拟机的数据包从eth0(4)出去的时候,会带上TAG标记.这样也就必须是trunk口才行.
6OVS简单应用实例
6.1创建物理机到物理机的网络拓扑
root@localhost:
~#ovs-vsctladd-brbr0
root@localhost:
~#ovs-vsctladd-portbr0eth0
root@localhost:
~#ovs-vsctladd-portbr0eth1
6.2创建虚拟机到虚拟机的网络拓扑
使用KVM虚拟化。
root@localhost:
~#ovs-vsctladd-brbr0
root@localhost:
~#cat/etc/ovs-ifup
#!
/bin/sh
switch='br0'
/sbin/ifconfig$10.0.0.0up
ovs-vsctladd-port${switch}$1
root@localhost:
~#cat/etc/ovs-ifdown
#!
/bin/sh
switch='br0'
ovs-vsctldel-port${sw/sbin/ifconfig$10.0.0.0down
itch}$1
root@localhost:
~#kvm-m512-netnic,macaddr=00:
11:
22:
33:
44:
55-net\
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\
file=/path/to/disk-image,boot=on
root@localhost:
~#kvm-m512-netnic,macaddr=11:
22:
33:
44:
55:
66-net\
tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown-drive\
file=/path/to/disk-image,boot=on
7.Misc
7.1查表
ovs-vsctllistbridgeovs-br
7.2关于Brdige及Port
创建Brdige
ovs-vsctladd-brovs-br
在ovs-br上添加interface
ovs-vsctladd-portovs-breth0
(1)+
(2)的可以合并为:
ovs−vsctladd−brovs-br--add−portovs-breth0
删除Bridge
ovs-vsctldel-brovs-br#如果不存在,会有errorlog
ovs-vsctl--if-existsdel-brovs-br
更改ofport(openflowportnumber)为100:
ovs-vsctladd-portovs-breth0--setInterfaceeth0ofport_request=100
设置port为internal
ovs-vsctlsetInterfaceeth0type=internal
7.3关于Controller
设置Controller
ovs-vsctlset-controllerovs-brtcp:
1.2.3.4:
6633
设置multicontroller
ovs-vsctlset-controllerovs-brtcp:
1.2.3.4:
6633tcp:
5.6.7.8:
6633
查询Controller
ovs-vsctlshow
如果有成功连到controller则提示is_connected:
true,反之未连上:
ovs-vsctlget-controllerovs-br
移除Controller
ovs-vsctldel-controllerovs-br
7.4关于STP(SpanningTreeProtocol)
开启STP
ovs-vsctlsetbridgeovs-brstp_enable=true
关闭STP
ovs-vsctlsetbridgeovs-brstp_enable=false
查询STP配置信息
ovs-vsctlgetbridgeovs-brstp_enable
设置Priority
ovs−vsctlsetbridgebr0other_config:
stp-priority=0x7800
设置Cost
ovs−vsctlsetporteth0other_config:
stp-path-cost=10
移除STP设置
ovs−vsctlclearbridgeovs-brother_config
7.5关于OpenflowVersion
支持OpenFlowVersion1.3
ovs-vsctlsetbridgeovs-brprotocols=OpenFlow13
支持OpenFlowVersion1.31.2
ovs-vsctlsetbridgeovs-brprotocols=OpenFlow12,OpenFlow13
移除OpenFlow支持设置
ovs-vsctlclearbridgeovs-brprotocols
7.6关于VLAN
设置VLANtag
ovs-vsctladd-portovs-brvlan3tag=3--setinterfacevlan3type=internal
移除VLAN
ovs-vsctldel-portovs-brvlan3
查询VLAN
ovs-vsctlshow
ifconfigvlan3
设置Vlantrunk
ovs-vsctladd-portovs-breth0trunk=3,4,5,6
设置已add的port为accessport,vlanid9
ovs-vsctlsetporteth0tag=9
ovs-ofctladd-flow设置vlan100
ovs-ofctladd-flowovs-brin_port=1,dl_vlan=0xffff,actions=mod_vlan_vid:
100,output:
3
ovs-ofctladd-flowovs-brin_port=1,dl_vlan=0xffff,actions=push_vlan:
0x8100,set_field:
100-\>vlan_vid,output:
3
ovs-ofctladd-flow拿掉vlantag
ovs-ofctladd-flowovs1in_port=3,dl_vlan=100,actions=strip_vlan,output:
1
two_vlanexample
ovs-ofctladd-flowpop-vlan
ovs-ofctladd-flowovs-brin_port=3,dl_vlan=0xffff,actions=pop_vlan,output:
1
7.7关于GRETunnel
设置GREtunnel
ovs−vsctladd−portovs-brovs-gre--setinterfaceovs-gretype=greoptions:
remote_ip=1.2.3.4
查询GRETunnel
ovs-vsctlshow
7.8关于Dumpflows
DumpsOpenFlowflows不含hiddenflows(常用)
ovs-ofctldump-flowsovs-br
DumpsOpenFlowflows包含hiddenflows
ovs-appctlbridge/dump-flowsovs-br
Dump特定bridge的datapathflows不論任何type
ovs-appctldpif/dump-flowsovs-br
Dump在Linuxkernel裡的datapathflowtable(常用)
ovs-dpctldump-flows[dp]
Toplikebehaviorforovs-dpctldump-flows
ovs-dpctl-top
7.9XenServer开启OpenvSwitch方式
检查是否启动openvswitch服务:
serviceopenvswitchstatus
启动服务
xe-switch-network-backendopenvswitch
关闭服务
xe-switch-network-backendbridge
7.10关于Log
查询loglevellist
ovs-appctlvlog/list
设置loglevel(以stp设置file为dbglevel为例)
ovs-appctlvlog/setstp:
file:
dbg
ovs-appctlvlog/set{modulename}:
{console,syslog,file}:
{off,emer,err,warn,info,dbg}
7.11关于Fallback
Controllerconnection:
false的时候,会自动调成legacyswitchmode
ovs-vsctls