|
| 1 | +## OpenvSwitch readme & faq |
| 2 | + |
| 3 | +### 作者 |
| 4 | +digoal |
| 5 | + |
| 6 | +### 日期 |
| 7 | +2014-08-01 |
| 8 | + |
| 9 | +### 标签 |
| 10 | +OpenvSwitch , OVS , bridge , VLAN , VM , 虚拟化 , 虚拟网桥 |
| 11 | + |
| 12 | +---- |
| 13 | + |
| 14 | +## 背景 |
| 15 | +本文为转载文章,主要讲解的是虚拟交换机产品OpenVSwitch 简称OVS的原理,OVS在虚拟化技术中非常有用。 |
| 16 | + |
| 17 | +如果不使用OVS,通常还可以使用bridge与net namespace以及流控的工具来达到类似的效果。 |
| 18 | + |
| 19 | +http://blog.csdn.net/majieyue/article/details/7888400 |
| 20 | + |
| 21 | +## 什么是OpenvSwitch |
| 22 | +OpenvSwitch,简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。 |
| 23 | + |
| 24 | +在这种某一台机器的虚拟化的环境中,一个虚拟交换机(vswitch)主要有两个作用: |
| 25 | + |
| 26 | +传递虚拟机VM之间的流量,以及实现VM和外界网络的通信。 |
| 27 | + |
| 28 | +整个OVS代码用C写的。目前有以下功能: |
| 29 | +``` |
| 30 | +Standard 802.1Q VLAN model with trunk and access ports |
| 31 | + |
| 32 | +NIC bonding with or without LACP on upstream switch |
| 33 | + |
| 34 | +NetFlow, sFlow(R), and mirroring for increased visibility |
| 35 | + |
| 36 | +QoS (Quality of Service) configuration, plus policing |
| 37 | + |
| 38 | +GRE, GRE over IPSEC, VXLAN, and LISP tunneling |
| 39 | + |
| 40 | +802.1ag connectivity fault management |
| 41 | + |
| 42 | +OpenFlow 1.0 plus numerous extensions |
| 43 | + |
| 44 | +Transactional configuration database with C and Python bindings |
| 45 | + |
| 46 | +High-performance forwarding using a Linux kernel module |
| 47 | +``` |
| 48 | + |
| 49 | +## OpenvSwitch的组成 |
| 50 | +ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-based switching。 |
| 51 | + |
| 52 | +ovsdb-server:轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口啊,交换内容,VLAN啊等等。ovs-vswitchd会根据数据库中的配置信息工作。 |
| 53 | + |
| 54 | +ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则。 |
| 55 | + |
| 56 | +ovs-vsctl:主要是获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server中的数据库。 |
| 57 | + |
| 58 | +ovs-appctl:主要是向OVS守护进程发送命令的,一般用不上。 |
| 59 | + |
| 60 | +ovsdbmonitor:GUI工具来显示ovsdb-server中数据信息。 |
| 61 | + |
| 62 | +ovs-controller:一个简单的OpenFlow控制器。 |
| 63 | + |
| 64 | +ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时候的流表内容。 |
| 65 | + |
| 66 | +## OpenvSwitch和其他vswitch |
| 67 | +这里指的其他的vswitch,包括VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V。 |
| 68 | + |
| 69 | +VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V这种虚拟交换机提供的是一个集中式的控制方式。 |
| 70 | + |
| 71 | +而OVS则是一个独立的vswitch,他运行在每个实现虚拟化的物理机器上,并提供远程管理。 |
| 72 | + |
| 73 | +OVS提供了两种在虚拟化环境中远程管理的协议: |
| 74 | + |
| 75 | +一个是OpenFlow,通过流表来管理交换机的行为,一个是OVSDB management protocol,用来暴露sietch的port状态。 |
| 76 | + |
| 77 | +## 概念及工作流程 1 |
| 78 | +1\. vswitch、Bridge、Datapath |
| 79 | + |
| 80 | +在网络中,交换机和桥都是同一个概念,OVS实现了一个虚拟机的以太交换机,换句话说,OVS也就是实现了一个以太桥。 |
| 81 | + |
| 82 | +那么,在OVS中,给一个交换机,或者说一个桥,用了一个专业的名词,叫做DataPath! |
| 83 | + |
| 84 | +要了解,OVS如何工作,首先需要知道桥的概念。 |
| 85 | + |
| 86 | +网桥也叫做桥接器,连接两个局域网的设备,网桥工作在数据链路层,将两个LAN连接,根据MAC地址来转发帧,可以看成一个“低层的路由器”(路由器工作在网络层,根据IP地质进行转发)。 |
| 87 | + |
| 88 | +1\.1 网桥的工作原理 |
| 89 | + |
| 90 | +网桥处理包遵循以下几条规则: |
| 91 | + |
| 92 | +在一个接口上接收到的包不会再往那个接口上发送此包。 |
| 93 | + |
| 94 | +每个接收到的包都要学习其源MAC地址。 |
| 95 | + |
| 96 | +如果数据包是多播或者广播包(通过2层MAC地址确定)则要向接收端口以外的所有端口转发,如果上层协议感兴趣,则还会递交上层处理。 |
| 97 | + |
| 98 | +如果数据包的地址不能再CAM表中找到,则向接收端口以外的其他端口转发。 |
| 99 | + |
| 100 | +如果CAM表中能找到,则转发给相应端口,如果发送和接收都是统一端口,则不发送。 |
| 101 | + |
| 102 | +注意,网桥是以混杂模式工作的。关于网桥更多,请查阅相关资料。 |
| 103 | + |
| 104 | +2\. OVS中的bridge |
| 105 | + |
| 106 | +上面,说到,一个桥就是一个交换机。在OVS中添加桥(交换机), |
| 107 | + |
| 108 | +``` |
| 109 | +ovs-vsctl add-br brname(br-int) |
| 110 | + |
| 111 | +root@Compute2:~# ifconfig |
| 112 | + br-int Link encap:EthernetHWaddr1a:09:56:ea:0b:49 |
| 113 | + inet6 addr: fe80::1809:56ff:feea:b49/64Scope:Link |
| 114 | + UP BROADCAST RUNNING MULTICAST MTU:1500Metric:1 |
| 115 | + RX packets:1584 errors:0 dropped:0 overruns:0 frame:0 |
| 116 | + TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 |
| 117 | + collisions:0 txqueuelen:0 |
| 118 | + RX bytes:316502(316.5 KB) TX bytes:468(468.0 B) |
| 119 | +``` |
| 120 | + |
| 121 | +当我们创建了一个交换机(网桥)以后,此时网络功能不受影响,但是会产生一个虚拟网卡,名字就是brname,之所以会产生一个虚拟网卡,是为了实现接下来的网桥(交换机)功能。 |
| 122 | + |
| 123 | +有了这个交换机以后,我还需要为这个交换机增加端口(port),一个端口,就是一个物理网卡,当网卡加入到这个交换机之后,其工作方式就和普通交换机的一个端口的工作方式类似了。 |
| 124 | + |
| 125 | +``` |
| 126 | +ovs-vsctl add-port brname port |
| 127 | +``` |
| 128 | + |
| 129 | +这里要特别注意,网卡加入网桥以后,要按照网桥的工作标准工作,那么加入的一个端口就必须是以混杂模式工作,工作在链路层,处理2层的帧,所以这个port就不需要配置IP了。(你没见过哪个交换的端口有IP的吧) |
| 130 | + |
| 131 | +注意这个port是实际存在的port, 也就是ifconfig -a或ip link能看到的端口 , 例如 : |
| 132 | + |
| 133 | +``` |
| 134 | +[root@db-172-16-3-150 ~]# ifconfig -a |
| 135 | +bond0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 |
| 136 | + BROADCAST MASTER MULTICAST MTU:1500 Metric:1 |
| 137 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 138 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 139 | + collisions:0 txqueuelen:0 |
| 140 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 141 | + |
| 142 | +bond1 Link encap:Ethernet HWaddr 00:00:00:00:00:00 |
| 143 | + BROADCAST MASTER MULTICAST MTU:1500 Metric:1 |
| 144 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 145 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 146 | + collisions:0 txqueuelen:0 |
| 147 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 148 | + |
| 149 | +bond2 Link encap:Ethernet HWaddr 00:00:00:00:00:00 |
| 150 | + BROADCAST MASTER MULTICAST MTU:1500 Metric:1 |
| 151 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 152 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 153 | + collisions:0 txqueuelen:0 |
| 154 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 155 | + |
| 156 | +bond3 Link encap:Ethernet HWaddr 00:00:00:00:00:00 |
| 157 | + BROADCAST MASTER MULTICAST MTU:1500 Metric:1 |
| 158 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 159 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 160 | + collisions:0 txqueuelen:0 |
| 161 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 162 | + |
| 163 | +bond4 Link encap:Ethernet HWaddr 00:00:00:00:00:00 |
| 164 | + BROADCAST MASTER MULTICAST MTU:1500 Metric:1 |
| 165 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 166 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 167 | + collisions:0 txqueuelen:0 |
| 168 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 169 | + |
| 170 | +br0 Link encap:Ethernet HWaddr 00:22:19:60:77:8F |
| 171 | + inet addr:172.16.3.150 Bcast:172.16.3.255 Mask:255.255.255.0 |
| 172 | + inet6 addr: fe80::222:19ff:fe60:778f/64 Scope:Link |
| 173 | + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 |
| 174 | + RX packets:45547 errors:0 dropped:0 overruns:0 frame:0 |
| 175 | + TX packets:31036 errors:0 dropped:0 overruns:0 carrier:0 |
| 176 | + collisions:0 txqueuelen:0 |
| 177 | + RX bytes:7848640 (7.4 MiB) TX bytes:3286303 (3.1 MiB) |
| 178 | + |
| 179 | +em1 Link encap:Ethernet HWaddr 00:22:19:60:77:8F |
| 180 | + inet6 addr: fe80::222:19ff:fe60:778f/64 Scope:Link |
| 181 | + UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 |
| 182 | + RX packets:28583 errors:0 dropped:0 overruns:0 frame:0 |
| 183 | + TX packets:20748 errors:0 dropped:0 overruns:0 carrier:0 |
| 184 | + collisions:0 txqueuelen:1000 |
| 185 | + RX bytes:5273472 (5.0 MiB) TX bytes:2133925 (2.0 MiB) |
| 186 | + |
| 187 | +em2 Link encap:Ethernet HWaddr 00:22:19:60:77:91 |
| 188 | + BROADCAST MULTICAST MTU:1500 Metric:1 |
| 189 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 190 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 191 | + collisions:0 txqueuelen:1000 |
| 192 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 193 | + |
| 194 | +em3 Link encap:Ethernet HWaddr 00:22:19:60:77:93 |
| 195 | + BROADCAST MULTICAST MTU:1500 Metric:1 |
| 196 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 197 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 198 | + collisions:0 txqueuelen:1000 |
| 199 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 200 | + |
| 201 | +em4 Link encap:Ethernet HWaddr 00:22:19:60:77:95 |
| 202 | + BROADCAST MULTICAST MTU:1500 Metric:1 |
| 203 | + RX packets:0 errors:0 dropped:0 overruns:0 frame:0 |
| 204 | + TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 |
| 205 | + collisions:0 txqueuelen:1000 |
| 206 | + RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) |
| 207 | + |
| 208 | +lo Link encap:Local Loopback |
| 209 | + inet addr:127.0.0.1 Mask:255.0.0.0 |
| 210 | + inet6 addr: ::1/128 Scope:Host |
| 211 | + UP LOOPBACK RUNNING MTU:16436 Metric:1 |
| 212 | + RX packets:14685 errors:0 dropped:0 overruns:0 frame:0 |
| 213 | + TX packets:14685 errors:0 dropped:0 overruns:0 carrier:0 |
| 214 | + collisions:0 txqueuelen:0 |
| 215 | + RX bytes:3881472 (3.7 MiB) TX bytes:3881472 (3.7 MiB) |
| 216 | + |
| 217 | +[root@db-172-16-3-150 ~]# ip link |
| 218 | +1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN |
| 219 | + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 |
| 220 | +2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 |
| 221 | + link/ether 00:22:19:60:77:8f brd ff:ff:ff:ff:ff:ff |
| 222 | +3: em2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 |
| 223 | + link/ether 00:22:19:60:77:91 brd ff:ff:ff:ff:ff:ff |
| 224 | +4: em3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 |
| 225 | + link/ether 00:22:19:60:77:93 brd ff:ff:ff:ff:ff:ff |
| 226 | +5: em4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 |
| 227 | + link/ether 00:22:19:60:77:95 brd ff:ff:ff:ff:ff:ff |
| 228 | +9: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN |
| 229 | + link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
| 230 | +10: bond4: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN |
| 231 | + link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
| 232 | +11: bond1: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN |
| 233 | + link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
| 234 | +12: bond2: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN |
| 235 | + link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
| 236 | +13: bond3: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN |
| 237 | + link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff |
| 238 | +15: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN |
| 239 | + link/ether 00:22:19:60:77:8f brd ff:ff:ff:ff:ff:ff |
| 240 | +``` |
| 241 | + |
| 242 | +以上是实际存在的, 当使用KVM虚拟机时, 指定bridge后, 会自动帮你创建虚拟口, 这些虚拟口也可以被ovs控制, 例如打TAG. 建立VLAN. |
| 243 | + |
| 244 | +那么接下来你可能会问,通常的交换机不都是有一个管理接口,可以telnet到交换机上进行配置吧,那么在OVS中创建的虚拟交换机有木有这种呢,有的!上面既然创建交换机brname的时候产生了一个虚拟网口brname, |
| 245 | + |
| 246 | +那么,你给这个虚拟网卡配置了IP以后,就相当于给交换机的管理接口配置了IP,此时一个正常的虚拟交换机就搞定了。 |
| 247 | + |
| 248 | +``` |
| 249 | +ip address add 192.168.1.1/24 dev brname |
| 250 | +``` |
| 251 | + |
| 252 | +最后,我们来看看一个br的具体信息: |
| 253 | + |
| 254 | +``` |
| 255 | +[root@db-172-16-3-150 ~]# ovs-vsctl show |
| 256 | +d267062e-d7ed-45e1-9de7-71d058127c1b |
| 257 | + Bridge "br0" |
| 258 | + Port "em1" |
| 259 | + Interface "em1" |
| 260 | + Port "br0" |
| 261 | + Interface "br0" |
| 262 | + type: internal |
| 263 | + ovs_version: "1.9.3" |
| 264 | +``` |
| 265 | + |
| 266 | +首先,这里显示了一个名为br0的桥(交换机),这个交换机有两个接口, 一个是em1,一个是br0 (type: internal), |
| 267 | + |
| 268 | +上面说到,创建桥的时候会创建一个和桥名字一样的接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口,实现了桥的功能。 |
| 269 | + |
| 270 | +## 概念及工作流程 2 |
| 271 | + |
| 272 | +这一部分我以一个简单的例子,说明在虚拟化环境中OpenvSwitch的典型工作流程。 |
| 273 | + |
| 274 | +前面已经说到,OVS主要是用来在虚拟化环境中。虚拟机之间一个虚拟机和外网之间的通信所用,如下是一个典型的结构图: |
| 275 | + |
| 276 | +那么,通常情况下的工作流程如下: |
| 277 | + |
| 278 | + |
| 279 | + |
| 280 | +(instance指虚拟机.) |
| 281 | + |
| 282 | +1\. VM实例instance产生一个数据包并发送至实例内的虚拟网络接口VNIC,图中就是instance中的eth0. |
| 283 | + |
| 284 | +2\. 这个数据包会传送到物理节点上的VNIC接口,如图就是vnet1接口。 |
| 285 | + |
| 286 | +3\. 数据包从vnet NIC出来,到达桥(虚拟交换机)br100上. |
| 287 | + |
| 288 | +4\. 数据包经过交换机的处理,从物理节点上的物理接口发出,如图中物理节点上的eth0. |
| 289 | + |
| 290 | +5\. 数据包从eth0出去的时候,是按照物理节点上的路由以及默认网关操作的,这个时候该数据包其实已经不受你的控制了。 |
| 291 | + |
| 292 | +一般L2 switch连接eth0的这个口是一个trunk口, 因为虚拟机对应的VNET往往会设置VLAN TAG, 可以通过对虚拟机对应的vnet打VALN TAG来控制虚拟机的网络广播域. |
| 293 | + |
| 294 | +如果跑多个虚拟机的话, 多个虚拟机对应的vnet可以设置不同的vlan tag, 那么这些虚拟机的包从eth0(4)出去的时候, 会带上TAG标记. 这样也就必须是trunk口才行. |
| 295 | + |
| 296 | +## 参考 |
| 297 | +1\. http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob_plain;f=FAQ;hb=HEAD |
| 298 | +2\. http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=openvswitch;a=blob_plain;f=README;hb=HEAD |
| 299 | +3\. http://openvswitch.org/support/config-cookbooks/vlan-configuration-cookbook/ |
| 300 | + |
| 301 | + |
| 302 | +[Count](http://info.flagcounter.com/h9V1) |
| 303 | + |
| 304 | + |
0 commit comments