上一篇文章已經介紹過,在集中式網絡節點模式下,全部的計算節點只安裝二層代理,全部三層流量不管是南北或東西走向都必須通過網絡節點,儘管能夠經過HA的方式保證網絡節點的高可用,可是基於vrrp的HA方式同一時間點只有一個網絡節點處於工做狀態,這樣在大規模場景下網絡節點仍然會成爲性能瓶頸,爲此openstack社區從Juno版本開始推出的DVR模式來解決上述問題,須要說明的是:在Mitaka版本以前DVR與L3 HA功能不能同時啓用,從Mitaka版本以後才支持DVR與L3 HA功能同時開啓。 linux
爲了解決網絡節點的流量瓶頸問題,DVR經過在計算節點部署L3 Agent,讓不一樣subnet之間的東西流量和綁定floating ip的vm的南北流量直接經過計算節點訪問外網,只有未綁定floating ip的vm的南北南北流量才須要經過網絡節點SNAT訪問外網,此時的集羣架構以下圖所示:
不一樣於集中式網絡節點中全部計算節點只走二層流量,DVR模式下,每一個計算節點均可以走3層流量,以此來分攤網絡節點的流量壓力。 安全
DVR模式下,網絡節點內部組件此時以下圖所示:
能夠看到,啓用DVR模式後的網絡節點多了一個SNAT Namespace空間。在在全部計算節點都開啓DVR功能時,Router Namespace中的Metadata Agent只負責處理Project網絡中的元數據,SNAT Namespace空間負責對只有fix ip的vm經過源地址轉換的方式訪問外網。若是全部的計算節點將DVR模式關閉,此時vm的流量和集中式網絡節點一致,即全部的三層流量都須要通過網絡節點的Router Namespace處理。 網絡
當開啓DVR功能後,此時計算節點內部組件以下圖所示:
啓用DVR功能的計算節點由於部署了L3 Agent組建,因此擁有Distribute Router NameSpace,而且當建立vm時,還會自動生成fip名稱空間,全部計算節點的Distribute Router NameSpace徹底一致,名稱空間接口的ip和mac地址也同樣(初始化時全部計算節點的名稱空間都是源自網絡節點的副本),瞭解網絡的都知道,同一時間同一網絡中ip與mac地址要一致,不然交換經過反覆mac地址學習到的arp表條目會有衝突,爲了解決這一問題,DVR結構爲每一個運行L3 Agent的計算節點指定全局惟一的mac地址(dvr_host_mac)。 架構
相同subnet下vm之間的流量走向與集中式網絡節點相似,此處不在贅述,下面以不一樣subnet之間vm的vxlan流量走向爲例進行說明,此時vm間流量走向以下圖所示:
1.位於compute1中的vm1向compute2中的vm2發出請求。此時源/目的ip爲vm1/2的ip地址,源/目的mac地址爲vm1與網關qr-1的mac地址。
2.報文通過linux bridge進行iptables安全檢查,而後送往br-int。
3.進入br-int上的報文被打上內部vlan號並送往vm1的網關qr-1,qr-1接口上配置vm1的網關地址,經查表報文從qr-2口流出,qr-2接口設置vm2的網關地址。
4.從qr-2口出來的報文,此時源/目的ip爲vm2網關(qr-2)的ip和vm2的ip地址,源/目的mac爲qr-2口mac和vm2的mac地址,並將報文進入br-tun。
5.報文在br-tun交換機上將源mac地址(qr-2)換爲全局惟一mac地址(dvr_host_mac),而後進行vxlan封裝,離開compute1。
6.報文到達compute2後首先vxlan解封裝,而後再將源mac地址(dvr_host_mac)換爲vm2網關(qr-2)mac地址,送往br-int並在br-int交換機打上內部vlan號。
7.報文脫掉內部vlan號,進入linux bridge,進行安全策略檢查。
8.最終數據報文達到vm2。
vm2數據報文返回的過程與數據報文到達vm2的過程一致,再也不贅述。 ide
vm南北流量分爲floating ip和fix ip兩種狀況,對這兩種狀況分別進行說明: 性能
沒有綁定floating ip的vm在訪問外網時須要經過網絡節點的SNAT Router NameSpace進行地址轉換,其流量走向以下圖所示:
1.vm向外網發起請求,數據報文送往linux bridge。
2.進入linux bridge的數據報文通過iptables安全策略檢查後將報文送往br-int,此時打上內部vlan號。
3.數據報文從br-int送往Router NameSpace的qr口,該接口配置了vm的網關地址,在Router NameSpace內對Snet NameSpace的sg口的mac地址進行解析,sg接口爲vm所在子網的接口,該接口上的ip地址與vm在同一網段。而後將報文送往br-tun。
4.數據報文進入br-tun後脫掉內部vlan號,進行vxlan封裝,打上vni號,離開conpute1.
5.數據報文進入Network節點,脫掉vni號,進行vxlan解封裝,送往br-int交換機,進入br-int交換機後打上內部vlan號。
6.數據報文進入sg後,進行路由查表,將數據發往fg口,fg口上配置的是可被路由的公網ip。
7.數據報文在fg口上進行SNAT地址轉換,轉換後的源ip地址爲fg口上配置的公網ip訪問公網。 學習
啓用DVR功能後每臺計算節點主機都安裝了L3 Agent,綁定了floating ip的vm再也不須要繞行到網絡節點,直接由計算節點主機訪問呢公網,其流量走向以下圖所示:
1.vm向外網發起訪問,因爲vm是provider類型的私網地址,因此首先要去找vm地址所在的網關。
2.數據報文通過linux bridge和br-int後進入Distribute NameSpace的qr口,該接口配置的ip地址爲vm的網關地址。
3.數據報文從qr口流出,進入rfp口,該接口上配置有2個ip地址,其中3爲vm綁定的floating ip地址,在此處進行SNAT地址轉換,外網流量訪問vm時在此名稱空間利用iptables作DNAT地址轉換。
4.經過qrouter與fip內部通訊的直鏈接口(4),接口地址由L3 Agent自行維護,ip爲169.254.x.x/31格式,將數據包發往fip名稱空間。
5.fip空間的直鏈接口fpr接收到數據包後,轉發給外網網關fg口。
6.fip名稱空間外網網關接口將數據包發到br-ex交換機最後經過物理網卡訪問internet,外網訪問vm的數據流向爲該過程的逆方向,此處再也不贅述。 spa
針對使用floating ip的數據包進出時須要注意的地方是:
1.fg接口上會額外配置一個外網ip地址,這也是爲何公有云場景下不會將vm外網ip直接設置成公網ip地址的緣由,由於每一個計算主機都須要一個額外的地址做爲fg網關地址。
2.當外部網絡訪問vm時,請求的ip地址是qrouter名稱空間中rfp接口上作SNAT的ip地址,但此時fg接口會響應rfp接口上外網ip的arp地址解析請求,因此一般認爲fg接口是floating ip的arp代理接口。 代理
經過前文得知,開啓DVR模式下的網絡節點只是針對沒有綁定floating ip的vm進行SNAT地址轉換,而且qrouter名稱空間只處理元數據,因此不一樣於傳統L3 HA對Router NameSpace的高可用,DVR下的L3 HA是對SNAT NameSpace進行的高可用,仍採用vrrp實現,以下圖所示:
從部署結構來看,分別要對SNAT外網ip地址和子網接口ip地址作高可用,因此當使用keepalive時,此時架構以下圖所示: router