一、背景介紹
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