您好,登錄后才能下訂單哦!
openstack被廣大公有云廠商所采用,對于公有云場景來講Newtron組件所提供的網絡功能,一直是較難理解的部分,本文詳細介紹在openstack集中網絡節點架構下,vm的南北向與東西向流量實現。
由于openstack默認部署模式下,計算節點通過ml2插件實現二層互通,所有三層流量都要經過網絡節點,如下圖所示:
圖中同一tenant下有2個不同子網,vm1/2和vm3/4分別屬于不同的subnet,通過上圖可以看出不同子網之間通信,以及未綁定fip的vm與公網間通信,和擁有fip的vm通過公網訪問都需要經過網絡節點,網絡節點存在單點隱患,對此需要通過L3 HA來對該節點進行高可用。
openstack中網絡模式分為2種: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的br-ex(計算節點同樣擁有br-int和br-tun/vlan的OVS,詳見作者其他博文),
網絡節點的內部組件通信如下圖所示:
從上圖得知:fix ip最終需要借助router namespace中的iptables規則,以sant或dnat的方式實現vm訪問外網或被外網訪問。當然也可以讓vm直接接入provider網絡,但provider網絡只是一個二層的虛擬化網絡,需要借助物理設備來實現三層及以上功能。以下就以self-service模式為例,詳細說明vm的東西和南北流量走向。
通過前面知道,一個tenant可以創建多個subnet,此時vm之間的通信就分為同一個subnet和不同subnet之間兩種情況,區別就是,不同subnet之間的通信需要經過網關(網絡節點),而同subnet之間的通信不需要經過網絡節點。
無論tenant創建的網絡類型是隧道還是vlan,不同subnet之間的通信必須借助L3 Agent完成,而在集中式網絡節點架構中,只有網絡節點部署了該角色,vm之間的流量如下圖所示:
1.vm1向vm2發出通信請求,根據目的IP地址得知vm2和自己不在同一網段,將數據包送往網關。
2.數據包經過linux bridge通過其上的iptables安全策略檢查,按后送往br-int并打上內部vlan號。
3.數據包脫掉br-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離開network node。
11.數據包進入compute2,經過br-tun的數據包完成vxlan的解封裝去掉vni號,經過br-vlan的數據包去掉vlan號。
12.數據包進入br-int,此時會被打上內部vlan號。
13.數據包經過離開br-int并去掉內部vlan號,送往linux bridge通過其上的iptables安全策略檢查。
14.最后數據包送到vm2。
相同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。
南北流量也分為有floating ip和無floating ip(fix ip)兩種情況,唯一的區別在于vm最終離開network node訪問internet時,有floating ip的vm源地址為floating ip,而使用fix ip的vm通過snat方式,源地址為network node的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號,通過nic離開compute1。
4.數據包進入網絡節點,經過br-tun的數據包完成vxlan的解封裝去掉vni號,經過br-vlan的數據包去掉vlan號,再被送往br-int,此時會被打上內部vlan號。
5.進入router namespace路由空間查詢路由表項,vm1的網關配置在此路由器qr接口上。
6.數據包在此路由器上完成地址轉換,源地址變成qg口network node節點的外網地址(floating ip在qg口使用的是給vm分配的外網地址,需要提前將fix ip和floating ip綁定),送回br-int并打上內部vlan號。
7.數據包離開br-int進入br-ex,脫掉內部vlan號,打上外網ip的vlan號。
8.最后借助provider網絡訪問公網,此處也印證了provider網絡只能是vlan或flat類型。
通過前文得知,整個架構的三層通信需要借助安裝在網絡節點的L3 Agent來完成,這樣,網絡節點在架構中就成了單點隱患,為了解決這個問題,需要對network node做高可用,L3 Agent實現ha的方式是利用keepalive的VRRP協議提供一個vip,同時在br-int和Router上增加一個ha接口,以實現心跳傳遞,此時網絡節點的內部組件通信如下圖所示:
從部署結構來看,route namespace的接口上分別是subnet的網關地址和外網地址(或者floating ip地址),所以當使用keepalive此時網絡節點架構如下圖所示:
至此集中網絡節點模式下vm的流量就介紹完畢。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。