openvswitch的原理和經常使用命令

一.Openvswitch工做原理

  openvSwitch是一個高質量的、多層虛擬交換機,使用開源Apache2.0許可協議,由 Nicira Networks開發,主要實現代碼爲可移植的C代碼。它的目的是讓大規模網絡自動化能夠經過編程擴展,同時仍然支持標準的管理接口和協議(例如NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag)。此外,它被設計位支持跨越多個物理服務器的分佈式環境,相似於VMware的vNetwork分佈式vswitch或Cisco Nexus 1000 V。Open vSwitch支持多種linux 虛擬化技術,包括Xen/XenServer, KVM和VirtualBox。
  openvswitch是一個虛擬交換軟件,主要用於虛擬機VM環境,做爲一個虛擬交換機,支持Xen/XenServer,KVM以及virtualBox多種虛擬化技術。在這種虛擬化的環境中,一個虛擬交換機主要有兩個做用:傳遞虛擬機之間的流量,以及實現虛擬機和外界網絡的通訊。
  內核模塊實現了多個「數據路徑」(相似於網橋),每一個均可以有多個「vports」(相似於橋內的端口)。每一個數據路徑也經過關聯一下流表(flow table)來設置操做,而這些流表中的流都是用戶空間在報文頭和元數據的基礎上映射的關鍵信息,通常的操做都是將數據包轉發到另外一個vport。當一個數據包到達一個vport,內核模塊所作的處理是提取其流的關鍵信息並在流表中查找這些關鍵信息。當有一個匹配的流時它執行對應的操做。若是沒有匹配,它會將數據包送到用戶空間的處理隊列中(做爲處理的一部分,用戶空間可能會設置一個流用於之後碰到相同類型的數據包能夠在內核中執行操做)。linux

1.OpenvSwitch的組成

 ovs的主要組成模塊以下圖所示:數據庫

ovs

  • ovs-vswitchd:OVS守護進程是,OVS的核心部件,實現交換功能,和Linux內核兼容模塊一塊兒,實現基於流的交換(flow-based switching)。它和上層 controller 通訊聽從 OPENFLOW 協議,它與 ovsdb-server 通訊使用 OVSDB 協議,它和內核模塊經過netlink通訊,它支持多個獨立的 datapath(網橋),它經過更改flow table 實現了綁定和VLAN等功能。
      
  • ovsdb-server:輕量級的數據庫服務,主要保存了整個OVS 的配置信息,包括接口啊,交換內容,VLAN啊等等。ovs-vswitchd 會根據數據庫中的配置信息工做。它於 manager 和 ovs-vswitchd 交換信息使用了OVSDB(JSON-RPC)的方式。
      
  • ovs-dpctl:一個工具,用來配置交換機內核模塊,能夠控制轉發規則。  編程

  • ovs-vsctl:主要是獲取或者更改ovs-vswitchd 的配置信息,此工具操做的時候會更新ovsdb-server 中的數據庫。  安全

  • ovs-appctl:主要是向OVS 守護進程發送命令的,通常用不上。 服務器

  • ovsdbmonitor:GUI 工具來顯示ovsdb-server 中數據信息。  網絡

  • ovs-controller:一個簡單的OpenFlow 控制器  併發

  • ovs-ofctl:用來控制OVS 做爲OpenFlow 交換機工做時候的流表內容。app

2. OpenvSwitch的工做流程

  下圖經過ovs實現虛擬機和外部通訊的過程,通訊流程以下:tcp

  1.VM實例 instance 產生一個數據包併發送至實例內的虛擬網絡接口 VNIC,圖中就是 instance 中的 eth0.
  2.這個數據包會傳送到物理機上的VNIC接口,如圖就是vnet接口.
  3.數據包從 vnet NIC 出來,到達橋(虛擬交換機) br100 上.
  4.數據包通過交換機的處理,從物理節點上的物理接口發出,如圖中物理機上的 eth0 .
  5.數據包從 eth0 出去的時候,是按照物理節點上的路由以及默認網關操做的,這個時候該數 據包其實已經不受你的控制了.
  注:通常 L2 switch 鏈接 eth0 的這個口是一個 trunk 口, 由於虛擬機對應的 VNET 每每會設置 VLAN TAG, 能夠經過對虛擬機對應的 vnet 打 VALN TAG 來控制虛擬機的網絡廣播域. 若是跑多個虛擬機的話, 多個虛擬機對應的 vnet 能夠設置不一樣的 vlan tag, 那麼這些虛擬機的數據包從 eth0(4)出去的時候, 會帶上TAG標記. 這樣也就必須是 trunk 口才行。分佈式

3.OpenvSwitch簡單應用實例

  以下圖所示,建立從物理機到物理機的網絡拓撲:

  經過如下命令便可實現:

