1. 程式人生 > >openstack-- neutron 二/三層網路實現探究

openstack-- neutron 二/三層網路實現探究

引出

  • Neutron 是openstack 中提供網路虛擬化的元件,根據二層網路的實現方式不同(即agent的不同),可以分為Linux bridge的方式,Openvswitch的方式。而且,lay2 network分為local,flat,vlan,vxlan 等型別(gre與vxlan類似,不再考慮),本文就分析兩種實現方式在這四種網路中的具體實現異同。因為vxlan會依賴lay3層網路,所以還會分析下lay3網路的實現。
  • 本文內容主要來自每天5分鐘玩轉 OpenStack,圖片也是來自對應部落格,本文僅是對其總結對比並作記錄。

lay2 local 型網路

生產環境中,local與flat網路是不會被使用的,vlan與vxlan是使用比較多的layer2網路。因為local網路只支援在同一宿主機的虛擬機器互聯,而flat網路會每個網路獨佔宿主機的一個物理介面,這在現實世界中是不允許的。

但是vlan與vxlan的實現都是在local,flat網路的基礎上實現的,所以還是有必要看一下這兩種型別的網路的實現的。

linux bridge 實現local 型網路

對於每個local network,ML2 linux-bridge agent 會建立一個bridge,instance的tap裝置連線到該bridge。位於同一local network的instance會連線同一個bridge,這樣instance之間就可以通訊了。但因為bridge沒有與宿主機物理網絡卡相連,所以跟宿主機無法通訊,也沒法與宿主機之外的其他機器通訊。下圖為示例:
local-by-linux-bridge

  • 圖中建立了兩個local network,對應兩個網橋。
  • VM1 與 VM2 在同一個 local network中,它們之間可以通訊.
  • VM3 位於另一個 local network,無法與 VM1 和 VM2 通訊。
  • 兩個local network都有自己的DHCP server,由dnsmasq在各自獨立的net namespace實現,通過tap裝置掛接在各自network的bridge上。

openvswitch 實現local 型網路

ovs的實現要相對複雜些,neutron完成相應配置並啟動後,ovs-agent會呼叫ovs自動建立三個ovs bridge,br-ex,br-int和br-tun,看名字大概也可以猜出,br-ex是用於外部網路,br-int是內部虛擬機器的網路,br-tun是用於overlay network,也就是vxlan型別的網路會用到該bridge。local network 只需考慮br-int bridge。示例圖如下:

local-by-ovs

  • 圖中每個instance並不是跟之前一樣通過tap裝置直接掛載在ovs的 br-int上,而是通過一個新建的linux bridge以及一對veth pair跟br-int相連,為什麼這樣做呢,因為Open vSwitch 目前還不支援將 iptables 規則放在與它直接相連的 tap 裝置上,這樣就實現不了Security group,所以就加了一個linux bridge以支援iptables。
  • 兩個local network都有自己的DHCP server,由dnsmasq在各自獨立的net namespace實現,通過tap裝置掛接在各自network的bridge上。
  • 都掛載在同一個br-int上,如何區分不同的local network呢,其實,br-int上掛載的虛擬網絡卡或DHCP對應的port都有一個特殊的tag屬性。同一網路的tag相同,不同網路的tag不同,這裡跟vlan的vlan ID類似,同一tag屬性的port是二層連通的。
    port-tag

lay2 flat 型網路

flat型網路是在local 型網路的基礎上實現不同宿主機的instance之間二層互聯。但是每個flat network都會佔用一個宿主機的物理介面,所以生產環境中也不會使用。

linux bridge 實現flat 型網路

每一個flat network對應一個物理網絡卡,該對應關係需要在ml2_conf.ini配置檔案中指明。下圖為flat network示例:

linux-bridge-flat-net

  • 該 flat network 在計算和控制節點都使用eth1作為介面。如果是新建另一個flat network,只能使用除eth1之外的其他物理介面,且在配置檔案中新增相應的mapping配置。
  • 同一網路,不同宿主機上的Linux bridge 名稱是一樣的。
  • 只在控制節點有DHCP的裝置,因為同一網路只使用一個DHCP server。
  • 其他跟local network類似。

openvswitch 實現flat 型網路

同linux bridge實現的flat network一樣,每一個flat network會佔用一個物理介面,需要在配置檔案ml2_conf.ini中指定對應關係,這裡,需要利用ovs新建一個ovs bridge,將該bridge掛載對應物理介面。下圖為flat network 示例:

