OpenStack中的VM流量走向——集中式網絡節點


一、背景介紹

  OpenStack被廣大公有雲廠商所采用,對於公有雲場景來說,Neutron組件所提供的網絡功能,一直是較難理解的部分,本文介紹了在OpenStack集中式網絡節點架構下,vm的東西向和南北向流量的實現

二、網絡節點功能

  OpenStack默認部署模式下,計算節點通過ml2插件實現二層互通,所有三層流量都要經過網絡節點,如下圖所示

  圖中同一個tenant下有兩個不同的子網,vm1/2和vm3/4分別屬於不同的subnet,通過上圖可以看出不同子網之間通信,以及未綁定fip的vm與公網間通信,和擁有fip的vm通過公網訪問都需要經過網絡節點,網絡節點存在單點隱患,對此需要通過L3 HA來對該節點進行高可用

三、OpenStack中的網絡類型

  OpenStack中的網絡模式分為兩種:provider網絡和self-service網絡。provider是一個半虛擬化的二層網絡架構,只能通過橋接的方式實現,處於provider網絡模式下vm獲取到的ip地址與物理網絡在同一網段,可以看成是物理網絡的擴展,在該模式下,控制節點不需要安裝L3 Agent,也不需要網絡節點,vm直接通過宿主機的NIC與物理網絡通信,provider網絡只支持flat和vlan兩種模式。其架構如下

  而self-service模式允許租戶自己創建網絡,最終租戶創建的網絡借助provider網絡以NAT方式訪問外網,所以self-service模式可以看成是網絡層級的延伸,要實現self-service模式必須先創建provider網絡,self-service網絡支持flat、vlan、vxlan、gre模式。其架構如下

  vm從self-service獲取到的ip地址稱為fix ip,vm從provider網絡獲取到的ip地址稱為floating ip。不管租戶創建的網絡類型是vxlan或者vlan(br-tun或者br-vlan)租戶vm之間通過fix ip之間的互訪流量稱為東西走向,只有當vm需要通過snat訪問外網或者從通過fip訪問vm時,此時的流量稱為南北走向

四、網絡節點內部組件

  相對於計算節點,網絡節點多了租戶的DHCP和router空間和連接internet的bt-ex(計算節點同樣擁有br-int和br-tun/vlan的OVS),網絡節點的內部組件通信如下圖所示

  從上圖得知:fix ip最終需要借助router namespace中的iptables規則,以SNAT或者DNAT的方式實現vm訪問外網或者被外網訪問。當然也可以讓vm直接接入provider網絡,但provider網絡只是一個二層的虛擬化網絡,需要借助物理設備來實現三層及以上功能。以下就以self-service模式為例,詳細說明vm的東西和南北流量走向