root[@localhost](https://my.oschina.net/u/570656):~# ovs-vsctl add-br br0 
root[@localhost](https://my.oschina.net/u/570656):~# ovs-vsctl add-port br0 eth0 
root[@localhost](https://my.oschina.net/u/570656):~# ovs-vsctl add-port br0 eth1

4.Openvswitch常見操做

# 添加網橋:
ovs-vsctl add-br br0  
  
# 列出全部網橋:
ovs-vsctl list-br
  
# 判斷網橋是否存在:
ovs-vsctl br-exists br0
  
# 將物理網卡掛載到網橋上:
ovs-vsctl add-port br0 eth0
  
# 列出網橋中的全部端口:
ovs-vsctl list-ports br0
  
# 列出全部掛載到網卡的網橋:
ovs-vsctl port-to-br eth0
  
# 查看ovs的網絡狀態:
ovs-vsctl show
  
# 刪除網橋上已經掛載的網口:
ovs-vsctl del-port br0 eth0
  
# 刪除網橋:
ovs-vsctl del-br br0
  
# 設置控制器:
ovs-vsctl set-controller br0 tcp:ip:6633
  
# 刪除控制器:
ovs-vsctl del-controller br0
  
# 設置支持OpenFlow Version 1.3:
ovs-vsctl set bridge br0 protocols=OpenFlow13  
  
# 刪除OpenFlow支持設置:
ovs-vsctl clear bridge br0 protocols 
  
# 設置vlan標籤:
ovs-vsctl add-port br0 vlan3 tag=3 -- set interface vlan3 type=internal
  
# 刪除vlan標籤:
ovs-vsctl del-port br0 vlan3 
  
# 查詢 VLAN:
ovs-vsctl show 
ifconfig vlan3 
  
# 查看網橋上全部交換機端口的狀態:
ovs-ofctl dump-ports br0
  
# 查看網橋上全部的流規則:
ovs-ofctl dump-flows br0
  
# 查看ovs的版本:
ovs-ofctl -V

# 給端口配置tag
ovs-vsctl set port br-ex tag=101

 

二.Neutron使用openvswitch網絡通訊的基本原理

  Openstack在建立虛擬機進行網絡配置的時候大體分爲兩個步驟:

  一、Nova-compute經過調度在主機側建立虛擬機,而且建立好linux bridge,是否建立linux網橋取決因而否把安全組的功能打開,建立好bridge和veth類型的點對點端口,鏈接bridge設備和br-int網橋。

  二、Neutron-ovs-agent週期任務掃描到網橋上的端口發送rpc請求到neutron-server側,獲取端口的詳細信息,進行網絡配置,固然,不一樣類型的網絡會進行不一樣的處理,OVS當前支持,vlan、vxlan、flat、gre類型的網絡。

  具體虛擬機通訊分爲如下兩種狀況:

  • 同板虛擬機通訊

  在報文入口方向打上vlan,在br-int網橋上進行二層的隔離,對neutron-ovs-agent來講,這個是一個內部vlan,所以,很顯然,對於這個主機使用的network來講,在主機側neutron-ovs-agent都會維護一個內部vlan,而且是一一對應的,用於不一樣network的虛擬機在板上的互相隔離,因爲板內虛擬機通訊不通過物理網口,所以,也不會受到網口帶寬和物理交換機性能的影響。

  • 跨板虛擬機通訊:

  這裏以vlan類型網絡舉例,network的segment_id爲100,即vlan爲100,虛擬機出來的報文在進入br-int網橋上被打上內部的vlan,舉例來講打上vlan 3,下行的流量在通過對應的網絡平面後,vlan會進行對應的修改,經過ovs的flow table把vlan修改爲真實的vlan值100;上行流量在br-int網橋上經過flow table把vlan 100修改爲內部的vlan 3,flat網絡原理相似,下行流量會在br-eth經過flow table strip_vlan送出網口,vxlan類型的網絡稍有不一樣,不過原理也是相似。

 

這裏再來一張我本身畫的圖

 

    1. 添加兩個虛擬端口,互爲peer  
    ip link add mgmt-eth2 type veth peer name eth2-mgmt  
    ip link set mgmt-eth2 up  
    ip link set eth2-mgmt up  
      
    2. 把上面的兩個端口加到橋上  
    ovs-vsctl add-port br-mgmt mgmt-eth2  
    修改ovs的數據庫  
    ovs-vsctl set interface mgmt-eth2 type=patch  
    ovs-vsctl set interface mgmt-eth2 options:peer=eth2-mgmt  
      
    3. 把上面的兩個端口加到橋上  
    ovs-vsctl add-port br-eth2 eth2-mgmt  
    ovs-vsctl set interface eth2-mgmt type=patch  
    ovs-vsctl set interface eth2-mgmt options:peer=mgmt-eth2  
      
    4. ovs-vsctl add-port br-eth2 eth2  
      
    注意經過上面的方法添加完後,會在ifconfig中把上面的新加的port(如:mgmt-eth2, eth2-mgmt)一併顯示出來  
      
      
    上面的1~4能夠用下面的步驟來代替,且新加的veth不會出如今ifconfig中:  
    ovs-vsctl add-br br-mgmt  
    ovs-vsctl add-br br-eth2  
    ovs-vsctl add-port br-mgmt mgmt-eth2 -- set Interface mgmt-eth2 type=patch options:peer=eth2-mgmt  











##############

ovs-vsctl add-port br-eth2 eth2-mgmt -- set Interface eth2-mgmt type=patch options:peer=mgmt-eth2  
ovs-vsctl add-port br-eth2 eth2  
      
      
      
    ******************************************  
移除  
ovs-vsctl del-fail-mode ovs-br  
設置fail-mode  
ovs-vsctl set-fail-mode br-ex secure  
設置tag  
ovs-vsctl set port eth0-stor tag=102  


清除tag  
ovs-vsctl clear port br-eth1--br-mgmt tag  



ovs設置網橋MAC  
ovs-vsctl set bridge br-storage other-config:hwaddr=fa:16:3e:fe:8f:79  
補充
相關文章
相關標籤/搜索