ovs-flat-net

  • br-eth1就是我們新建的ovs bridge,為什麼要新建一個ovs bridge與物理網絡卡連線,而不是直接用br-int與物理網絡卡連線呢,因為我們在配置檔案中需要配置的是某一flat network 的label(flat network type,就是一個標識)與ovs-bridge的mapping,如果是直接用br-int與物理網絡卡連線的話,那麼當建立多個flat-network的時候,br-int與多個物理網絡卡相連,br-int是無法辨識的。而linux bridge實現flat network的時候是不同的linux bridge與不同的物理網絡卡連線。
  • 當再新建一個flat network 的時候需要再新建一個ovs bridge,連線另一網絡卡, 並於配置檔案指定mapping。
  • 這裡出現了一種新型的網路裝置叫做patch port,就是br-eth1與br-int相連的裝置,與veth pair的功能類似,只不過這種裝置只適用於兩個ovs bridge之間互聯。
  • 只在控制節點有DHCP的裝置,因為同一網路只使用一個DHCP server。
  • br-int內不同網路的區分跟local network一樣,也是通過tag實現。

lay2 vlan 型網路

linux bridge 實現vlan 型網路

vlan network是在flat network的基礎上實現多個不同的vlan network 共用同一個物理介面。需要在配置檔案中指定vlan的範圍(租戶的網路id 範圍),以及 vlan network 與物理網絡卡的對應關係。
vlan network如下示例:

vlan-linux-bridge

  • 可以看出,bridge上除了掛載instance的tap,dhcp的tap裝置外,還掛載了一個vlan interface eth1.10x ,該vlan interface 便是區分不同vlan的關鍵。每一個vlan network有一個對應的vlan id,該vlan id 對應相應數字的vlan interface。
  • 上圖所示,有兩個vlan,vlan 100 和vlan 101,vm1 與 vm2 在同一網路vlan100,是可以聯通的,vm3 與vm1,vm2不連通。

openvswitch 實現vlan 型網路

  • 配置檔案指定tenant網路型別,以及vlan id範圍,對應的ovs bridge mapping。
  • 與 Linux Bridge driver 不同,Open vSwitch driver 並不通過 eth1.100, eth1.101 等 VLAN interface 來隔離不同的 VLAN。所有的 instance 都連線到同一個網橋 br-int。Open vSwitch 通過 flow rule(流規則)來指定如何對進出 br-int的資料進行轉發,進而實現 vlan 之間的隔離。
    vlan network如下示例:

vlan-ovs-network

  • 乍一看,跟ovs 實現的flat network差不多,不過該圖示有兩個vlan network,都通過br-eth1與外界宿主機的instance聯通。
  • 下面看下Open vSwitch 如何通過 flow rule(流規則)進行vlan 的隔離。通過 ovs-ofctl dump-flows $BRIDGE 命令檢視指定bridge 的flow rule。
    flow-rule
    簡單解釋下:每一行代表一條rule,priority代表該rule的優先順序,值越大優先順序越高,in_port代表傳入資料的port編號,每個port在ovs bridge中 都會有一個編號,可以通過 ovs-ofctl show $BRIDGE 命令檢視 port 編號。
    port-num
    如上圖:eth1 編號為 1;phy-br-eth1 編號為 2。
    dl_vlan是資料包原始的 VLAN ID,actions表示對資料包進行的操作。
    那麼第一條rule表示的意思就是:從 br-eth1 的埠 phy-br-eth1(in_port=2)接收進來的包,如果 VLAN ID 是 1(dl_vlan=1),那麼需要將 VLAN ID 改為 100(actions=mod_vlan_vid:100。為什麼要轉換呢,之前講local/flat network時講過, br-int為了區分不同網路會給掛載的裝置打上tag,這裡的tag就類似vlan id,不過是僅限於br-int可以識別,宿主機之外是無法識別的,所以需要將該tag轉換為外界可以識別的vlan id。
    再看下br-int 的flow rule:
    br-int-flow-rule

圖中圈出來的第一條rule的意思就是:從int-br-eth1接收進來的資料包,如果 VLAN 為 100,則改為內部 VLAN 1。
其他rule分析類似。

lay3 網路

lay3 網路主要是一個路由的功能,即實現兩個不同subnet之間instance的互聯。除此之外,與外網的互聯,firewall以及instance attach floating-ip 等功能也都是由L3 agent實現的虛擬路由器(net namespace + iptables)完成的。

linux bridge 實現lay3 網路

首先需要修改配置檔案,啟用 l3 agent,配置檔案位於控制節點/網路節點的/etc/neutron/l3_agent.ini,mechanism driver 是linux bridge(或openvswitch)。
建立一個router後,如下示例:

router-ex

看一下router是如何連線兩個vlan 的subnet: l3 agent 會為每個 router 建立了一個 namespace,通過 veth pair 與 TAP 相連,然後將 Gateway IP 配置在位於 namespace 裡面的 veth interface 上,這樣就能提供路由了。
router-namespace
這樣便實現 vlan100 和 vlan 101 的連通了。

再簡單說下flaoting-ip attach的實現原理,floating-ip 的出現是為了讓外網能夠直接訪問到被attached的instance。
floating-ip
如圖,是有兩個內部vlan network和一個external network(網路型別可能是flat或vlan),一個虛擬路由器將這三個網路連在一起,vm1通過虛擬路由器可以訪問外網,但是外網沒法直接主動連線vm1.我們將一個flaoting-ip 如10.10.10.3,attach到vm1之後,發現外網可以通過該floating-ip 直接連線vm1.進入vm1,看下它的網絡卡配置,發現並沒有floating-ip對應的網絡卡存在。怎麼回事呢,其實真正實現floating-ip attach操作的是發生在虛擬路由器上,檢視下對應的虛擬路由器的網絡卡,
router-interface

再看下虛擬路由器iptables的nat配置,
router-iptables

這樣,便明白了,floating IP 是配置在 router 的外網 interface 上的,而非 instance,floating IP 能夠讓外網直接訪問租戶網路中的 instance,這是通過在 router 上應用 iptalbes 的 NAT 規則實現的。

openvswitch 實現lay3 網路

與linux bridge 的實現類似,只不過這裡不是掛載在不同bridge上,而是直接掛載在br-int上。

ovs-layer3-net

兩個 Gateway IP 分別配置在 qr-2ffdb861-73 和 qr-d295b258-45 上,從而實現兩個subnet的連線。
floating-ip attach 與Linux bridge類似實現。

lay2 vxlan 型網路

除了local, flat, vlan 這幾類網路,OpenStack 還支援 vxlan 和 gre 這兩種 overlay network。所謂overlay,是指指建立在其他網路上的網路,比如vxlan就是在udp的基礎上實現。 vxlan 和 gre 都是基於隧道技術實現的。目前 linux bridge 只支援 vxlan,不支援 gre;open vswitch 兩者都支援。因為vxlan與gre類似,這裡只討論vxlan。
VXLAN 提供與 VLAN 相同的乙太網二層服務,但是擁有更強的擴充套件性和靈活性。與 VLAN 相比,VXLAN 有下面幾個優勢:

  1. 支援更多的二層網段。 VLAN 使用 12-bit 標記 VLAN ID,最多支援 4094 個 VLAN,這對於大型雲部署會成為瓶頸。VXLAN 的 ID (VNI 或者 VNID)則用 24-bit 標記,支援 16777216 個二層網段。
  2. 能更好地利用已有的網路路徑。 VLAN 使用 Spanning Tree Protocol 避免環路,這會導致有一半的網路路徑被 block 掉。VXLAN 的資料包是封裝到 UDP 通過三層傳輸和轉發的,可以使用所有的路徑。
  3. 避免物理交換機 MAC 表耗盡。 由於採用隧道機制,TOR (Top on Rack) 交換機無需在 MAC 表中記錄虛擬機器的資訊。

VXLAN 是將二層建立在三層上的網路。 通過將二層資料封裝到 UDP 的方式來擴充套件資料中心的二層網段數量。 VXLAN 是一種在現有物理網路設施中支援大規模多租戶網路環境的解決方案。 VXLAN 的傳輸協議是 IP + UDP。

VXLAN 定義了一個 MAC-in-UDP 的封裝格式。 在原始的 Layer 2 網路包前加上 VXLAN header,然後放到 UDP 和 IP 包中。 通過 MAC-in-UDP 封裝,VXLAN 能夠在 Layer 3 網路上建立起了一條 Layer 2 的隧道。

關於 vxlan 的包格式以及相關的裝置的,參考VXLAN 概念(Part I) - 每天5分鐘玩轉 OpenStack(108)

linux bridge 實現vxlan 網路

VXLAN 概念(Part II)- 每天5分鐘玩轉 OpenStack(109)

ovs 實現vxlan 網路

OVS vxlan 底層結構分析 - 每天5分鐘玩轉 OpenStack(148)

本篇文章由pekingzcc採用知識共享署名-非商業性使用 4.0 國際許可協議進行許可,轉載請註明。

END