Open vSwitch介紹
在過去,數(shù)據(jù)中心的服務(wù)器是直接連在硬件交換機(jī)上,后來VMware實(shí)現(xiàn)了服務(wù)器虛擬化技術(shù),使虛擬服務(wù)器(VMs)能夠連接在虛擬交換機(jī)上,借助這個虛擬交換機(jī),可以為服務(wù)器上運(yùn)行的VMs或容器提供邏輯的虛擬的以太網(wǎng)接口,這些邏輯接口都連接到虛擬交換機(jī)上,有三種比較流行的虛擬交換機(jī): VMware virtual switch, Cisco Nexus 1000V,和Open vSwitch
Open vSwitch(OVS)是運(yùn)行在虛擬化平臺上的虛擬交換機(jī),其支持OpenFlow協(xié)議,也支持gre/vxlan/IPsec等隧道技術(shù)。在OVS之前,基于Linux的虛擬化平臺比如KVM或Xen上,缺少一個功能豐富的虛擬交換機(jī),因此OVS迅速崛起并開始在Xen/KVM中流行起來,并且應(yīng)用于越來越多的開源項(xiàng)目,比如openstack neutron中的網(wǎng)絡(luò)解決方案
在虛擬交換機(jī)的Flow控制器或管理工具方面,一些商業(yè)產(chǎn)品都集成有控制器或管理工具,比如Cisco 1000V的Virtual Supervisor Manager(VSM),VMware的分布式交換機(jī)中的vCenter。而OVS則需要借助第三方控制器或管理工具實(shí)現(xiàn)復(fù)雜的轉(zhuǎn)發(fā)策略。例如OVS支持OpenFlow 協(xié)議,我們就可以使用任何支持OpenFlow協(xié)議的控制器來對OVS進(jìn)行遠(yuǎn)程管理。OpenStack Neutron中的ML2插件也能夠?qū)崿F(xiàn)對OVS的管理。但這并不意味著OVS必須要有一個控制器才能工作。在不連接外部控制器情況下,OVS自身可以依靠MAC地址學(xué)習(xí)實(shí)現(xiàn)二層數(shù)據(jù)包轉(zhuǎn)發(fā)功能,就像Linux Bridge
在基于Linux內(nèi)核的系統(tǒng)上,應(yīng)用最廣泛的還是系統(tǒng)自帶的虛擬交換機(jī)Linux Bridge,它是一個單純的基于MAC地址學(xué)習(xí)的二層交換機(jī),簡單高效,但同時缺乏一些高級特性,比如OpenFlow,VLAN tag,QOS,ACL,Flow等,而且在隧道協(xié)議支持上,Linux Bridge只支持vxlan,OVS支持gre/vxlan/IPsec等,這也決定了OVS更適用于實(shí)現(xiàn)SDN技術(shù)
OVS支持以下features
- 支持NetFlow, IPFIX, sFlow, SPAN/RSPAN等流量監(jiān)控協(xié)議
- 精細(xì)的ACL和QoS策略
- 可以使用OpenFlow和OVSDB協(xié)議進(jìn)行集中控制
- Port bonding,LACP,tunneling(vxlan/gre/Ipsec)
- 適用于Xen,KVM,VirtualBox等hypervisors
- 支持標(biāo)準(zhǔn)的802.1Q VLAN協(xié)議
- 基于VM interface的流量管理策略
- 支持組播功能
- flow-caching engine(datapath模塊)
文章使用環(huán)境
centos7
openvswitch 2.5
OpenFlow 1.4
OVS架構(gòu)
先看下OVS整體架構(gòu),用戶空間主要組件有數(shù)據(jù)庫服務(wù)ovsdb-server和守護(hù)進(jìn)程ovs-vswitchd。kernel中是datapath內(nèi)核模塊。最上面的Controller表示OpenFlow控制器,控制器與OVS是通過OpenFlow協(xié)議進(jìn)行連接,控制器不一定位于OVS主機(jī)上,下面分別介紹圖中各組件