五、vm的東西流量分析

  通過前面分析可知,一個tenant可以創建多個subnet,此時vm之間的通信就分為同一個subnet和不同subnet之間兩種情況,區別就是,不同subnet之間的通信需要經過網關(網絡節點),而同subnet之間的通信不需要經過網絡節點

  1.不同subnet之間的通信

  無論tenant創建的網絡類型是隧道還是vlan,不同subnet之間的通信必須借助L3 Agent完成,而在集中式網絡節點架構中,只有網絡節點部署了L3 Agent,vm之間的流量如下圖所示

  1.vm1向vm2發出通信請求,根據目的IP地址得知vm2和自己不在同一網段,將數據包送往網關

  2.數據包經過linux bridge通過其上的iptables安全策略檢查,隨后送往br-int並打上內部vlan號

  3.數據包脫掉bt-int的內部vlan號進入br-tun/br-vlan

  4.進入br-tun的數據包進行vxlan封裝並打上vni號,進入br-vlan的數據包此時打上外部vlan號,通過nic離開compute1

  5.數據包進入網絡節點,經過br-tun的數據包完成vxlan的解封裝去掉vni號,經過br-vlan的數據包去掉vlan號

  6.數據包進入br-int,此時會被打上內部vlan號

  7.進入router namespace路由空間找到網關,vm1的網關配置在此路由器接口qr-1上

  8.將數據包路由到vm2的網關,vm2的網關配置在qr-2上,送回br-int並打上內部vlan號

  9.數據包脫掉br-int的內部vlan號進入br-tun/br-vlan

  10.進入br-tun的數據包進行vxlan封裝並打上vni號,進入br-vlan的數據包打上外部vlan號,通過nic離開網絡節點

  11.數據包進入compute2,經過br-tun的數據包完成vxlan的解封裝去掉vni號,經過br-vlan的數據包去掉vlan號

  12.數據包進入br-int,此時會被打上內部vlan號

  13.數據包經過離開br-int並去掉內部vlan號,送往linux bridge通過其上的iptables安全策略檢查

  14.最后數據包送到vm2

  2.相同subnet間通信

  相同subnet之間通信不需要借助L3 Agent,vm之間流量如下圖所示

  1.vm1向vm2發起請求,通過目的ip地址得知vm2與自己在同一網段

  2.數據包經過linux bridge,進行安全策略檢查,進入br-int打上內部vlan號

  3.數據包脫掉br-int的內部vlan號進入br-tun/br-vlan

  4.進入br-tun的數據包此時vxlan封裝並打上vni號,進入br-vlan的數據包此時打上外部vlan號,通過nic離開compute1

  5.數據包進入compute2,經過br-tun的數據包完成vxlan的解封裝去掉vni號,經過br-vlan的數據包去掉vlan號

  6.數據包進入br-int,此時會被打上內部vlan號

  7.數據包經過離開br-int並去掉內部vlan號,送往linux bridge通過其上的iptables安全策略檢查

  8.最后數據包送到vm2

六、vm的南北流量分析

  南北流量也分為有floating ip和無floating ip(fix ip)兩種情況,唯一的區別在於vm最終離開network node訪問internet時,有floating ip的vm源地址為floating ip,而使用fix ip的vm通過SNAT方式,源地址為網絡節點的ip,vm南北流量如下圖所示

 

  1.vm1向公網發出通信請求,數據包被送往網關

  2.數據包經過linux bridge通過其上的iptables安全策略檢查,按后送往br-int並打上內部vlan號

  3.數據包脫掉br-int的內部vlan號進入br-tun/br-vlan,進入br-tun的數據包此時進行vxlan封裝並打上vni號,進入br-vlan的數據包此時打上外部vlan號

  4.數據包進入網絡節點,經過br-tun的數據包完成vxlan的解封裝去掉vni號,經過br-vlan的數據包去掉外部vlan號,再被送往br-int,此時會被打上內部vlan號

  5.進入router namespace路由空間查詢路由表項,vm1的網關配置在此路由器qr接口上

  6.數據包在此路由器上完成地址轉換,源地址變成qg口網絡節點的外網地址(floating ip在qg口使用的是給vm分配的外網地址,需要提前將fix ip和floating ip綁定),送回br-int並打上內部vlan號

  7.數據包離開br-int進入br-ex,脫掉內部vlan號,打上外網ip的vlan號

  8.最后借助provider網絡訪問公網,此處也印證了provider網絡只能是vlan或flat類型

七、網絡節點HA

  通過前文得知整個架構的三層通信需要借助安裝在網絡節點的L3 Agent來完成,這樣,網絡節點在架構中就成了單點隱患,為了解決這個問題,需要對網絡節點做高可用,L3 Agent實現HA的方式是利用keepalived的vrrp協議提供一個vip,同時在br-int和router上增加一個HA接口,以實現心跳傳遞,此時網絡節點的內部組件通信如下圖所示

  從部署結構來看,route namespace的接口上分別是subnet的網關地址和外網地址(floating ip地址),所以當使用keepalived此時網絡節點架構如下圖所示

鏈接:https://blog.51cto.com/arkling/2406590


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM