您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何理解vxlan在openstack中的使用場景,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
介紹前,首先講一下網(wǎng)絡(luò)中underlay和overlay的概念。underlay指的是物理網(wǎng)絡(luò)層,overlay是指在物理網(wǎng)絡(luò)層之上的邏輯網(wǎng)絡(luò)或者又稱為虛擬網(wǎng)絡(luò)。overlay是建立在underlay的基礎(chǔ)上,需要物理網(wǎng)絡(luò)中的設(shè)備兩兩互聯(lián),overlay的出現(xiàn)突破了underlay的物理局限性,使得網(wǎng)絡(luò)的架構(gòu)更為靈活。以vlan為例,在underlay環(huán)境下不同網(wǎng)絡(luò)的設(shè)備需要連接至不同的交換機(jī)下,如果要改變設(shè)備所屬的網(wǎng)絡(luò),則要調(diào)整設(shè)備的連線。引入vlan后,調(diào)整設(shè)備所屬網(wǎng)絡(luò)只需要將設(shè)備加入目標(biāo)vlan下,避免了設(shè)備的連線調(diào)整。
vlan id數(shù)量不足
vlan header由12bit組成,理論上限為4096個(gè),可用vlan數(shù)量為1~4094個(gè),無法滿足云環(huán)境下的需求。
vm熱遷移
云計(jì)算場景下,傳統(tǒng)服務(wù)器變成一個(gè)個(gè)運(yùn)行在宿主機(jī)上的vm。vm是運(yùn)行在宿主機(jī)的內(nèi)存中,所以可以在不中斷的情況下從宿主機(jī)A遷移到宿主機(jī)B,前提是遷移前后vm的ip和mac地址不能發(fā)生變化,這就要求vm處在一個(gè)二層網(wǎng)絡(luò)。畢竟在三層環(huán)境下,不同vlan使用不同的ip段,否則路由器就犯難了。
mac表項(xiàng)有限
普通的交換機(jī)mac表項(xiàng)有4k或8k等,在小規(guī)模場景下不會成為瓶頸,云計(jì)算環(huán)境下每臺物理服務(wù)器上運(yùn)行多臺vm,每個(gè)vm有可能有多張vnic,mac地址會成倍增長,交換機(jī)的表項(xiàng)限制則成為必須面對的問題。
以多取勝
vxlan header由24bit組成,所以理論上VNI的數(shù)量為16777216個(gè),解決了vid數(shù)量不足的問題。
此處需要說明的是:在openstack中,盡管br-tun上的vni數(shù)量增多,但br-int上的網(wǎng)絡(luò)類型只能是vlan,所有vm都有一個(gè)內(nèi)外vid(vni)轉(zhuǎn)換的過程,將用戶層的vni轉(zhuǎn)換為本地層的vid。
細(xì)心的你可能會有這樣的疑問:盡管br-tun上vni的數(shù)量為16777216個(gè),但br-int上vid只有4096個(gè),那引入vxlan是否有意義?答案是肯定的,以目前的物理機(jī)計(jì)算能力來說,假設(shè)每個(gè)vm屬于不同的tenant,1臺物理機(jī)上也不可能運(yùn)行4094個(gè)vm,所以這么映射是有意義的。
上圖是2計(jì)算節(jié)點(diǎn)間vm通信的示意圖,圖中所有的vm屬于同一個(gè)tenant,盡管在用戶層同一tenant的vni一致,但在本地層,同一tenant由nova-compute分配的vid可以不一致,同一宿主機(jī)上同一tenant的相同subnet之間的vm相互訪問不需要經(jīng)過內(nèi)外vid(vni)轉(zhuǎn)換,不同宿主機(jī)上相同tenant的vm之間相互訪問則需要經(jīng)過vid(vni)轉(zhuǎn)換。如果所有宿主機(jī)上vid和vni對應(yīng)關(guān)系一致,整個(gè)云環(huán)境最多只能有4094個(gè)tenant,引入vxlan才真的沒有意義。
暗渡陳倉
前面說過,vm的熱遷移需要遷移前后ip和mac地址不能發(fā)生管改變,所以需要vm處于一個(gè)二層網(wǎng)絡(luò)中。vxlan是一種overlay的技術(shù),將原有的報(bào)文進(jìn)行再次封裝,利用udp進(jìn)行傳輸,所以也稱為mac in udp,表面上傳輸?shù)氖欠庋b后的ip和mac,實(shí)際傳播的是封裝前的ip和mac。
銷聲匿跡
在云環(huán)境下,接入交換機(jī)的表項(xiàng)大小會成為瓶頸,解決這個(gè)問題的方法無外乎兩種:
1.擴(kuò)大表項(xiàng) : 更高級的交換機(jī)有著更大的表項(xiàng),使用高級交換機(jī)取代原有接入交換機(jī),此舉會增加成本。
2.隱藏mac地址: 在不增加成本的前提下,使用vxlan也能達(dá)到同樣的效果。前文得知,vxlan是對原有的報(bào)文再次封裝,實(shí)現(xiàn)vxlan功能的vetp角色可以位于交換機(jī)或者vm所在的宿主機(jī),如果vtep角色位于宿主機(jī)上,接入交換機(jī)只會學(xué)習(xí)經(jīng)過再次封裝后vtep的mac地址,不會學(xué)習(xí)其上vm的mac地址。
如果vtep角色位于接入交換機(jī)上,處理報(bào)文的效率更高,但是接入交換機(jī)會學(xué)習(xí)到vm的mac地址,表項(xiàng)的限制依然沒有得到解決,后續(xù)對這兩種情況會做詳細(xì)說明。
以上就是openstack場景中使用vxlan的原因,下面將會對vxlan的實(shí)現(xiàn)原理進(jìn)行詳細(xì)說明。
vxlan報(bào)文長什么樣
vxlan報(bào)文是在原有報(bào)文的基礎(chǔ)上再次進(jìn)行封裝,已實(shí)現(xiàn)三層傳輸二層的目的。
如上圖所示,原有封裝后的報(bào)文成為vxlan的data部分,vxlan header為vni,ip層header為源和目的vtep地址,鏈路層header為源vtep的mac地址和到目的vtep的下一個(gè)設(shè)備mac地址。
在筆者所從事的公有云架構(gòu)中,vtep角色通過宿主機(jī)上的ovs實(shí)現(xiàn),宿主機(jī)上聯(lián)至接入交換機(jī)的接口類型為trunk,在物理網(wǎng)絡(luò)中為vtep專門規(guī)劃出一個(gè)網(wǎng)絡(luò)平面
vm在經(jīng)過vtep時(shí),通過流表規(guī)則,去除vid,添加上vni
vtep平面規(guī)劃的vid在vxlan的封裝過程中被打上,原因如下圖所示,vxlan的mac header中可以設(shè)置vlan tag
vtep是什么
vtep全稱vxlan tunnel endpoint,vxlan可以抽象的理解為在三層網(wǎng)絡(luò)中打通了一條條隧道,起點(diǎn)和終點(diǎn)的兩端就是vetp。vtep是實(shí)現(xiàn)vxlan功能的重要模型,可以部署在接入交換機(jī)或者服務(wù)器上,部署在不同的位置除了前文中提到是否學(xué)習(xí)vm的mac地址外,實(shí)現(xiàn)的機(jī)制也所有不同,以下內(nèi)容如無特別說明,默認(rèn)vtep部署在接入交換機(jī)上,vtep部署在服務(wù)器上后面會單獨(dú)說明。
vxlan隧道的建立
對于物理交換機(jī)而言,vtep是物理交換機(jī)上的一個(gè)角色,換句話說,vtep只是交換機(jī)上的一部分功能,并非所有的報(bào)文都需要走vxlan隧道,報(bào)文也可能走普通的二三層轉(zhuǎn)發(fā)。那么哪些報(bào)文需要走vxlan隧道?
如上圖所示,vxlan打造了一個(gè)大二層的概念,當(dāng)連接兩個(gè)不同vtep的vm需要進(jìn)行通信時(shí),就需要建立vxlan隧道。每一個(gè)大二層域稱為一個(gè)bridge-domain,簡稱bd,類似于vlan的vid,不同的bd用vni表示,bd與vni是1:1的關(guān)系。
創(chuàng)建bd和設(shè)置bd與vni對應(yīng)關(guān)系的配置如下:
# bridge-domain 10 //創(chuàng)建一個(gè)編號為10的bd vxlan vni 5000 //設(shè)置bd10對應(yīng)的vni為5000 #
vtep會根據(jù)以上配置生成bd與vni的映射關(guān)系表,該映射表可以通過命令行查看,如下所示:
有了映射表后,進(jìn)入vtep的報(bào)文就可以根據(jù)自己所屬的bd來確定報(bào)文封裝時(shí)該添加哪個(gè)vni。問題就剩下報(bào)文根據(jù)什么來確定自己屬于哪個(gè)bd。
它可以通過二層子接口接入vxlan隧道和vlan接入vxlan隧道來實(shí)現(xiàn)。二層子接口主要做兩件事:一是根據(jù)配置來檢查哪些報(bào)文需要進(jìn)入vxlan隧道;二是判斷對檢查通過的報(bào)文做怎樣的處理。
如上圖所示,基于二層物理接口10GE 1/0/1,分別創(chuàng)建二層子接口10GE 1/0/1.1和10GE 1/0/1.2,且分別配置其流封裝類型為dot1q和untag。配置如下:
# interface 10GE1/0/1.1 mode l2 //創(chuàng)建二層子接口10GE1/0/1.1 encapsulation dot1q vid 10 //只允許攜帶VLAN Tag 10的報(bào)文進(jìn)入VXLAN隧道 bridge-domain 10 //報(bào)文進(jìn)入的是BD 10 # interface 10GE1/0/1.2 mode l2 //創(chuàng)建二層子接口10GE1/0/1.2 encapsulation untag //只允許不攜帶VLAN Tag的報(bào)文進(jìn)入VXLAN隧道 bridge-domain 20 //報(bào)文進(jìn)入的是BD 20 #
基于二層物理接口10GE 1/0/2,創(chuàng)建二層子接口10GE 1/0/2.1,且流封裝類型為default。配置如下:
# interface 10GE1/0/2.1 mode l2 //創(chuàng)建二層子接口 10GE1/0/2.1 encapsulation default //允許所有報(bào)文進(jìn)入VXLAN隧道 bridge-domain 30 //報(bào)文進(jìn)入的是BD 30 #
至此,所有條件都已具備,就可以通過協(xié)議自動建立vxlan隧道隧道,或者手動指定vxlan隧道的源和目的ip地址在本端vtep和對端vtep之間建立靜態(tài)vxlan隧道。對于華為CE系列交換機(jī),以上配置是在nve(network virtualization Edge)接口下完成的。配置過程如下:
# interface Nve1 //創(chuàng)建邏輯接口 NVE 1 source 1.1.1.1 //配置源VTEP的IP地址(推薦使用Loopback接口的IP地址) vni 5000 head-end peer-list 2.2.2.2 vni 5000 head-end peer-list 2.2.2.3 #
其中,vni 5000的對端vtep有兩個(gè),ip地址分別為2.2.2.2和2.2.2.3,至此,vxlan隧道建立完成。
VXLAN隧道兩端二層子接口的配置并不一定是完全對等的。正因?yàn)檫@樣,才可能實(shí)現(xiàn)屬于同一網(wǎng)段但是不同VLAN的兩個(gè)VM通過VXLAN隧道進(jìn)行通信。
總結(jié)一下,vxlan目前支持三種封裝類型,如下表所示:
這種方法當(dāng)有眾多個(gè)vni的時(shí)候,需要為每一個(gè)vni創(chuàng)建一個(gè)子接口,會變得非常麻煩。
此時(shí)就應(yīng)該采用vlan接入vxlan隧道的方法。vlan接入vxlan隧道只需要在物理接口下允許攜帶這些vlan的報(bào)文通過,然后再將vlan與bd綁定,建立bd與vni對應(yīng)的bd信息,最后創(chuàng)建vxlan隧道即可。
vlan與bd綁定的配置如下:
# bridge-domain 10 //創(chuàng)建一個(gè)編號為10的bd l2 binding vlan 10 //將bd10與vlan10綁定 vxlan vni 5000 //設(shè)置bd10對應(yīng)的vni為5000 #
同子網(wǎng)vxlan通信流程
如上圖所示,假設(shè)vtep是通過接入交換機(jī)上的子接口實(shí)現(xiàn),VM_A與VM_C進(jìn)行首次進(jìn)行通信。由于是,VM_A上沒有VM_C的MAC地址,所以會發(fā)送ARP廣播報(bào)文請求VM_C的MAC地址。就以ARP請求報(bào)文及ARP應(yīng)答報(bào)文的轉(zhuǎn)發(fā)流程,來說明MAC地址是如何進(jìn)行學(xué)習(xí)的。
ARP請求報(bào)文的轉(zhuǎn)發(fā)流程如下:
1. VM_A發(fā)送源MAC為MAC_A、目的MAC為全F、源IP為IP_A、目的IP為IP_C的ARP廣播報(bào)文,請求VM_C的MAC地址。
2. VTEP_1收到這種BUM(Broadcast&Unknown-unicast&Multicast)請求后,會根據(jù)頭端復(fù)制列表對報(bào)文進(jìn)行復(fù)制,并分別進(jìn)行封裝。根據(jù)二層子接口上的配置判斷報(bào)文需要進(jìn)入VXLAN隧道。確定了報(bào)文所屬BD后,也就確定了報(bào)文所屬的VNI。同時(shí),VTEP_1學(xué)習(xí)MAC_A、VNI和報(bào)文入接口(Port_1,即二層子接口對應(yīng)的物理接口)的對應(yīng)關(guān)系,并記錄在本地MAC表中。
3. 報(bào)文到達(dá)VTEP_2和VTEP_3后,VTEP對報(bào)文進(jìn)行解封裝,得到VM_A發(fā)送的原始報(bào)文。同時(shí),VTEP_2和VTEP_3學(xué)習(xí)VM_A的MAC地址、VNI和遠(yuǎn)端VTEP的IP地址(IP_1)的對應(yīng)關(guān)系,并記錄在本地MAC表中。之后,VTEP_2和VTEP_3根據(jù)二層子接口上的配置對報(bào)文進(jìn)行相應(yīng)的處理并在對應(yīng)的二層域內(nèi)廣播。
VM_B和VM_C接收到ARP請求后,比較報(bào)文中的目的IP地址是否為本機(jī)的IP地址。VM_B發(fā)現(xiàn)目的IP不是本機(jī)IP,故將報(bào)文丟棄;VM_C發(fā)現(xiàn)目的IP是本機(jī)IP,則對ARP請求做出應(yīng)答。
ARP應(yīng)答報(bào)文轉(zhuǎn)發(fā)流程如下圖所示:
4. 由于此時(shí)VM_C上已經(jīng)學(xué)習(xí)到了VM_A的MAC地址,所以ARP應(yīng)答報(bào)文為單播報(bào)文,單播報(bào)文就不再進(jìn)行頭端復(fù)制。報(bào)文源MAC為MAC_C,目的MAC為MAC_A,源IP為IP_C、目的IP為IP_A。
5. VTEP_3接收到VM_C發(fā)送的ARP應(yīng)答報(bào)文后,識別報(bào)文所屬的VNI(識別過程與步驟2類似)。同時(shí),VTEP_3學(xué)習(xí)MAC_C、VNI和報(bào)文入接口(Port_3)的對應(yīng)關(guān)系,并記錄在本地MAC表中。之后,VTEP_3對報(bào)文進(jìn)行封裝。這里封裝的外層源IP地址為本地VTEP(VTEP_3)的IP地址,外層目的IP地址為對端VTEP(VTEP_1)的IP地址;外層源MAC地址為本地VTEP的MAC地址,而外層目的MAC地址為去往目的IP的網(wǎng)絡(luò)中下一跳設(shè)備的MAC地址。封裝后的報(bào)文,根據(jù)外層MAC和IP信息,在IP網(wǎng)絡(luò)中進(jìn)行傳輸,直至到達(dá)對端VTEP。
6. 報(bào)文到達(dá)VTEP_1后,VTEP_1對報(bào)文進(jìn)行解封裝,得到VM_C發(fā)送的原始報(bào)文。同時(shí),VTEP_1學(xué)習(xí)VM_C的MAC地址、VNI和遠(yuǎn)端VTEP的IP地址(IP_3)的對應(yīng)關(guān)系,并記錄在本地MAC表中。之后,VTEP_1將解封裝后的報(bào)文發(fā)送給VM_A。
至此,VM_A和VM_C均已學(xué)習(xí)到了對方的MAC地址。之后,VM_A和VM_C將采用單播方式進(jìn)行通信。
不同子網(wǎng)vxlan通信流程
如上圖所示,VM_A和VM_B分別屬于10.1.10.0/24網(wǎng)段和10.1.20.0/24網(wǎng)段,且分別屬于VNI 5000和VNI 6000。VM_A和VM_B對應(yīng)的三層網(wǎng)關(guān)分別是VTEP_3上BDIF 10和BDIF20的IP地址(BDIF接口的功能與VLANIF接口類似,是基于BD創(chuàng)建的三層邏輯接口,用以實(shí)現(xiàn)不同子網(wǎng)VM之間或VXLAN網(wǎng)絡(luò)與非VXLAN網(wǎng)絡(luò)之間的通信。)。VTEP_3上存在到10.1.10.0/24網(wǎng)段和10.1.20.0/24網(wǎng)段的路由。此時(shí),VM_A想與VM_B進(jìn)行通信。
由于是首次進(jìn)行通信,且VM_A和VM_B處于不同網(wǎng)段,VM_A需要先發(fā)送ARP廣播報(bào)文請求網(wǎng)關(guān)(BDIF 10)的MAC,獲得網(wǎng)關(guān)的MAC后,VM_A先將數(shù)據(jù)報(bào)文發(fā)送給網(wǎng)關(guān);之后網(wǎng)關(guān)也將發(fā)送ARP廣播報(bào)文請求VM_B的MAC,獲得VM_B的MAC后,網(wǎng)關(guān)再將數(shù)據(jù)報(bào)文發(fā)送給VM_B。以上MAC地址學(xué)習(xí)的過程與同子網(wǎng)互通中MAC地址學(xué)習(xí)的流程一致,不再贅述?,F(xiàn)在假設(shè)VM_A和VM_B均已學(xué)到網(wǎng)關(guān)的MAC、網(wǎng)關(guān)也已經(jīng)學(xué)到VM_A和VM_B的MAC,不同子網(wǎng)VM互通報(bào)文轉(zhuǎn)發(fā)流程如下圖所示:
1. VM_A先將數(shù)據(jù)報(bào)文發(fā)送給網(wǎng)關(guān)。報(bào)文的源MAC為MAC_A,目的MAC為網(wǎng)關(guān)BDIF10的MAC_10,源IP地址為IP_A,目的IP為IP_B。
2. VTEP_1收到數(shù)據(jù)報(bào)文后,識別此報(bào)文所屬的VNI(VNI 5000),并根據(jù)MAC表項(xiàng)對報(bào)文進(jìn)行封裝。這里封裝的外層源IP地址為本地VTEP的IP地址(IP_1),外層目的IP地址為對端VTEP的IP地址(IP_3);外層源MAC地址為本地VTEP的MAC地址(MAC_1),而外層目的MAC地址為去往目的IP的網(wǎng)絡(luò)中下一跳設(shè)備的MAC地址。
3. 報(bào)文進(jìn)入VTEP_3,VTEP_3對報(bào)文進(jìn)行解封裝,得到VM_A發(fā)送的原始報(bào)文。然后,VTEP_3會對報(bào)文做如下處理:
(1) VTEP_3發(fā)現(xiàn)該報(bào)文的目的MAC為本機(jī)BDIF 10接口的MAC,而目的IP地址為IP_B(10.1.20.1),所以會根據(jù)路由表查找到IP_B的下一跳。
(2) 發(fā)現(xiàn)下一跳為10.1.20.10,出接口為BDIF 20。此時(shí)VTEP_3查詢ARP表項(xiàng),并將原始報(bào)文的源MAC修改為BDIF 20接口的MAC(MAC_20),將目的MAC修改為VM_B的MAC(MAC_B)。
(3) 報(bào)文到BDIF20接口時(shí),識別到需要進(jìn)入VXLAN隧道(VNI 6000),所以根據(jù)MAC表對報(bào)文進(jìn)行封裝。這里封裝的外層源IP地址為本地VTEP的IP地址(IP_3),外層目的IP地址為對端VTEP的IP地址(IP_2);外層源MAC地址為本地VTEP的MAC地址(MAC_3),而外層目的MAC地址為去往目的IP的網(wǎng)絡(luò)中下一跳設(shè)備的MAC地址。
4. 報(bào)文到達(dá)VTEP_2后,VTEP_2對報(bào)文進(jìn)行解封裝,得到內(nèi)層的數(shù)據(jù)報(bào)文,并將其發(fā)送給VM_B。VM_B回應(yīng)VM_A的流程與上述過程類似,不再贅述。
需要說明的是:VXLAN網(wǎng)絡(luò)與非VXLAN網(wǎng)絡(luò)之間的互通,也需要借助于三層網(wǎng)關(guān)。其實(shí)現(xiàn)不同點(diǎn)在于報(bào)文在VXLAN網(wǎng)絡(luò)側(cè)會進(jìn)行封裝,而在非VXLAN網(wǎng)絡(luò)側(cè)不需要進(jìn)行封裝。報(bào)文從VXLAN側(cè)進(jìn)入網(wǎng)關(guān)并解封裝后,就按照普通的單播報(bào)文發(fā)送方式進(jìn)行轉(zhuǎn)發(fā)。
ovs如何創(chuàng)建vxlan隧道
從前文得知,vtep部署在接入交換機(jī)上時(shí)還是會學(xué)習(xí)到vm的mac地址,并沒有解決表項(xiàng)限制問題,這也是為什么在公有云場景下vtep角色都是部署在宿主機(jī)的ovs中。
不同于在接入交換機(jī)上通過手動的方式建立vxlan隧道,openstack中負(fù)責(zé)網(wǎng)絡(luò)的neutron-server啟動后,會自己建立隧道,下面來介紹neutron-server如何自動建立隧道。
如上圖所示,每個(gè)宿主機(jī)上的ovs是由ovs-aget創(chuàng)建,當(dāng)計(jì)算節(jié)點(diǎn)1接入網(wǎng)絡(luò)中時(shí),他首先會去向neutron-server報(bào)告自己的網(wǎng)絡(luò)類型和local_ip,neutron-server收到這些資源信息后(neutron中network、port、subnet都稱為資源)會進(jìn)行處理,找到相同網(wǎng)絡(luò)類型的其他計(jì)算節(jié)點(diǎn)并為他們之間創(chuàng)建隧道,同時(shí)將這個(gè)消息同步給其他計(jì)算節(jié)點(diǎn)上的ovs-agent。
每當(dāng)neutron資源發(fā)生變化時(shí),或者ovs對流量不知該處和處理時(shí),都會像neutron-server匯報(bào)或等待它的通知,再加上之前的流表,是不是感覺很熟悉?沒錯,neutron-server除了接受api請求外,他還是一個(gè)sdn控制器。
與接入交換機(jī)實(shí)現(xiàn)vtep的區(qū)別
1. 使用ovs實(shí)現(xiàn)的vtep接入交換機(jī)只會學(xué)習(xí)經(jīng)過vtep封裝后的mac地址,學(xué)習(xí)不到vm的mac地址,這樣解決了mack地址表項(xiàng)的問題。
2. 物理交換機(jī)是通過bd和vni綁定的方法建立不同的隧道,ovs實(shí)現(xiàn)時(shí)每一個(gè)vtep內(nèi)可以有多個(gè)vsi(virtual switch instance),每一個(gè)vsi對用一個(gè)vni。
以上就是vxlan在openstack中通過物理設(shè)備或者ovs實(shí)現(xiàn)的方式。
關(guān)于如何理解vxlan在openstack中的使用場景就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。