當前位置:
首頁 > 最新 > OpenStack-Neutron的網路實現方式-flat網路

OpenStack-Neutron的網路實現方式-flat網路

flat network 是不帶 tag 的網路,要求宿主機的物理網卡直接虛擬網路相連,這意味著:每個 flat network 都會獨佔一個物理網卡。

上圖中 ens34 橋接到 brqXXX,為 instance 提供 flat 網路。如果需要創建多個 flat network,就得準備多個物理網卡。

Linuxbridge下的flat網路實現

如何配置 flat 網路?

在 /etc/neutron/plugins/ml2/ml2_conf.ini 設置 flat network 相關參數。

如上所示:

1. 在[ml2_type_flat]中通過 flat_networks 定義了一個 flat 網路,label 為 「default」。

2. 在[linux_bridge]中通過 physical_interface_mappings 指明 default 對應的物理網卡為 ens33。

理解 label 與 ensX 的關係

label 是 flat 網路的標識,在創建 flat 時需要指定 label(後面演示)。label 的名字可以是任意字元串,只要確保各個節點 ml2_conf.ini 中的 label 命名一致就可以了。

各個節點中 label 與物理網卡的對應關係可能不一樣。這是因為每個節點可以使用不同的物理網卡將 instance 連接到 flat network。

例如對於 label 為 「default」 的 flat network,節點 A 可能使用 ens33,配置為:

physical_interface_mappings = default:ens33

而節點 B 則可能使用 ens34,配置為:

physical_interface_mappings = default:ens34

支持多個 flat

如果要創建多個 flat 網路,需要定義多個 label,用逗號隔開,當然也需要用到多個物理網卡,如下所示:

[ml2_type_flat]

flat_networks = flat1,flat2

[linux_bridge]

physical_interface_mappings = flat1:ens33,flat2:ens34

下面通過實例來驗證。

(1)創建一個flat網路llb_flat,標籤為default,子網段cidr為30.10.20.0/24,DHCP Server的IP地址為30.10.20.10.如下所示:

(2)我們看下底層網路有啥變化。如下所示

底層網路多個一個網橋brq9ebe9172-2b,同時其上掛載了一個tap設備tapcfe0f423-1f和一個物理網卡設備ens33。從前面local network的分析我們知道,網橋brq9ebe9172-2b對應的就是我們的flat network,tapcfe0f423-1f設備是DHCP Server在root namespace的veth interface。同時,本節前面flat網路介紹可知,每個flat網路都要綁定一個物理網卡,因此這裡綁定的就是ens33這個設備,與配置結果一致。此時的網路拓撲如下:

(3)此時我們創建兩個虛機FLAT_VM1和FLAT_VM2,為其配置為FLAT網路模式,如下

FLAT-VM1和FLAT_VM2通過DHCP拿到的地址分別為30.10.20.13和30.10.20.16。此時底層網路的變化如下:

多了兩個tap設備,分別對應兩個虛機VM的虛擬網卡VIF,其他分析可以參考local network部分,這裡不再贅述。

此時我們的網路拓撲如下:

因為兩個VM同屬於同一個Network和Subnet,自然他們在2層和3層可以互通,留給大家去驗證。

虛機VM如何通過DHCP Server獲得IP?

前面章節我們看到 instance 在啟動過程中能夠從 Neutron 的 DHCP 服務獲得 IP,現在我們詳細討論其內部實現機制。Neutron 提供 DHCP 服務的組件是 DHCP agent。DHCP agent 在網路節點運行上,默認通過 dnsmasq 實現 DHCP 功能。

DHCP agent 的配置文件位於 /etc/neutron/dhcp_agent.ini。

dnsmasq_local_resolv

置為true,即使用 dnsmasq 實現 DHCP。

interface_driver

使用 linux bridge 連接 DHCP namespace interface。

當創建 network 並在 subnet 上 enable DHCP 時,網路節點上的 DHCP agent 會啟動一個 dnsmasq 進程為該 network 提供 DHCP 服務。

dnsmasq 是一個提供 DHCP 和 DNS 服務的開源軟體。dnsmasq 與 network 是一對一關係,一個 dnsmasq 進程可以為同一 netowrk 中所有 enable 了 DHCP 的 subnet 提供服務。

DHCP agent 會為每個 network 創建一個目錄 /etc/data/neutron/dhcp/,用於存放該 network 的 dnsmasq 配置文件。

下面討論 dnsmasq 重要的啟動參數:

--dhcp-hostsfile

存放 DHCP host 信息的文件,這裡的 host 在我們這裡實際上就是虛機VM。dnsmasq 從該文件獲取 虛機VM的 IP 與 MAC 的對應關係。每個 虛機VM 對應一個條目,信息來源於 Neutron 資料庫。

--interface

指定提供 DHCP 服務的 interface。dnsmasq 會在該 interface 上監聽 instance 的 DHCP 請求。

對於llb-flat1,interface 是 ns-cfe0f423-1f。或許大家還記得,之前我們看到的 DHCP interface 叫 tapcfe0f423-1f,並非 ns-cfe0f423-1f。從名稱上看,ns-cfe0f423-1f 和 tapcfe0f423-1f 應該存在某種聯繫,但那是什麼呢?答案就是 Linux Network Namespace

在二層網路上,VLAN 可以將一個物理交換機分割成幾個獨立的虛擬交換機。類似地,在三層網路上,Linux network namespace 可以將一個物理三層網路分割成幾個獨立的虛擬三層網路。(詳見資源隔離機制章節)。

Neutron 通過 namespace 為每個 network 提供獨立的 DHCP 和路由服務,從而允許租戶創建重疊的網路。如果沒有 namespace,網路就不能重疊,這樣就失去了很多靈活性。

在創建 VM 時,Neutron 會為其分配一個 port,裡面包含了 MAC 和 IP 地址信息。這些信息會同步更新到 dnsmasq 的 host 文件。

同時 nova-compute 會設置虛機VM的 VIF 的 MAC 地址。(詳見local network部分介紹)

一切準備就緒,VM獲取 IP 的過程如下:

1. 虛機VM開機啟動,發出 DHCPDISCOVER 廣播,該廣播消息在整個Network 中都可以被收到。

2. 廣播到達 veth interface的 tap設備,然後傳送給 veth pair 的另一端 ns設備。dnsmasq 在它上面監聽,dnsmasq 檢查其 host 文件,發現有對應項,於是dnsmasq 以 DHCPOFFER 消息將 IP、子網掩碼、地址租用期限等信息發送給 虛機VM。

3. 虛機VM 發送 DHCPREQUEST 消息確認接受此 DHCPOFFER。

4. dnsmasq 發送確認消息 DHCPACK,整個過程結束。

整個過程流程如下:

OVS下的flat網路實現

與Linuxbridge下flat網路配置不同的是,ovs下flat網路物理網路映射在openvswithc_agent.ini文件的[ovs]部分,如下所示

在 [ml2_type_flat] 中通過 flat_networks 定義了2個 flat 網路,label 分別為 「provider」和「public」。

在 [ovs] 中通過 bridge_mappings 指明public 對應的 Open vSwitch 網橋為 br-ex。這裡lable和物理網路映射關係同linuxbridge下的flat網路實現。但是與 linux bridge 實現的 flat 網路不同,ml2 中並不會直接指定 label 與物理網卡的對應關係,而是指定 label 與 ovs bridge 的對應關係。

這裡的 ovs bridge 是 br-ex,我們需要提前通過 ovs-ovctl 命令:

創建 br-ex。ovs-vsctl add-br br-ex

將物理網卡 ens35 橋接在 br-ex 上。ovs-vsctl add-port br-ex ens35

通過命令可知,綁定物理網卡,其實就是給br-ex網橋增加一個埠port。結果如下圖所示

對於 ovs bridge 「br-ex」 和其上橋接的 port 「ens35」 我們應該不會感到意外,這是前面配置的結果。然而除此之外,br-int 和 br-ex 分別多了一個 port 「int-br-ex」 和 「phy-br-ex」,而且這兩個 port 都是 「patch」 類型,同時通過 「peer」 指向對方。上面的配置描述了這樣一個事實:br-int 與 br-ex 這兩個網橋通過 int-br-ex 和 phy-br-ex 連接在一起了。如下圖所示

此時網路節點的邏輯拓撲如下:

veth pair VS patch port

通過前面的分析我們可知 veth pair 和 patch port 都可以連接網橋,使用的時候如何選擇呢?答案是patch port 是 ovs bridge 自己特有的 port 類型,只能在 ovs 中使用。如果是連接兩個 ovs bridge,優先使用 patch port,因為性能更好。

所以:

1. 連接兩個 ovs bridge,優先使用 patch port。技術上veth pair 也能實現,但性能不如 patch port。

2. 連接 ovs bridge 和 linux bridge,只能使用 veth pair。

3. 連接兩個 linux bridge,只能使用 veth pair。

OVS下實現的flat的網路和linuxbridge下實現flat網路區別就是上面描述的這些,其餘方式和linuxbridge下一樣。大家可以嘗試參照前面linuxbridge的方式,自己在不看教程的情況下實踐一次。如果實在搞不定,可以先看後面的VLAN部分(因為這兩種網路都需要和物理網卡綁定)再回過頭來做OVS下flat網路的實踐,也可以直接微信諮詢我。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CloudSupermanLLB 的精彩文章:

OpenStack-Neutron的資源隔離機制
OpenStack-Neutron的資源模型

TAG:CloudSupermanLLB |