本文主要參考Overview of functionality and components以及Frequently Asked Questions以及結合自己的理解。
1 什么是OpenvSwitch
OpenvSwitch,簡稱OVS是一個虛擬交換軟件,主要用於虛擬機VM環境,作為一個虛擬交換機,支持Xen/XenServer, KVM, and VirtualBox多種虛擬化技術。
在這種某一台機器的虛擬化的環境中,一個虛擬交換機(vswitch)主要有兩個作用:傳遞虛擬機VM之間的流量,以及實現VM和外界網絡的通信。
整個OVS代碼用C寫的。目前有以下功能:
- Standard 802.1Q VLAN model with trunk and access ports
- NIC bonding with or without LACP on upstream switch
- NetFlow, sFlow(R), and mirroring for increased visibility
- QoS (Quality of Service) configuration, plus policing
- GRE, GRE over IPSEC, VXLAN, and LISP tunneling
- 802.1ag connectivity fault management
- OpenFlow 1.0 plus numerous extensions
- Transactional configuration database with C and Python bindings
- High-performance forwarding using a Linux kernel module
2 OpenvSwitch的組成
- ovs-vswitchd:守護程序,實現交換功能,和Linux內核兼容模塊一起,實現基於流的交換flow-based switching。
- ovsdb-server:輕量級的數據庫服務,主要保存了整個OVS的配置信息,包括接口啊,交換內容,VLAN啊等等。ovs-vswitchd會根據數據庫中的配置信息工作。
- ovs-dpctl:一個工具,用來配置交換機內核模塊,可以控制轉發規則。
- ovs-vsctl:主要是獲取或者更改ovs-vswitchd的配置信息,此工具操作的時候會更新ovsdb-server中的數據庫。
- ovs-appctl:主要是向OVS守護進程發送命令的,一般用不上。
- ovsdbmonitor:GUI工具來顯示ovsdb-server中數據信息。
- ovs-controller:一個簡單的OpenFlow控制器
- ovs-ofctl:用來控制OVS作為OpenFlow交換機工作時候的流表內容。
3 OpenvSwitch和其他vswitch
這里其他的vswitch,包括VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V。
VMware vNetwork distributed switch以及思科的Cisco Nexus 1000V這種虛擬交換機提供的是一個集中式的控制方式,。而OVS則是一個獨立的vswitch,他運行在每個實現虛擬化的物理機器上,並提供遠程管理。OVS提供了兩種在虛擬化環境中遠程管理的協議:一個是OpenFlow,通過流表來管理交換機的行為,一個是OVSDB management protocol,用來暴露sietch的port狀態。
(二)-概念及工作流程1
1 vswitch、Bridge、Datapath
在網絡中,交換機和橋都是同一個概念,OVS實現了一個虛擬機的以太交換機,換句話說,OVS也就是實現了一個以太橋。那么,在OVS中,給一個交換機,或者說一個橋,用了一個專業的名詞,叫做DataPath!
要了解,OVS如何工作,首先需要知道橋的概念。
網橋也叫做橋接器,連接兩個局域網的設備,網橋工作在數據鏈路層,將兩個LAN連接,根據MAC地址來轉發幀,可以看成一個“低層的路由器”(路由器工作在網絡層,根據IP地質進行轉發)。
1.1 網橋的工作原理
網橋處理包遵循以下幾條規則:
- 在一個接口上接收到的包不會再往那個接口上發送此包。
- 每個接收到的包都要學習其源MAC地址。
- 如果數據包是多播或者廣播包(通過2層MAC地址確定)則要向接收端口以外的所有端口轉發,如果上層協議感興趣,則還會遞交上層處理。
- 如果數據包的地址不能再CAM表中找到,則向接收端口以外的其他端口轉發。
- 如果CAM表中能找到,則轉發給相應端口,如果發送和接收都是統一端口,則不發送。
注意,網橋是以混雜模式工作
的。關於網橋更多,請查閱相關資料。
2 OVS中的bridge
上面,說到,一個橋就是一個交換機。在OVS中,
ovs-vsctl add-br brname(br-int) root@Compute2:~# ifconfig br-intLink encap:EthernetHWaddr1a:09:56:ea:0b:49 inet6 addr: fe80::1809:56ff:feea:b49/64Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500Metric:1 RX packets:1584 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:316502(316.5 KB) TX bytes:468(468.0 B)
當我們創建了一個交換機(網橋)以后,此時網絡功能不受影響,但是會產生一個虛擬網卡,名字就是brname,之所以會產生一個虛擬網卡,是為了實現接下來的網橋(交換機)功能。有了這個交換機以后,我還需要為這個交換機增加端口(port),一個端口,就是一個物理網卡,當網卡加入到這個交換機之后,其工作方式就和普通交換機的一個端口的工作方式類似了。
ovs-vsctl add-port brname port
這里要特別注意,網卡加入網橋以后,要按照網橋的工作標准工作,那么加入的一個端口就必須是以混雜模式工作,工作在鏈路層,處理2層的幀,所以這個port就不需要配置IP了。(你沒見過哪個交換的端口有IP的吧)
那么接下來你可能會問,通常的交換機不都是有一個管理接口,可以telnet到交換機上進行配置吧,那么在OVS中創建的虛擬交換機有木有這種呢,有的!上面既然創建交換機brname的時候產生了一個虛擬網口brname,那么,你給這個虛擬網卡配置了IP以后,就相當於給交換機的管理接口配置了IP,此時一個正常的虛擬交換機就搞定了。
ip address add 192.168.1.1/24 dev brname
最后,我們來看看一個br的具體信息:
root@Compute2:~# ovs-vsctl show bc12c8d2-6900-42dd-9c1c-30e8ecb99a1bBridge"br0"Port"eth0"Interface"eth0"Port"br0"Interface"br0" type:internal ovs_version:"1.4.0+build0"
首先,這里顯示了一個名為br0的橋(交換機),這個交換機有兩個接口,一個是eth0,一個是br0,上面說到,創建橋的時候會創建一個和橋名字一樣的接口,並自動作為該橋的一個端口,那么這個虛擬接口的作用,一方面是可以作為交換機的管理端口,另一方面也是基於這個虛擬接口,實現了橋的功能。
OpenvSwitch完全使用手冊(二)-概念及工作流程2
這一部分我以一個簡單的例子,說明在虛擬化環境中OpenvSwitch的典型工作流程。
前面已經說到,OVS主要是用來在虛擬化環境中。虛擬機之間一個虛擬機和外網之間的通信所用,如下是一個典型的結構圖:
那么,通常情況下的工作流程如下:
- 1 VM實例instance產生一個數據包並發送至實例內的虛擬網絡接口VNIC,圖中就是instance中的eth0.
- 2 這個數據包會傳送到物理節點上的VNIC接口,如圖就是vnet接口。
- 3 數據包從vnet NIC出來,到達橋(虛擬交換機)br100上.
- 4 數據包經過交換機的處理,從物理節點上的物理接口發出,如圖中物理節點上的eth0.
- 5 數據包從eth0出去的時候,是按照物理節點上的路由以及默認網關操作的,這個時候該數據包其實已經不受你的控制了。