透過現象看本質——談談L2 agent 這回事兒

透過現象看本質——談談L2 agent這回事兒

前言

​ 上回說到OpenStack Neutron項目中有關ML2插件的事兒,ML2作爲H版本更新後新生代核心插件的寵兒,其實現了network/subnet/port三種核心資源,同時也實現了包括Port Binding等在內的部分擴展資源。ML2插件通過解耦網絡拓撲類型與底層的虛擬網絡實現機制,並通過Driver的形式進行擴展,解決了傳統核心插件的相關問題。

​ 而我們知道在neutron所提供的服務中,插件和代理是對應着的,儘管我們說ML2解決了在使用傳統核心插件時所有節點只能使用同一種網絡提供者的問題,但是這並非意味着不同的機制驅動可以用與之不同的網絡提供者提供代理服務,但其實我們無需考慮這麼多,開發者只需要針對agent開發對應的驅動即可。

​ ML2 Core Plugin及其agent負責將實例連接到OpenStack Layer 2虛擬網絡,本文就來談談有關Linux Bridge和Open vSwitch代理的內容。

Service和Agent

​ 在Neutron項目中,官方對於服務和代理給出的介紹爲:一個常見的Neutron設置包括多個服務和運行在一個或多個節點上的代理(儘管有些設置可能不需要任何代理)。每個服務都提供一些網絡或API服務。特別注意的是:

  1. 提供API端點(Endpoints)並用作對數據庫的單點訪問的Neutron Server。它通常在控制器節點上運行。
  2. 可以利用Open vSwitch,Linux Bridge或其他特定於供應商的技術的Layer2代理爲項目網絡提供網絡分段和隔離(對應着物理網絡中二層交換機來理解)。L2代理應在它負責佈線和保護虛擬接口(通常是計算節點和網絡節點)的每個節點上運行。
  3. 在網絡節點上運行的Layer3代理,提供東西向和南北向路由以及一些高級服務,例如FWaaS或***aaS。

本文談的是基於二層的代理,主要是講述Linux Bridge agent以及Open vSwitch agent,這兩者都屬於L2(Layer 2)agent。

啥是Linux Bridge?

​ Linux Bridge是成熟可靠的Neutron二層網絡虛擬技術,支持local、flat、vlan、vxlan這四種網絡類型,目前不支持gre。

​ Linux Bridge可以將一臺主機上的多個網卡橋接起來,充當一臺交換機,它可以橋接物理網卡,又可以理解爲虛擬網卡,用於橋接虛擬機網卡的是tap設備(一般說是接口),這是一個虛擬機出來的網絡設備,稱爲tap設備,作爲網橋的一個端口,tap接口在邏輯上與物理接口具有相同的功能,可以接收和發送數據包。(具體tap的原理與創建本文暫且不談論太多,瞭解以下設備含義有助於下面的例子)

  1. Tap接口( Tap interface):用於橋接虛擬機的網卡,本質上應該理解爲一個設備,命名例如:tapXXX;
  2. Linux網橋( Linux Bridge):可以理解爲物理網絡中的二層交換機,命名例如: brqxxxx;
  3. VLAN接口( VLAN Interface):在VLAN網絡中用於連接網橋,命名爲 ethx.y(ethx爲物理網卡名稱,y爲VLAN ID);
  4. VXLAN接口( VXLAN Interface):在VXLAN網絡中用於連接網橋,命名爲 vxlana-z(a-z是VNID)
  5. 物理網絡接口:用於連接到物理網絡的硬件接口。

​ 那麼Linux Bridge代理究竟是怎麼處理plugin(ML2)傳遞過來的請求的呢?(注意這裏指的是Linux Bridge)

舉例說一說Linux Bridge是如何實現Neutron網絡

我們舉基於Linux Bridge下flat網絡和vlan網絡來理解,先從flat開始,因爲比較簡單,入手方便大家從本質上理解,而vlan網絡來說,是使用的比較多的一種模式,因此還是需要了解理解一下的。

還是先來理解一下Linux Bridge實現虛擬交換機的原理,雖然比較簡單,但是對於沒有接觸過linux虛擬網絡的朋友而言,下面的內容可能更加沒法理解。參考下圖:

透過現象看本質——談談L2 agent 這回事兒

br0——Linux Bridge,充當虛擬交換機的作用,負責將物理網卡eth0和虛擬網卡tap設備vnet0/vent1連接到同一個二層網絡,實現虛擬機VM1和VM2,以及虛擬機與外網之間的通信(具體的實現過程還是要學習一下網絡虛擬化相關基礎理論和操作來理解的)

