Open vSwitch介紹
在過去,數據中心的服務器是直接連在硬件交換機上,後來VMware實現了服務器虛擬化技術,使虛擬服務器(VMs)能夠連接在虛擬交換機上,藉助這個虛擬交換機,可以爲服務器上運行的VMs或容器提供邏輯的虛擬的以太網接口,這些邏輯接口都連接到虛擬交換機上,有三種比較流行的虛擬交換機: VMware virtual switch, Cisco Nexus 1000V,和Open vSwitch
Open vSwitch(OVS)是運行在虛擬化平臺上的虛擬交換機,其支持OpenFlow協議,也支持gre/vxlan/IPsec等隧道技術。在OVS之前,基於Linux的虛擬化平臺比如KVM或Xen上,缺少一個功能豐富的虛擬交換機,因此OVS迅速崛起並開始在Xen/KVM中流行起來,並且應用於越來越多的開源項目,比如openstack neutron中的網絡解決方案
在虛擬交換機的Flow控制器或管理工具方面,一些商業產品都集成有控制器或管理工具,比如Cisco 1000V的Virtual Supervisor Manager(VSM)
,VMware的分佈式交換機中的vCenter
。而OVS則需要藉助第三方控制器或管理工具實現複雜的轉發策略。例如OVS支持OpenFlow 協議,我們就可以使用任何支持OpenFlow協議的控制器來對OVS進行遠程管理。OpenStack Neutron中的ML2插件也能夠實現對OVS的管理。但這並不意味着OVS必須要有一個控制器才能工作。在不連接外部控制器情況下,OVS自身可以依靠MAC地址學習實現二層數據包轉發功能,就像Linux Bridge
在基於Linux內核的系統上,應用最廣泛的還是系統自帶的虛擬交換機Linux Bridge
,它是一個單純的基於MAC地址學習的二層交換機,簡單高效,但同時缺乏一些高級特性,比如OpenFlow,VLAN tag,QOS,ACL,Flow等,而且在隧道協議支持上,Linux Bridge只支持vxlan,OVS支持gre/vxlan/IPsec等,這也決定了OVS更適用於實現SDN技術
OVS支持以下features
支持NetFlow, IPFIX, sFlow, SPAN/RSPAN等流量監控協議
精細的ACL和QoS策略
可以使用OpenFlow和OVSDB協議進行集中控制
Port bonding,LACP,tunneling(vxlan/gre/Ipsec)
適用於Xen,KVM,VirtualBox等hypervisors
支持標準的802.1Q VLAN協議
基於VM interface的流量管理策略
支持組播功能
flow-caching engine(datapath模塊)
文章使用環境
centos7 openvswitch 2.5 OpenFlow 1.4
OVS架構
先看下OVS整體架構,用戶空間主要組件有數據庫服務ovsdb-server和守護進程ovs-vswitchd。kernel中是datapath內核模塊。最上面的Controller表示OpenFlow控制器,控制器與OVS是通過OpenFlow協議進行連接,控制器不一定位於OVS主機上,下面分別介紹圖中各組件
ovs-vswitchd
ovs-vswitchd
守護進程是OVS的核心部件,它和datapath
內核模塊一起實現OVS基於流的數據交換。作爲核心組件,它使用openflow協議與上層OpenFlow控制器通信,使用OVSDB協議與ovsdb-server
通信,使用netlink
和datapath
內核模塊通信。ovs-vswitchd
在啓動時會讀取ovsdb-server
中配置信息,然後配置內核中的datapaths
和所有OVS switches,當ovsdb中的配置信息改變時(例如使用ovs-vsctl工具),ovs-vswitchd
也會自動更新其配置以保持與數據庫同步
# ps -ef |grep ovs-vsroot 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
內核模塊才能正常運行。它會自動配置datapath
flows,因此我們不必再使用ovs-dpctl
去手動操作datapath
,但ovs-dpctl
仍可用於調試場合
在OVS中,ovs-vswitchd
從OpenFlow控制器獲取流表規則,然後把從datapath
中收到的數據包在流表中進行匹配,找到匹配的flows並把所需應用的actions返回給datapath
,同時作爲處理的一部分,ovs-vswitchd
會在datapath
中設置一條datapath flows用於後續相同類型的數據包可以直接在內核中執行動作,此datapath flows相當於OpenFlow flows的緩存。對於datapath
來說,其並不知道用戶空間OpenFlow的存在,datapath內核模塊信息如下
# modinfo openvswitchfilename: /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輕量級的數據庫服務,用於整個OVS的配置信息,包括接口/交換內容/VLAN等,OVS主進程ovs-vswitchd
根據數據庫中的配置信息工作,下面是ovsdb-server
進程詳細信息
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
是數據庫文件存放位置,文件形式存儲保證了服務器重啓不會影響其配置信息,ovsdb-server
需要文件才能啓動,可以使用ovsdb-tool create
命令創建並初始化此數據庫文件 --remote=punix:/var/run/openvswitch/db.sock
實現了一個Unix sockets連接,OVS主進程ovs-vswitchd
或其它命令工具(ovsdb-client)通過此socket連接管理ovsdb /var/log/openvswitch/ovsdb-server.log
是日誌記錄
OpenFlow
OpenFlow是開源的用於管理交換機流表的協議,OpenFlow在OVS中的地位可以參考上面架構圖,它是Controller和ovs-vswitched間的通信協議。需要注意的是,OpenFlow是一個獨立的完整的流表協議,不依賴於OVS,OVS只是支持OpenFlow協議,有了支持,我們可以使用OpenFlow控制器來管理OVS中的流表,OpenFlow不僅僅支持虛擬交換機,某些硬件交換機也支持OpenFlow協議
OVS常用作SDN交換機(OpenFlow交換機),其中控制數據轉發策略的就是OpenFlow flow。OpenStack Neutron中實現了一個OpenFlow控制器用於向OVS下發OpenFlow flows控制虛擬機間的訪問或隔離。本文討論的默認是作爲SDN交換機場景下
OpenFlow flow的流表項存放於用戶空間主進程ovs-vswitchd
中,OVS除了連接OpenFlow控制器獲取這種flow,文章後面會提到的命令行工具ovs-ofctl
工具也可以手動管理OVS中的OpenFlow flow,可以查看man ovs-ofctl
瞭解
在OVS中,OpenFlow flow是最重要的一種flow, 然而還有其它幾種flows存在,文章下面OVS概念部分會提到
Controller
Controller指OpenFlow控制器。OpenFlow控制器可以通過OpenFlow協議連接到任何支持OpenFlow的交換機,比如OVS。控制器通過向交換機下發流表規則來控制數據流向。除了可以通過OpenFlow控制器配置OVS中flows,也可以使用OVS提供的ovs-ofctl
命令通過OpenFlow協議去連接OVS,從而配置flows,命令也能夠對OVS的運行狀況進行動態監控。
Kernel Datapath
下面討論場景是OVS作爲一個OpenFlow交換機
datapath是一個Linux內核模塊,它負責執行數據交換。關於datapath,The Design and Implementation of Open vSwitch中有描述
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.
爲了說明datapath,來看一張更詳細的架構圖,圖中的大部分組件上面都有提到
用戶空間ovs-vswitchd
和內核模塊datapath
決定了數據包的轉發,首先,datapath
內核模塊收到進入數據包(物理網卡或虛擬網卡),然後查找其緩存(datapath flows),當有一個匹配的flow時它執行對應的操作,否則datapath
會把該數據包送入用戶空間由ovs-vswitchd
負責在其OpenFlow flows中查詢(圖1中的First Packet),ovs-vswitchd
查詢後把匹配的actions返回給datapath
並設置一條datapath flows到datapath
中,這樣後續進入的同類型的數據包(圖1中的Subsequent Packets)因爲緩存匹配會被datapath
直接處理,不用再次進入用戶空間。
datapath
專注於數據交換,它不需要知道OpenFlow的存在。與OpenFlow打交道的是ovs-vswitchd
,ovs-vswitchd
存儲所有Flow規則供datapath
查詢或緩存.
雖然有ovs-dpctl
管理工具的存在,但我們沒必要去手動管理datapath
,這是用戶空間ovs-vswitchd
的工作
OVS概念
這部分說下OVS中的重要概念,使用OpenStack neutron+vxlan部署模式下網絡節點OVS網橋作爲例子
# ovs-vsctl showe44abab7-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代表一個以太網交換機(Switch),一個主機中可以創建一個或者多個Bridge。Bridge的功能是根據一定規則,把從端口收到的數據包轉發到另一個或多個端口,上面例子中有三個Bridge,br-tun
,br-int
,br-ext
添加一個網橋br0
ovs-vsctl add-br br0
Port
端口Port與物理交換機的端口概念類似,Port是OVS Bridge上創建的一個虛擬端口,每個Port都隸屬於一個Bridge。Port有以下幾種類型
Normal
可以把操作系統中已有的網卡(物理網卡em1/eth0,或虛擬機的虛擬網卡tapxxx)掛載到ovs上,ovs會生成一個同名Port處理這塊網卡進出的數據包。此時端口類型爲Normal。
如下,主機中有一塊物理網卡eth1
,把其掛載到OVS網橋br-ext
上,OVS會自動創建同名Port eth1
。
ovs-vsctl add-port br-ext eth1#Bridge br-ext中出現Port "eth1"
有一點要注意的是,掛載到OVS上的網卡設備不支持分配IP地址,因此若之前eth1
配置有IP地址,掛載到OVS之後IP地址將不可訪問。這裏的網卡設備不只包括物理網卡,也包括主機上創建的虛擬網卡
Internal
Internal類型是OVS內部創建的虛擬網卡接口,每創建一個Port,OVS會自動創建一個同名接口(Interface)掛載到新創建的Port上。接口的概念下面會提到。
下面創建一個網橋br0,並創建一個Internal類型的Port p0
ovs-vsctl add-br br0 ovs-vsctl add-port br0 p0 -- set Interface p0 type=internal#查看網橋br0 ovs-vsctl show br0 Bridge "br0" fail_mode: secure Port "p0" Interface "p0" type: internal Port "br0" Interface "br0" type: internal
可以看到有兩個Port。當ovs創建一個新網橋時,默認會創建一個與網橋同名的Internal Port。在OVS中,只有”internal”類型的設備才支持配置IP地址信息,因此我們可以爲br0
接口配置一個IP地址,當然p0
也可以配置IP地址
ip addr add 192.168.10.11/24 dev br0 ip link set br0 up#添加默認路由ip route add default via 192.168.10.1 dev br0
上面兩種Port類型區別在於,Internal類型會自動創建接口(Interface),而Normal類型是把主機中已有的網卡接口添加到OVS中
Patch
當主機中有多個ovs網橋時,可以使用Patch Port把兩個網橋連起來。Patch Port總是成對出現,分別連接在兩個網橋上,從一個Patch Port收到的數據包會被轉發到另一個Patch Port,類似於Linux系統中的veth
。使用Patch連接的兩個網橋跟一個網橋沒什麼區別,OpenStack Neutron中使用到了Patch Port。上面網橋br-ext
中的Port phy-br-ext
與br-int
中的Port int-br-ext
是一對Patch Port
可以使用ovs-vsctl
創建patch設備,如下創建兩個網橋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#結果如下#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"}
連接兩個網橋不止上面一種方法,linux中支持創建Veth
設備對,我們可以首先創建一對Veth
設備對,然後把這兩個Veth
分別添加到兩個網橋上,其效果跟OVS中創建Patch Port一樣,只是性能會有差別
#創建veth設備對veth-a,veth-bip link add veth-a type veth peer name veth-b#使用Veth連接兩個網橋ovs-vsctl add-port br0 veth-a ovs-vsctl add-port br1 veth-b
Tunnel
OVS中支持添加隧道(Tunnel)端口,常見隧道技術有兩種gre
或vxlan
。隧道技術是在現有的物理網絡之上構建一層虛擬網絡,上層應用只與虛擬網絡相關,以此實現的虛擬網絡比物理網絡配置更加靈活,並能夠實現跨主機的L2通信以及必要的租戶隔離。不同隧道技術其大體思路均是將以太網報文使用隧道協議封裝,然後使用底層IP網絡轉發封裝後的數據包,其差異性在於選擇和構造隧道的協議不同。Tunnel在OpenStack中用作實現大二層網絡以及租戶隔離,以應對公有云大規模,多租戶的複雜網絡環境。
OpenStack是多節點結構,同一子網的虛擬機可能被調度到不同計算節點上,因此需要有隧道技術來保證這些同子網不同節點上的虛擬機能夠二層互通,就像他們連接在同一個交換機上,同時也要保證能與其它子網隔離。
OVS在計算和網絡節點上建立隧道Port來連接各節點上的網橋br-int
,這樣所有網絡和計算節點上的br-int
互聯形成了一個大的虛擬的跨所有節點的邏輯網橋(內部靠tunnel id或VNI隔離不同子網),這個邏輯網橋對虛擬機和qrouter是透明的,它們覺得自己連接到了一個大的br-int
上。從某個計算節點虛擬機發出的數據包會被封裝進隧道通過底層網絡傳輸到目的主機然後解封裝。
上面網橋br-tun
中Port "vxlan-080058ca"
就是一個vxlan
類型tunnel端口。下面使用兩臺主機測試創建vxlan隧道
#主機192.168.7.21上ovs-vsctl add-br br-vxlan#主機192.168.7.23上ovs-vsctl add-br br-vxlan#主機192.168.7.21上添加連接到7.23的Tunnel Portovs-vsctl add-port br-vxlan tun0 -- set Interface tun0 type=vxlan options:remote_ip=192.168.7.23#主機192.168.7.23上添加連接到7.21的Tunnel Portovs-vsctl add-port br-vxlan tun0 -- set Interface tun0 type=vxlan options:remote_ip=192.168.7.21
然後,兩個主機上橋接到br-vxlan
的虛擬機就像連接到同一個交換機一樣,可以實現跨主機的L2連接,同時又完全與物理網絡隔離。
Interface
Interface是連接到Port的網絡接口設備,是OVS與外部交換數據包的組件,在通常情況下,Port和Interface是一對一的關係,只有在配置Port爲 bond模式後,Port和Interface是一對多的關係。這個網絡接口設備可能是創建Internal
類型Port時OVS自動生成的虛擬網卡,也可能是系統的物理網卡或虛擬網卡(TUN/TAP)掛載在ovs上。 OVS中只有”Internal”類型的網卡接口才支持配置IP地址
Interface
是一塊網絡接口設備,負責接收或發送數據包,Port是OVS網橋上建立的一個虛擬端口,Interface
掛載在Port上。
Controller
OpenFlow控制器。OVS可以同時接受一個或者多個OpenFlow控制器的管理。主要作用是下發流表(Flow Tables)到OVS,控制OVS數據包轉發規則。控制器與OVS通過網絡連接,不一定要在同一主機上
可以看到上面實例中三個網橋br-int
,br-ext
,br-tun
都連接到控制器Controller "tcp:127.0.0.1:6633
上
datapath
OVS內核模塊,負責執行數據交換。其內部有作爲緩存使用的flows,上面已經介紹過
OVS中的各種流(flows)
flows是OVS進行數據轉發策略控制的核心數據結構,區別於Linux Bridge是個單純基於MAC地址學習的二層交換機,flows的存在使OVS作爲一款SDN交換機成爲雲平臺網絡虛擬機化主要組件
OVS中有多種flows存在,用於不同目的,但最主要的還是OpenFlow flows這種,文中未明確說明的flows都是指OpenFlow flows
OpenFlow flows
OVS中最重要的一種flows,Controller控制器下發的就是這種flows,OVS架構部分已經簡單介紹過,關於openflow的具體使用,會在另一篇文章中說明
“hidden” flows
OVS在使用OpenFlow flow時,需要與OpenFlow控制器建立TCP連接,若此TCP連接不依賴OVS,即沒有OVS依然可以建立連接,此時就是out-of-band control
模式,這種模式下不需要”hidden” flows
但是在in-band control
模式下,TCP連接的建立依賴OVS控制的網絡,但此時OVS依賴OpenFLow控制器下發的flows才能正常工作,沒法建立TCP連接也就無法下發flows,這就產生矛盾了,因此需要存在一些”hidden” flows,這些”hidden” flows保證了TCP連接能夠正常建立。關於in-band control
詳細介紹,參考OVS官方文檔Design Decisions In Open vSwitch 中In-Band Control部分
“hidden” flows優先級高於OpenFlow flows,它們不需要手動設置。可以使用ovs-appctl
查看這些flows,下面命令輸出內容包括OpenFlow flows
,"hidden" flows
ovs-appctl bridge/dump-flows <br>
datapath flows
datapath flows是datapath
內核模塊維護的flows,由內核模塊維護意味着我們並不需要去修改管理它。與OpenFlow flows不同的是,它不支持優先級,並且只有一個表,這些特點使它非常適合做緩存。與OpenFlow一樣的是它支持通配符,也支持指令集(多個action)
datapath flows可以來自用戶空間ovs-vswitchd
緩存,也可以是datapath內核模塊進行MAC地址學習到的flows,這取決與OVS是作爲SDN交換機,還是像Linux Bridge那樣只是一個簡單基於MAC地址學習的二層交換機
管理flows的命令行工具
我們可以修改和配置的是OpenFlow flows。datapath flow和”hidden” flows由OVS自身管理,我們不必去修改它。當然,調試場景下還是可以使用工具修改的
介紹下上面三種flows管理工具,不具體說明,具體使用可以查看相關man手冊
ovs-ofctl dump-flows <br>
打印指定網橋內的所有OpenFlow flows,可以存在多個流表(flow tables),按表順序顯示。不包括”hidden” flows。這是最常用的查看flows命令,當然這條命令對所有OpenFlow交換機都有效,不單單是OVSovs-appctl bridge/dump-flows <br>
打印指定網橋內所有OpenFlow flows,包括”hidden” flows,in-band control
模式下排錯可以用到ovs-dpctl dump-flows [dp]
打印內核模塊中datapath flows,[dp]
可以省略,默認主機中只有一個datapathsystem@ovs-system
man手冊可以找到非常詳細的用法說明,注意ovs-ofctl
管理的是OpenFlow flows
ovs-*工具的使用及區別
上面介紹了OVS用戶空間進程以及控制器和OpenFlow協議,這裏說下相關的命令行工具的使用及區別
ovs-vsctl
ovs-vsctl
是一個管理或配置ovs-vswitchd
的高級命令行工具,高級是說其操作對用戶友好,封裝了對數據庫的操作細節。它是管理OVS最常用的命令,除了配置flows之外,其它大部分操作比如Bridge/Port/Interface/Controller/Database/Vlan等都可以完成
#添加網橋br0ovs-vsctl add-br br0#列出所有網橋 ovs-vsctl list-br#添加一個Port p1到網橋br0ovs-vsctl add-port br0 p1#查看網橋br0上所有Port ovs-vsctl list-ports br0#獲取br0網橋的OpenFlow控制器地址,沒有控制器則返回空 ovs-vsctl get-controller br0#設置OpenFlow控制器,控制器地址爲192.168.1.10,端口爲6633ovs-vsctl set-controller br0 tcp:192.168.1.10:6633#移除controllerovs-vsctl del-controller br0#刪除網橋br0ovs-vsctl del-br br0#設置端口p1的vlan tag爲100ovs-vsctl set Port p1 tag=100#設置Port p0類型爲internalovs-vsctl set Interface p0 type=internal#添加vlan10端口,並設置vlan tag爲10,Port類型爲Internalovs-vsctl add-port br0 vlan10 tag=10 -- set Interface vlan10 type=internal#添加隧道端口gre0,類型爲gre,遠端IP爲1.2.3.4ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=1.2.3.4
ovsdb-tool
ovsdb-tool
是一個專門管理OVS數據庫文件的工具,不常用,它不直接與ovsdb-server
進程通信
#可以使用此工具創建並初始化database文件ovsdb-tool create [db] [schema]#可以使用ovsdb-client get-schema [database]獲取某個數據庫的schema(json格式)#可以查看數據庫更改記錄,具體到操作命令,這個比較有用 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
進程的命令行工具,主要是從正在運行的ovsdb-server
中查詢信息,操作的是數據庫相關
#列出主機上的所有databases,默認只有一個庫Open_vSwitchovsdb-client list-dbs#獲取指定數據庫的schema信息ovsdb-client get-schema [DATABASE]#列出指定數據庫的所有表ovsdb-client list-tables [DATABASE]#dump指定數據庫所有數據,默認dump所有table數據,如果指定table,只dump指定table數據 ovsdb-client dump [DATABASE] [TABLE]#監控指定數據庫中的指定表記錄改變 ovsdb-client monitor DATABASE TABLE
ovs-ofctl
ovs-ofctl
是專門管理配置OpenFlow交換機的命令行工具,我們可以用它手動配置OVS中的OpenFlow flows,注意其不能操作datapath flows和”hidden” flows
#查看br-tun中OpenFlow flowsovs-ofctl dump-flows br-tun#查看br-tun端口信息 ovs-ofctl show br-tun#添加新的flow:對於從端口p0進入交換機的數據包,如果它不包含任何VLAN tag,則自動爲它添加VLAN tag 101ovs-ofctl add-flow br0 "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"#對於從端口3進入的數據包,若其vlan tag爲100,去掉其vlan tag,並從端口1發出 ovs-ofctl add-flow br0 in_port=3,dl_vlan=101,actions=strip_vlan,output:1#添加新的flow: 修改從端口p1收到的數據包的源地址爲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數據包到端口 p2ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102#刪除編號爲 100 的端口上的所有流表項 ovs-ofctl del-flows br0 "in_port=100"
ovs-vsctl
是一個綜合的配置管理工具,ovsdb-client
傾向於從數據庫中查詢某些信息,而ovsdb-tool
是維護數據庫文件工具
文章地址https://opengers.github.io/openstack/openstack-base-use-openvswitch/