Skip to content

Commit 1837a36

Browse files
committed
kvm
1 parent b121828 commit 1837a36

22 files changed

+2431
-0
lines changed

201408/20140801_01.md

Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
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+
![pic1](20140801_01_pic_001.png)
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+

201408/20140801_01_pic_001.png

41.2 KB
Loading

0 commit comments

Comments
 (0)