(1)基於Linux Bridge的單一flat網絡

透過現象看本質——談談L2 agent 這回事兒

​ 我們知道,flat network是不帶tag的網絡,所以必須要求宿主機的物理網卡直接與Linux網橋連接,這也就表明,每一個flat network都會獨佔一塊兒物理網卡,如上圖所示即,eth1橋接到brqxxxx,從而爲實例提供flat網絡。該圖表示的是單一的flat 網絡,如果是多個flat網絡就需要再添加一個物理網卡eth2了。

​ 當然在一些配置文件中確認或修改一下,例如ML2的配置文件是否支持對應類型等等。這裏不深入探究,明白就好。繼續從橋接到brqxxxxx開始說一下實現flat網絡的原理。對於圖中的kvm如果對其不瞭解,這裏可以暫時忽略KVM(全寫Kernel-based Virtual Machine——基於內核的虛擬機,屬於2型虛擬化,本文這裏不需要深究,如果有興趣可以查閱相關文章資料)

​ Linux Bridge需要和虛擬機實例建立網絡連接,就需要通過一個設備(接口)作爲介質,這個設備(接口)就是tap。其實tap經常與tun一起談及,二者都屬於操作系統內核中的虛擬網絡設備(注意!linux中一切皆文件),只不過tap位於二層,而tun位於三層,而它們之間的差別僅僅在於數據結構封裝中的flag不一樣而已,這也是如何區分它們的方法,但是它們二者所承載的功能相差甚遠。本文篇幅有限,就不繼續深究了。只需要知道tap所對應的數據鏈路層協議爲以太網協議(IEEE 802.3),因此tap設備有時候也被稱爲"虛擬以太設備"。

​ 在Linux系統中(centos7)可以通過下面的命令查看tap有關信息,本文了解即可:

[root@localhost ~]# modinfo tun   #查看是否有tun以及其相關信息
filename:       /lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/net/tun.ko.xz
alias:          devname:net/tun
alias:          char-major-10-200
license:        GPL
author:         (C) 1999-2004 Max Krasnyansky <[email protected]>
description:    Universal TUN/TAP device driver
rhelversion:    7.4
srcversion:     4E9F57A6269CFD0F4BE4021
depends:        
intree:         Y
vermagic:       3.10.0-693.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        DA:18:7D:CA:7D:BE:53:AB:05:BD:13:BD:0C:4E:21:F4:22:B6:A4:9C
sig_hashalgo:   sha256
#顯示如以上信息表明有相關信息
[root@localhost ~]# lsmod | grep tun  #是否已經加載
tun                    31621  1 #出現這些內容則什麼已經加載過了

[root@localhost ~]# modprobe tun  #加載命令
[root@localhost ~]# lsmod | grep tun
tun                    31621  1 

tap實現linux網橋與虛擬機實例之間的網絡通信,構建了整個基於Linux Bridge的單一flat網絡。

但是我們知道flat網絡模式對於多租戶的情況並不友好。所以有了vlan網絡來實現租戶組件網絡的隔離。

(2)基於Linux Bridge 的vlan網絡

​ 其實,基於Linux Bridge實現vlan網絡與前面的flat還是有類似之處的,不同的地方在於flat與vlan本身的不同,前面說過flat network是不帶tag的網絡,而vlan恰好與之相反。先看下圖:

透過現象看本質——談談L2 agent 這回事兒

3個虛擬機實例同樣是通過tap設備連接到brqxxxx的Linux網橋,而右邊的物理網卡eth1就會創建一個名稱爲eth1.100的vlan 接口(100則表示ID號,可以理解爲tag標記),並且與Linux bridge(brqxxxx)相連,這樣,實例通過eth1.100發送的數據包到eth1上就會被打上100的標記。可以聯想一下我們NAT中端口多路複用實現地址轉換的方法來類比理解。

​ 這樣,就創建了一個基於Linux Bridged、vlan100的虛擬網絡,當然這樣的vlan可以劃分多個,例如eth1.101,eth1.102......以此類推,當然需要連接新的Linux Bridge(brqyyyy)。

​ 當每一個vlan 網絡都有自己的網橋,那麼這就實現了基於vlan的網絡隔離。但是這裏需要注意的是,該模式下物理交換機與eth1設備之間相連的口需要做trunk了。