ovs-vswitchd
ovs-vswitchd守護(hù)進(jìn)程是OVS的核心部件,它和datapath內(nèi)核模塊一起實(shí)現(xiàn)OVS基于流的數(shù)據(jù)交換。作為核心組件,它使用openflow協(xié)議與上層OpenFlow控制器通信,使用OVSDB協(xié)議與ovsdb-server通信,使用netlink和datapath內(nèi)核模塊通信。ovs-vswitchd在啟動時會讀取ovsdb-server中配置信息,然后配置內(nèi)核中的datapaths和所有OVS switches,當(dāng)ovsdb中的配置信息改變時(例如使用ovs-vsctl工具),ovs-vswitchd也會自動更新其配置以保持與數(shù)據(jù)庫同步
# ps -ef |grep ovs-vs
root 22176 22175 0 Jan17 ? 00:16:56 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
ovs-vswitchd需要加載datapath內(nèi)核模塊才能正常運(yùn)行。它會自動配置datapath flows,因此我們不必再使用ovs-dpctl去手動操作datapath,但ovs-dpctl仍可用于調(diào)試場合
在OVS中,ovs-vswitchd從OpenFlow控制器獲取流表規(guī)則,然后把從datapath中收到的數(shù)據(jù)包在流表中進(jìn)行匹配,找到匹配的flows并把所需應(yīng)用的actions返回給datapath,同時作為處理的一部分,ovs-vswitchd會在datapath中設(shè)置一條datapath flows用于后續(xù)相同類型的數(shù)據(jù)包可以直接在內(nèi)核中執(zhí)行動作,此datapath flows相當(dāng)于OpenFlow flows的緩存。對于datapath來說,其并不知道用戶空間OpenFlow的存在,datapath內(nèi)核模塊信息如下
# modinfo openvswitch
filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/net/openvswitch/openvswitch.ko
license: GPL
description: Open vSwitch switching datapath
rhelversion: 7.2
srcversion: F75F2B83324DCC665887FD5
depends: libcrc32c
intree: Y
...
ovsdb-server
ovsdb-server是OVS輕量級的數(shù)據(jù)庫服務(wù),用于整個OVS的配置信息,包括接口/交換內(nèi)容/VLAN等,OVS主進(jìn)程ovs-vswitchd根據(jù)數(shù)據(jù)庫中的配置信息工作,下面是ovsdb-server進(jìn)程詳細(xì)信息
ps -ef |grep ovsdb-server
root 22166 22165 0 Jan17 ? 00:02:32 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach --monitor
/etc/openvswitch/conf.db是數(shù)據(jù)庫文件存放位置,文件形式存儲保證了服務(wù)器重啟不會影響其配置信息,ovsdb-server需要文件才能啟動,可以使用ovsdb-tool create命令創(chuàng)建并初始化此數(shù)據(jù)庫文件
--remote=punix:/var/run/openvswitch/db.sock 實(shí)現(xiàn)了一個Unix sockets連接,OVS主進(jìn)程ovs-vswitchd或其它命令工具(ovsdb-client)通過此socket連接管理ovsdb
/var/log/openvswitch/ovsdb-server.log是日志記錄
OpenFlow
OpenFlow是開源的用于管理交換機(jī)流表的協(xié)議,OpenFlow在OVS中的地位可以參考上面架構(gòu)圖,它是Controller和ovs-vswitched間的通信協(xié)議。需要注意的是,OpenFlow是一個獨(dú)立的完整的流表協(xié)議,不依賴于OVS,OVS只是支持OpenFlow協(xié)議,有了支持,我們可以使用OpenFlow控制器來管理OVS中的流表,OpenFlow不僅僅支持虛擬交換機(jī),某些硬件交換機(jī)也支持OpenFlow協(xié)議
OVS常用作SDN交換機(jī)(OpenFlow交換機(jī)),其中控制數(shù)據(jù)轉(zhuǎn)發(fā)策略的就是OpenFlow flow。OpenStack Neutron中實(shí)現(xiàn)了一個OpenFlow控制器用于向OVS下發(fā)OpenFlow flows控制虛擬機(jī)間的訪問或隔離。本文討論的默認(rèn)是作為SDN交換機(jī)場景下
OpenFlow flow的流表項(xiàng)存放于用戶空間主進(jìn)程ovs-vswitchd中,OVS除了連接OpenFlow控制器獲取這種flow,文章后面會提到的命令行工具ovs-ofctl工具也可以手動管理OVS中的OpenFlow flow,可以查看man ovs-ofctl了解
在OVS中,OpenFlow flow是最重要的一種flow, 然而還有其它幾種flows存在,文章下面OVS概念部分會提到
Controller
Controller指OpenFlow控制器。OpenFlow控制器可以通過OpenFlow協(xié)議連接到任何支持OpenFlow的交換機(jī),比如OVS??刂破魍ㄟ^向交換機(jī)下發(fā)流表規(guī)則來控制數(shù)據(jù)流向。除了可以通過OpenFlow控制器配置OVS中flows,也可以使用OVS提供的ovs-ofctl命令通過OpenFlow協(xié)議去連接OVS,從而配置flows,命令也能夠?qū)VS的運(yùn)行狀況進(jìn)行動態(tài)監(jiān)控。
Kernel Datapath
下面討論場景是OVS作為一個OpenFlow交換機(jī)
datapath是一個Linux內(nèi)核模塊,它負(fù)責(zé)執(zhí)行數(shù)據(jù)交換。關(guān)于datapath,The Design and Implementation of Open vSwitch中有描述
<small>The datapath module in the kernel receives the packets first, from a physical NIC or a VM’s virtual NIC. Either ovs-vswitchd has instructed the datapath how to handle packets of this type, or it has not. In the former case, the datapath module simply follows the instructions, called actions, given by ovs-vswitchd, which list physical ports or tunnels on which to transmit the packet. Actions may also specify packet modifications, packet sampling, or instructions to drop the packet. In the other case, where the datapath has not been told what to do with the packet, it delivers it to ovs-vswitchd. In userspace, ovs-vswitchd determines how the packet should be handled, then it passes the packet back to the datapath with the desired handling. Usually, ovs-vswitchd also tells the datapath to cache the actions, for handling similar future packets.</small>
為了說明datapath,來看一張更詳細(xì)的架構(gòu)圖,圖中的大部分組件上面都有提到

