nginx適配Overlay以及測(cè)試工具
本文分享自天翼云開(kāi)發(fā)者社區(qū)《nginx適配Overlay以及測(cè)試工具》,作者:pan
Overlay與Underlay介紹
Overlay網(wǎng)絡(luò)和Underlay網(wǎng)絡(luò)是一組相對(duì)概念,Overlay網(wǎng)絡(luò)是建立在Underlay網(wǎng)絡(luò)上的邏輯網(wǎng)絡(luò)。而Overlay網(wǎng)絡(luò)是通過(guò)網(wǎng)絡(luò)虛擬化技術(shù),在同一張Underlay網(wǎng)絡(luò)上構(gòu)建出的一張或者多張?zhí)摂M的邏輯網(wǎng)絡(luò),如下圖所示。
詳細(xì)資料可查看https://zhuanlan.zhihu.com/p/436605135
ELB使用的技術(shù)方案
天翼云ELB使用VXLAN隔離,需要進(jìn)行VXLAN的解析與封裝。VXLAN技術(shù)是一種大二層的虛擬網(wǎng)絡(luò)技術(shù),主要原理是引入一個(gè)UDP格式的外層隧道作為數(shù)據(jù)鏈路層,而原有數(shù)據(jù)報(bào)文內(nèi)容作為隧道凈荷加以傳輸。
ELB使用dpvs以及nginx做7層http和https的代理以及分發(fā)。報(bào)文流向?yàn)榭蛻舳耍▋?nèi)網(wǎng)或者公網(wǎng))->ELB(內(nèi)部為dpvs->nginx)->RS(真正的http服務(wù)端)。因?yàn)镋LB和RS處于同一VXLAN中,那么nginx轉(zhuǎn)發(fā)的報(bào)文就需要封裝VXLAN,又因?yàn)镽S需要知道真實(shí)的客戶端IP,nginx也需要獲取客戶端IP并轉(zhuǎn)發(fā)的時(shí)候增加X(jué)-Forwarded-For。
dpvs收到報(bào)文會(huì)解析VXLAN,同時(shí)轉(zhuǎn)發(fā)到nginx,因?yàn)閐pvs采用FULLNAT的模式,nginx如果要獲取真實(shí)ip,二者之間采用了Proxy Protocol。Proxy protocol,是一個(gè)Internet協(xié)議,通過(guò)為tcp添加一個(gè)很小的頭信息,來(lái)方便的傳遞客戶端信息(協(xié)議棧、源IP、目的IP、源端口、目的端口等)。因?yàn)閚ginx還需要知道VXLAN的id,對(duì)Proxy Protocol進(jìn)行了改造,增加了vni字段,如下圖。 nginx就需要在原生代碼基礎(chǔ)上,增加vni字段的讀取。同時(shí)連接upstream時(shí),因?yàn)樾枰庋bvni,通過(guò)SO_BINDTODEVICE綁定到具體網(wǎng)卡,完成VXLAN封裝。
如何測(cè)試
因?yàn)橄啾萈roxy Protocol多一個(gè)字段,通過(guò)curl無(wú)法自測(cè),通過(guò)一個(gè)python工具來(lái)測(cè)試,源碼為https://github.com/codejudas/py-proxy-protocol/。但是需要修改,增加一個(gè)vni字段,在代碼中涉及vni的地方均添加字段即可,如下圖。 然后修改測(cè)試下面的socket.py,測(cè)試結(jié)果如圖:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。