說完Linux Bridge,再來談談Open vSwitch吧。

啥又是Open vSwitch?

​ Open vSwitch Agent是L2 Agent的一種實現。L2 Agent與Neutron的Bridge類型相對應(二層),有多種實現,比如:neutron-linuxbridge-agent、neutron-openvswitch-agent等。

​ 與linux bridge相比,Open vSwitch (可簡稱OVS)具有幾種管控功能,而且性能更加優化,支持更多的功能,目前在openstack領域被稱爲主流。不過對於OVS實現網絡而言理解起來更加複雜,所以先前就先從Linux Bridge入手。

​ OVS支持local、flat、vlan、vxlan、gre、geneve等所有網絡類型。

​ 先來了解一下OVS中的各種網絡設備:

(1)tap interface,命名爲tapXXXX。
(2)linux bridge,命名爲qbrXXXX。
(3)veth pair,命名爲qvbXXXX,qvoXXXX。
(4)OVS integration bridge,命名爲br-int,集成網橋,所有實例的虛擬網卡和其他虛擬網絡設備都連接到該網橋。
(5)OVS patch ports,命名爲int-br-ethX和phy-br-ethX(X爲interface的序號)。
(6)OVS provider bridge,命名爲br-ethX(X爲interface的序號)。
(7)物理interface,命名爲ethX(X爲interface的序號)。
(8)OVS tunnel bridge,命名爲br-tun,隧道(tunnel)網橋,基於隧道技術的 VxLAN 和 GRE 網絡將使用該網橋進行通信

注意:OVS provider bridge會在flat和vlan網絡中使用;OVS tunnel bridge則會在vxlan和gre網絡中使用。

​ 其中,集成網橋br-int在neutron網絡中,通常用來連接Linux網橋和隧道網橋,並且進行不同網絡ID之間的映射轉換。對於不同的網絡模式中,其實現的功能也是不同的。

​ 下面通過基於OVS的vlan網絡結構案例來說明OVS實現網絡的原理過程。

(3)基於OVS的vlan網絡

透過現象看本質——談談L2 agent 這回事兒

​ 筆者PS水平一般,所以從網上截取來一張圖來作爲案例,省點時間,勿怪~^_^!左側是圖例,對應顏色來看哦!

​ 上面三層之間的聯繫不必多說,而中間的veth對是個什麼玩意兒呢?

​ 先來了解一下上圖中的一些小模塊。

1、qbrxxx:Linux網橋(Bridge)設備,qbrxxx位於實例和br-int網橋之間,主要負責網絡安全組(Security Group)規則設置;
2、qvbxxx:Neutron的VETH設備,qvb表示Linux Bridge一側的veth設備,qvb各個字母解釋爲:q-quantum, v-veth, b-bridge(quantum是Neutron的前身);
3、qvoxxx:Neutron的VETH設備,qvo表示OpenVswitch一側的veth設備,qvo各個字母的解釋爲:q-quantum, v-veth, o-openvswitch;

​ 根據網上資料介紹,veth pair是虛擬Ethernet設備,VETH設備總是成對出現,向其一端輸入數據,VETH會改變數據的方向並將其送入內核網絡核心,完成數據的注入,之後在另一端便能讀到此數據。簡單而言,從VETH設備一端輸入的數據總是會從另一端輸出。

​ 因此,在Neutron中,兩個不同網橋之間通常使用VETH對進行數據傳輸。也就是說,Linux網橋與OVS集成網橋之間是提供veth對進行數據傳輸通信的。並且通過端口所分配的vlan ID進行隔離。

​ 再來看OVS集成網橋br-int與OVS供應商網橋之間的PATCH端口,這裏正好可以與前面的Veth pair類比理解,Patch Port兩段連接的也是不同的網橋,其中int-br-eth 1則是集成網橋上的Patch port設備,phy-br-eth 1供應商網橋上的Patch Port設備。而vlan ID在二者之間做轉換,可以類比NAT理解。

​ 從外到內來看,即向上傳輸數據包的時候,vlan id根據flow table做轉換,將外部定義好的id號轉換爲內部使用的vid號,即101——>1,102——>2,而從內到外而言恰好相反。而這塊是真正基於二層代理所配置的部分。

來一個小總結吧

​ 本文主要講述的是通過部分案例介紹有關L2代理中Linux Bridge和OVS基於不同網絡類型實現網絡服務的原理,其中還包括擴展補充了一些Linux虛擬網絡的理論部分知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章