用戶空間ovs-vswitchd和內(nèi)核模塊datapath決定了數(shù)據(jù)包的轉(zhuǎn)發(fā),首先,datapath內(nèi)核模塊收到進(jìn)入數(shù)據(jù)包(物理網(wǎng)卡或虛擬網(wǎng)卡),然后查找其緩存(datapath flows),當(dāng)有一個匹配的flow時它執(zhí)行對應(yīng)的操作,否則datapath會把該數(shù)據(jù)包送入用戶空間由ovs-vswitchd負(fù)責(zé)在其OpenFlow flows中查詢(圖1中的First Packet),ovs-vswitchd查詢后把匹配的actions返回給datapath并設(shè)置一條datapath flows到datapath中,這樣后續(xù)進(jìn)入的同類型的數(shù)據(jù)包(圖1中的Subsequent Packets)因?yàn)榫彺嫫ヅ鋾?code>datapath直接處理,不用再次進(jìn)入用戶空間。
datapath專注于數(shù)據(jù)交換,它不需要知道OpenFlow的存在。與OpenFlow打交道的是ovs-vswitchd,ovs-vswitchd存儲所有Flow規(guī)則供datapath查詢或緩存.
雖然有ovs-dpctl管理工具的存在,但我們沒必要去手動管理datapath,這是用戶空間ovs-vswitchd的工作
OVS概念
這部分說下OVS中的重要概念,使用OpenStack neutron+vxlan部署模式下網(wǎng)絡(luò)節(jié)點(diǎn)OVS網(wǎng)橋作為例子
# ovs-vsctl show
e44abab7-2f65-4efd-ab52-36e92d9f0200
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-ext
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
Port br-ext
Interface br-ext
type: internal
Port "eth1"
Interface "eth1"
Port phy-br-ext
Interface phy-br-ext
type: patch
options: {peer=int-br-ext}
Bridge br-tun
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
Port br-tun
Interface br-tun
type: internal
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port "vxlan-080058ca"
Interface "vxlan-080058ca"
type: vxlan
options: {df_default="true", in_key=flow, local_ip="8.0.88.201", out_key=flow, remote_ip="8.0.88.202"}
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
Port "qr-11591618-c4"
tag: 3
Interface "qr-11591618-c4"
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port int-br-ext
Interface int-br-ext
type: patch
options: {peer=phy-br-ext}
Bridge
Bridge代表一個以太網(wǎng)交換機(jī)(Switch),一個主機(jī)中可以創(chuàng)建一個或者多個Bridge。Bridge的功能是根據(jù)一定規(guī)則,把從端口收到的數(shù)據(jù)包轉(zhuǎn)發(fā)到另一個或多個端口,上面例子中有三個Bridge,br-tun,br-int,br-ext
添加一個網(wǎng)橋br0
ovs-vsctl add-br br0
Port
端口Port與物理交換機(jī)的端口概念類似,Port是OVS Bridge上創(chuàng)建的一個虛擬端口,每個Port都隸屬于一個Bridge。Port有以下幾種類型
- Normal
可以把操作系統(tǒng)中已有的網(wǎng)卡(物理網(wǎng)卡em1/eth0,或虛擬機(jī)的虛擬網(wǎng)卡tapxxx)掛載到ovs上,ovs會生成一個同名Port處理這塊網(wǎng)卡進(jìn)出的數(shù)據(jù)包。此時端口類型為Normal。
如下,主機(jī)中有一塊物理網(wǎng)卡eth1,把其掛載到OVS網(wǎng)橋br-ext上,OVS會自動創(chuàng)建同名Port eth1。
ovs-vsctl add-port br-ext eth1
#Bridge br-ext中出現(xiàn)Port "eth1"
有一點(diǎn)要注意的是,掛載到OVS上的網(wǎng)卡設(shè)備不支持分配IP地址,因此若之前eth1配置有IP地址,掛載到OVS之后IP地址將不可訪問。這里的網(wǎng)卡設(shè)備不只包括物理網(wǎng)卡,也包括主機(jī)上創(chuàng)建的虛擬網(wǎng)卡
- Internal
Internal類型是OVS內(nèi)部創(chuàng)建的虛擬網(wǎng)卡接口,每創(chuàng)建一個Port,OVS會自動創(chuàng)建一個同名接口(Interface)掛載到新創(chuàng)建的Port上。接口的概念下面會提到。
下面創(chuàng)建一個網(wǎng)橋br0,并創(chuàng)建一個Internal類型的Port p0
ovs-vsctl add-br br0
ovs-vsctl add-port br0 p0 -- set Interface p0 type=internal
#查看網(wǎng)橋br0
ovs-vsctl show br0
Bridge "br0"
fail_mode: secure
Port "p0"
Interface "p0"
type: internal
Port "br0"
Interface "br0"
type: internal
可以看到有兩個Port。當(dāng)ovs創(chuàng)建一個新網(wǎng)橋時,默認(rèn)會創(chuàng)建一個與網(wǎng)橋同名的Internal Port。在OVS中,只有”internal”類型的設(shè)備才支持配置IP地址信息,因此我們可以為br0接口配置一個IP地址,當(dāng)然p0也可以配置IP地址
ip addr add 192.168.10.11/24 dev br0
ip link set br0 up
#添加默認(rèn)路由
ip route add default via 192.168.10.1 dev br0
上面兩種Port類型區(qū)別在于,Internal類型會自動創(chuàng)建接口(Interface),而Normal類型是把主機(jī)中已有的網(wǎng)卡接口添加到OVS中
- Patch
當(dāng)主機(jī)中有多個ovs網(wǎng)橋時,可以使用Patch Port把兩個網(wǎng)橋連起來。Patch Port總是成對出現(xiàn),分別連接在兩個網(wǎng)橋上,從一個Patch Port收到的數(shù)據(jù)包會被轉(zhuǎn)發(fā)到另一個Patch Port,類似于Linux系統(tǒng)中的veth。使用Patch連接的兩個網(wǎng)橋跟一個網(wǎng)橋沒什么區(qū)別,OpenStack Neutron中使用到了Patch Port。上面網(wǎng)橋br-ext中的Port phy-br-ext與br-int中的Port int-br-ext是一對Patch Port
可以使用ovs-vsctl創(chuàng)建patch設(shè)備,如下創(chuàng)建兩個網(wǎng)橋br0,br1,然后使用一對Patch Port連接它們
ovs-vsctl add-br br0
ovs-vsctl add-br br1
ovs-vsctl \
-- add-port br0 patch0 -- set interface patch0 type=patch options:peer=patch1 \
-- add-port br1 patch1 -- set interface patch1 type=patch options:peer=patch0
#結(jié)果如下
#ovs-vsctl show
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "patch0"
Interface "patch0"
type: patch
options: {peer="patch1"}
Bridge "br1"
Port "br1"
Interface "br1"
type: internal
Port "patch1"
Interface "patch1"
type: patch
options: {peer="patch0"}
連接兩個網(wǎng)橋不止上面一種方法,linux中支持創(chuàng)建Veth設(shè)備對,我們可以首先創(chuàng)建一對Veth設(shè)備對,然后把這兩個Veth分別添加到兩個網(wǎng)橋上,其效果跟OVS中創(chuàng)建Patch Port一樣,只是性能會有差別
#創(chuàng)建veth設(shè)備對veth-a,veth-b
ip link add veth-a type veth peer name veth-b
#使用Veth連接兩個網(wǎng)橋
ovs-vsctl add-port br0 veth-a
ovs-vsctl add-port br1 veth-b
- Tunnel
OVS中支持添加隧道(Tunnel)端口,常見隧道技術(shù)有兩種gre或vxlan。隧道技術(shù)是在現(xiàn)有的物理網(wǎng)絡(luò)之上構(gòu)建一層虛擬網(wǎng)絡(luò),上層應(yīng)用只與虛擬網(wǎng)絡(luò)相關(guān),以此實(shí)現(xiàn)的虛擬網(wǎng)絡(luò)比物理網(wǎng)絡(luò)配置更加靈活,并能夠?qū)崿F(xiàn)跨主機(jī)的L2通信以及必要的租戶隔離。不同隧道技術(shù)其大體思路均是將以太網(wǎng)報文使用隧道協(xié)議封裝,然后使用底層IP網(wǎng)絡(luò)轉(zhuǎn)發(fā)封裝后的數(shù)據(jù)包,其差異性在于選擇和構(gòu)造隧道的協(xié)議不同。Tunnel在OpenStack中用作實(shí)現(xiàn)大二層網(wǎng)絡(luò)以及租戶隔離,以應(yīng)對公有云大規(guī)模,多租戶的復(fù)雜網(wǎng)絡(luò)環(huán)境。
OpenStack是多節(jié)點(diǎn)結(jié)構(gòu),同一子網(wǎng)的虛擬機(jī)可能被調(diào)度到不同計(jì)算節(jié)點(diǎn)上,因此需要有隧道技術(shù)來保證這些同子網(wǎng)不同節(jié)點(diǎn)上的虛擬機(jī)能夠二層互通,就像他們連接在同一個交換機(jī)上,同時也要保證能與其它子網(wǎng)隔離。
OVS在計(jì)算和網(wǎng)絡(luò)節(jié)點(diǎn)上建立隧道Port來連接各節(jié)點(diǎn)上的網(wǎng)橋br-int,這樣所有網(wǎng)絡(luò)和計(jì)算節(jié)點(diǎn)上的br-int互聯(lián)形成了一個大的虛擬的跨所有節(jié)點(diǎn)的邏輯網(wǎng)橋(內(nèi)部靠tunnel id或VNI隔離不同子網(wǎng)),這個邏輯網(wǎng)橋?qū)μ摂M機(jī)和qrouter是透明的,它們覺得自己連接到了一個大的br-int上。從某個計(jì)算節(jié)點(diǎn)虛擬機(jī)發(fā)出的數(shù)據(jù)包會被封裝進(jìn)隧道通過底層網(wǎng)絡(luò)傳輸?shù)侥康闹鳈C(jī)然后解封裝。
上面網(wǎng)橋br-tun中Port "vxlan-080058ca"就是一個vxlan類型tunnel端口。下面使用兩臺主機(jī)測試創(chuàng)建vxlan隧道
#主機(jī)192.168.7.21上
ovs-vsctl add-br br-vxlan
#主機(jī)192.168.7.23上
ovs-vsctl add-br br-vxlan
#主機(jī)192.168.7.21上添加連接到7.23的Tunnel Port
ovs-vsctl add-port br-vxlan tun0 -- set Interface tun0 type=vxlan options:remote_ip=192.168.7.23
#主機(jī)192.168.7.23上添加連接到7.21的Tunnel Port
ovs-vsctl add-port br-vxlan tun0 -- set Interface tun0 type=vxlan options:remote_ip=192.168.7.21
然后,兩個主機(jī)上橋接到br-vxlan的虛擬機(jī)就像連接到同一個交換機(jī)一樣,可以實(shí)現(xiàn)跨主機(jī)的L2連接,同時又完全與物理網(wǎng)絡(luò)隔離。
Interface
Interface是連接到Port的網(wǎng)絡(luò)接口設(shè)備,是OVS與外部交換數(shù)據(jù)包的組件,在通常情況下,Port和Interface是一對一的關(guān)系,只有在配置Port為 bond模式后,Port和Interface是一對多的關(guān)系。這個網(wǎng)絡(luò)接口設(shè)備可能是創(chuàng)建Internal類型Port時OVS自動生成的虛擬網(wǎng)卡,也可能是系統(tǒng)的物理網(wǎng)卡或虛擬網(wǎng)卡(TUN/TAP)掛載在ovs上。 OVS中只有”Internal”類型的網(wǎng)卡接口才支持配置IP地址
Interface是一塊網(wǎng)絡(luò)接口設(shè)備,負(fù)責(zé)接收或發(fā)送數(shù)據(jù)包,Port是OVS網(wǎng)橋上建立的一個虛擬端口,Interface掛載在Port上。
Controller
OpenFlow控制器。OVS可以同時接受一個或者多個OpenFlow控制器的管理。主要作用是下發(fā)流表(Flow Tables)到OVS,控制OVS數(shù)據(jù)包轉(zhuǎn)發(fā)規(guī)則。控制器與OVS通過網(wǎng)絡(luò)連接,不一定要在同一主機(jī)上
可以看到上面實(shí)例中三個網(wǎng)橋br-int,br-ext,br-tun都連接到控制器Controller "tcp:127.0.0.1:6633上
datapath
OVS內(nèi)核模塊,負(fù)責(zé)執(zhí)行數(shù)據(jù)交換。其內(nèi)部有作為緩存使用的flows,上面已經(jīng)介紹過
OVS中的各種流(flows)
flows是OVS進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)策略控制的核心數(shù)據(jù)結(jié)構(gòu),區(qū)別于Linux Bridge是個單純基于MAC地址學(xué)習(xí)的二層交換機(jī),flows的存在使OVS作為一款SDN交換機(jī)成為云平臺網(wǎng)絡(luò)虛擬機(jī)化主要組件
OVS中有多種flows存在,用于不同目的,但最主要的還是OpenFlow flows這種,文中未明確說明的flows都是指OpenFlow flows
OpenFlow flows
OVS中最重要的一種flows,Controller控制器下發(fā)的就是這種flows,OVS架構(gòu)部分已經(jīng)簡單介紹過,關(guān)于openflow的具體使用,會在另一篇文章中說明
“hidden” flows
OVS在使用OpenFlow flow時,需要與OpenFlow控制器建立TCP連接,若此TCP連接不依賴OVS,即沒有OVS依然可以建立連接,此時就是out-of-band control模式,這種模式下不需要”hidden” flows
但是在in-band control模式下,TCP連接的建立依賴OVS控制的網(wǎng)絡(luò),但此時OVS依賴OpenFLow控制器下發(fā)的flows才能正常工作,沒法建立TCP連接也就無法下發(fā)flows,這就產(chǎn)生矛盾了,因此需要存在一些”hidden” flows,這些”hidden” flows保證了TCP連接能夠正常建立。關(guān)于in-band control詳細(xì)介紹,參考OVS官方文檔Design Decisions In Open vSwitch 中In-Band Control部分
“hidden” flows優(yōu)先級高于OpenFlow flows,它們不需要手動設(shè)置??梢允褂?code>ovs-appctl查看這些flows,下面命令輸出內(nèi)容包括OpenFlow flows,"hidden" flows
ovs-appctl bridge/dump-flows <br>
datapath flows
datapath flows是datapath內(nèi)核模塊維護(hù)的flows,由內(nèi)核模塊維護(hù)意味著我們并不需要去修改管理它。與OpenFlow flows不同的是,它不支持優(yōu)先級,并且只有一個表,這些特點(diǎn)使它非常適合做緩存。與OpenFlow一樣的是它支持通配符,也支持指令集(多個action)
datapath flows可以來自用戶空間ovs-vswitchd緩存,也可以是datapath內(nèi)核模塊進(jìn)行MAC地址學(xué)習(xí)到的flows,這取決與OVS是作為SDN交換機(jī),還是像Linux Bridge那樣只是一個簡單基于MAC地址學(xué)習(xí)的二層交換機(jī)
管理flows的命令行工具
我們可以修改和配置的是OpenFlow flows。datapath flow和”hidden” flows由OVS自身管理,我們不必去修改它。當(dāng)然,調(diào)試場景下還是可以使用工具修改的
介紹下上面三種flows管理工具,不具體說明,具體使用可以查看相關(guān)man手冊
ovs-ofctl dump-flows <br>打印指定網(wǎng)橋內(nèi)的所有OpenFlow flows,可以存在多個流表(flow tables),按表順序顯示。不包括”hidden” flows。這是最常用的查看flows命令,當(dāng)然這條命令對所有OpenFlow交換機(jī)都有效,不單單是OVSovs-appctl bridge/dump-flows <br>打印指定網(wǎng)橋內(nèi)所有OpenFlow flows,包括”hidden” flows,in-band control模式下排錯可以用到ovs-dpctl dump-flows [dp]打印內(nèi)核模塊中datapath flows,[dp]可以省略,默認(rèn)主機(jī)中只有一個datapathsystem@ovs-system
man手冊可以找到非常詳細(xì)的用法說明,注意ovs-ofctl管理的是OpenFlow flows
ovs-*工具的使用及區(qū)別
上面介紹了OVS用戶空間進(jìn)程以及控制器和OpenFlow協(xié)議,這里說下相關(guān)的命令行工具的使用及區(qū)別
ovs-vsctl
ovs-vsctl是一個管理或配置ovs-vswitchd的高級命令行工具,高級是說其操作對用戶友好,封裝了對數(shù)據(jù)庫的操作細(xì)節(jié)。它是管理OVS最常用的命令,除了配置flows之外,其它大部分操作比如Bridge/Port/Interface/Controller/Database/Vlan等都可以完成
#添加網(wǎng)橋br0
ovs-vsctl add-br br0
#列出所有網(wǎng)橋
ovs-vsctl list-br
#添加一個Port p1到網(wǎng)橋br0
ovs-vsctl add-port br0 p1
#查看網(wǎng)橋br0上所有Port
ovs-vsctl list-ports br0
#獲取br0網(wǎng)橋的OpenFlow控制器地址,沒有控制器則返回空
ovs-vsctl get-controller br0
#設(shè)置OpenFlow控制器,控制器地址為192.168.1.10,端口為6633
ovs-vsctl set-controller br0 tcp:192.168.1.10:6633
#移除controller
ovs-vsctl del-controller br0
#刪除網(wǎng)橋br0
ovs-vsctl del-br br0
#設(shè)置端口p1的vlan tag為100
ovs-vsctl set Port p1 tag=100
#設(shè)置Port p0類型為internal
ovs-vsctl set Interface p0 type=internal
#添加vlan10端口,并設(shè)置vlan tag為10,Port類型為Internal
ovs-vsctl add-port br0 vlan10 tag=10 -- set Interface vlan10 type=internal
#添加隧道端口gre0,類型為gre,遠(yuǎn)端IP為1.2.3.4
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=1.2.3.4
ovsdb-tool
ovsdb-tool是一個專門管理OVS數(shù)據(jù)庫文件的工具,不常用,它不直接與ovsdb-server進(jìn)程通信
#可以使用此工具創(chuàng)建并初始化database文件
ovsdb-tool create [db] [schema]
#可以使用ovsdb-client get-schema [database]獲取某個數(shù)據(jù)庫的schema(json格式)
#可以查看數(shù)據(jù)庫更改記錄,具體到操作命令,這個比較有用
ovsdb-tool show-log -m
record 48: 2017-01-07 03:34:15.147 "ovs-vsctl: ovs-vsctl --timeout=5 -- --if-exists del-port tapcea211ae-10"
table Interface row "tapcea211ae-10" (151f66b6):
delete row
table Port row "tapcea211ae-10" (cc9898cd):
delete row
table Bridge row "br-int" (fddd5e27):
table Open_vSwitch row a9fc1666 (a9fc1666):
record 49: 2017-01-07 04:18:23.671 "ovs-vsctl: ovs-vsctl --timeout=5 -- --if-exists del-port tap5b4345ea-d5 -- add-port br-int tap5b4345ea-d5 -- set Interface tap5b4345ea-d5 "external-ids:attached-mac=\"fa:16:3e:50:1b:5b\"" -- set Interface tap5b4345ea-d5 "external-ids:iface-id=\"5b4345ea-d5ea-4285-be99-0e4cadf1600a\"" -- set Interface tap5b4345ea-d5 "external-ids:vm-id=\"0aa2d71e-9b41-4c88-9038-e4d042b6502a\"" -- set Interface tap5b4345ea-d5 external-ids:iface-status=active"
table Port insert row "tap5b4345ea-d5" (4befd532):
table Interface insert row "tap5b4345ea-d5" (b8a5e830):
table Bridge row "br-int" (fddd5e27):
table Open_vSwitch row a9fc1666 (a9fc1666):
...
ovsdb-client
ovsdb-client是ovsdb-server進(jìn)程的命令行工具,主要是從正在運(yùn)行的ovsdb-server中查詢信息,操作的是數(shù)據(jù)庫相關(guān)
#列出主機(jī)上的所有databases,默認(rèn)只有一個庫Open_vSwitch
ovsdb-client list-dbs
#獲取指定數(shù)據(jù)庫的schema信息
ovsdb-client get-schema [DATABASE]
#列出指定數(shù)據(jù)庫的所有表
ovsdb-client list-tables [DATABASE]
#dump指定數(shù)據(jù)庫所有數(shù)據(jù),默認(rèn)dump所有table數(shù)據(jù),如果指定table,只dump指定table數(shù)據(jù)
ovsdb-client dump [DATABASE] [TABLE]
#監(jiān)控指定數(shù)據(jù)庫中的指定表記錄改變
ovsdb-client monitor DATABASE TABLE
ovs-ofctl
ovs-ofctl是專門管理配置OpenFlow交換機(jī)的命令行工具,我們可以用它手動配置OVS中的OpenFlow flows,注意其不能操作datapath flows和”hidden” flows
#查看br-tun中OpenFlow flows
ovs-ofctl dump-flows br-tun
#查看br-tun端口信息
ovs-ofctl show br-tun
#添加新的flow:對于從端口p0進(jìn)入交換機(jī)的數(shù)據(jù)包,如果它不包含任何VLAN tag,則自動為它添加VLAN tag 101
ovs-ofctl add-flow br0 "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"
#對于從端口3進(jìn)入的數(shù)據(jù)包,若其vlan tag為100,去掉其vlan tag,并從端口1發(fā)出
ovs-ofctl add-flow br0 in_port=3,dl_vlan=101,actions=strip_vlan,output:1
#添加新的flow: 修改從端口p1收到的數(shù)據(jù)包的源地址為9.181.137.1,show 查看p1端口ID為100
ovs-ofctl add-flow br0 "priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal"
#添加新的flow: 重定向所有的ICMP數(shù)據(jù)包到端口 p2
ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102
#刪除編號為 100 的端口上的所有流表項(xiàng)
ovs-ofctl del-flows br0 "in_port=100"
ovs-vsctl是一個綜合的配置管理工具,ovsdb-client傾向于從數(shù)據(jù)庫中查詢某些信息,而ovsdb-tool是維護(hù)數(shù)據(jù)庫文件工具
轉(zhuǎn)載地址http://www.isjian.com/openstack/openstack-base-use-openvswitch/