如何配置OVN負(fù)載均衡器?
譯者簡(jiǎn)介:鄭敏先,就職于諾云系統(tǒng)(上海)有限公司。工作地點(diǎn)為南京的諾云研發(fā)中心。擔(dān)任解決方案工程師。
概述
基于我的上一篇文章,接下來(lái)我將介紹OVN的負(fù)載平衡特性。 但在開(kāi)始之前,我們來(lái)看看上一個(gè)實(shí)驗(yàn)中的配置。
OVN 負(fù)載均衡器
OVN負(fù)載均衡器旨在為OVN邏輯網(wǎng)絡(luò)空間內(nèi)的工作負(fù)載提供非?;镜呢?fù)載均衡服務(wù)。由于其簡(jiǎn)單的功能集,它不是設(shè)計(jì)用于替換那些為高級(jí)用例提供更多花里胡哨的功能的硬件負(fù)載均衡器。
其它負(fù)載均衡器大多使用基于哈希的算法來(lái)平衡VIP的請(qǐng)求到邏輯空間內(nèi)的相關(guān)IP地址池。由于哈希算法是使用客戶(hù)端請(qǐng)求的頭來(lái)計(jì)算的,所以平衡應(yīng)當(dāng)是隨機(jī)性的,其中每個(gè)單獨(dú)的客戶(hù)端請(qǐng)求在連接的持續(xù)時(shí)間內(nèi)始終選擇同一個(gè)負(fù)載均衡池的特定成員。
實(shí)驗(yàn)物理網(wǎng)絡(luò)拓?fù)洌?/strong>
OVN 邏輯網(wǎng)絡(luò)拓?fù)?
OVN中的負(fù)載平衡可以應(yīng)用于邏輯交換機(jī)或邏輯路由器。選擇何種方式取決于您的具體要求。每種方法都有注意事項(xiàng)。
當(dāng)應(yīng)用于邏輯路由器時(shí),需要牢記以下注意事項(xiàng):
- 負(fù)載平衡只能應(yīng)用于“集中式”路由器(即網(wǎng)關(guān)路由器)。
- 第1個(gè)注意事項(xiàng)已經(jīng)決定了路由器上的負(fù)載平衡是非分布式服務(wù)。
應(yīng)用于邏輯交換機(jī)時(shí),需要牢記以下注意事項(xiàng):
- 負(fù)載平衡是“分布式”的,因?yàn)樗粦?yīng)用于潛在的多個(gè)OVS主機(jī)。
- 僅在來(lái)自VIF(虛擬接口)的流量入口處評(píng)估邏輯交換機(jī)上的負(fù)載平衡。這意味著它必須應(yīng)用在“客戶(hù)端”邏輯交換機(jī)上,而不是在“服務(wù)器”邏輯交換機(jī)上。
- 由于第2個(gè)注意事項(xiàng),您可能需要根據(jù)您的設(shè)計(jì)規(guī)模對(duì)多個(gè)邏輯交換機(jī)應(yīng)用負(fù)載平衡。
使用我們的的“偽虛擬機(jī)”作為Web服務(wù)器
為了演示負(fù)載均衡器,我們希望在我們的“dmz”中創(chuàng)建一對(duì)Web服務(wù)器,Web服務(wù)器提供一個(gè)可識(shí)別它們身份的文件。 為了簡(jiǎn)化實(shí)驗(yàn),我們將使用在我們的vm1/vm2命名空間中分別運(yùn)行的一個(gè)python web服務(wù)器。
讓我們啟動(dòng)web服務(wù)器吧。
在ubuntu2上:
- mkdir /tmp/www
- echo "i am vm1" > /tmp/www/index.html
- cd /tmp/www
- ip netns exec vm1 python -m SimpleHTTPServer 8000
在ubuntu3上:
- mkdir /tmp/www
- echo "i am vm2" > /tmp/www/index.html
- cd /tmp/www
- ip netns exec vm2 python -m SimpleHTTPServer 8000
上面的命令將創(chuàng)建一個(gè)web服務(wù)器,監(jiān)聽(tīng)TCP 8000。
我們還希望能夠測(cè)試與我們的網(wǎng)絡(luò)服務(wù)器的連通性。 為此,我們將從Ubuntu主機(jī)的全局命名空間使用curl。如果curl還沒(méi)有被安裝,那么需要先安裝它。
- apt-get -y install curl
配置負(fù)載均衡器規(guī)則
首先,需要定義我們的負(fù)載均衡規(guī)則,即VIP和后端服務(wù)器IP池。 這里涉及的是在OVN北向數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)條目,并捕獲生成的UUID。 在的這次實(shí)驗(yàn)中,我們將使用位于實(shí)驗(yàn)室“數(shù)據(jù)”網(wǎng)絡(luò)中的VIP 10.127.0.254。 我們將使用vm1/vm2的地址作為池IP。
在ubuntu1上:
- uuid=`ovn-nbctl create load_balancer vips:10.127.0.254="172.16.255.130,172.16.255.131"`
- echo $uuid
上述命令在北向數(shù)據(jù)庫(kù)的load_balancer表中創(chuàng)建一個(gè)條目,并將生成的UUID存儲(chǔ)到變量“uuid”。 我們將在后面的命令中引用這個(gè)變量。
在網(wǎng)關(guān)路由器上配置負(fù)載均衡
在OVN網(wǎng)關(guān)路由器“edge1”上開(kāi)啟負(fù)載均衡器功能。
在ubuntu1上:
- ovn-nbctl set logical_router edge1 load_balancer=$uuid
您可以通過(guò)檢查edge1的數(shù)據(jù)庫(kù)條目來(lái)驗(yàn)證是否成功開(kāi)啟負(fù)載均衡器功能。
- ovn-nbctl get logical_router edge1 load_balancer
現(xiàn)在,我們可以從任何Ubuntu主機(jī)的全局命名空間連接到VIP。
- root@ubuntu1:~# curl 10.127.0.254:8000
- i am vm2
- root@ubuntu1:~# curl 10.127.0.254:8000
- i am vm1
- root@ubuntu1:~# curl 10.127.0.254:8000
- i am vm2
測(cè)試多次之后,可以確認(rèn)負(fù)載平衡是相當(dāng)隨機(jī)的。
讓我們看看禁用一個(gè)Web服務(wù)器會(huì)發(fā)生什么。 嘗試停止在vm1命名空間中運(yùn)行的python進(jìn)程。 這是我得到的輸出結(jié)果:
- root@ubuntu1:~# curl 10.127.0.254:8000
- curl: (7) Failed to connect to 10.127.0.254 port 8000: Connection refused
- root@ubuntu1:~# curl 10.127.0.254:8000
- i am vm2
如您所見(jiàn),負(fù)載均衡器未執(zhí)行任何類(lèi)型的運(yùn)行狀態(tài)檢查。 目前的計(jì)劃是,運(yùn)行狀態(tài)檢查將由協(xié)調(diào)解決方案(如Kubernetes)執(zhí)行,該功能將在未來(lái)某個(gè)時(shí)間點(diǎn)被加入。
在進(jìn)行下一個(gè)測(cè)試之前,在vm1上重新啟動(dòng)python Web服務(wù)器。
負(fù)載均衡器在虛擬機(jī)外部運(yùn)行著,讓我們來(lái)看看從內(nèi)部虛擬機(jī)訪(fǎng)問(wèn)VIP時(shí)會(huì)發(fā)生什么。
在ubuntu2上調(diào)用vm3的curl:
- root@ubuntu2:~# ip netns exec vm3 curl 10.127.0.254:8000
- i am vm1
- root@ubuntu2:~# ip netns exec vm3 curl 10.127.0.254:8000
- i am vm2
很棒, 這似乎也正常工作了,但有個(gè)地方很有意思。 來(lái)看我們的OVN網(wǎng)絡(luò)的邏輯圖,并考慮來(lái)自vm3的curl請(qǐng)求的流量。 另外,看看python web服務(wù)器的部分日志:
- 10.127.0.130 - - [29/Sep/2016 09:53:44] "GET / HTTP/1.1" 200 -
- 10.127.0.129 - - [29/Sep/2016 09:57:42] "GET / HTTP/1.1" 200 -
注意日志中的客戶(hù)端IP地址。***個(gè)IP是上一輪測(cè)試的ubuntu1。第二個(gè)IP是edge1(來(lái)自vm3的請(qǐng)求)。為什么請(qǐng)求來(lái)自edge1而不是直接來(lái)自vm3?答案是,實(shí)現(xiàn)負(fù)載平衡的OVN開(kāi)發(fā)人員使用了一種稱(chēng)為“代理模式”的方法,其中負(fù)載均衡器在某些情況下隱藏了客戶(hù)端IP。為什么這是必要的?想想如果Web服務(wù)器看到vm3的真實(shí)IP會(huì)發(fā)生什么。來(lái)自服務(wù)器的響應(yīng)將直接路由回到vm3,繞過(guò)edge1上的負(fù)載均衡器。從vm3的角度來(lái)看,它看起來(lái)像是向VIP發(fā)出請(qǐng)求,但收到了來(lái)自其中一個(gè)Web服務(wù)器的真實(shí)IP的回復(fù)。(如果不使用代理模式)負(fù)載均衡器就不工作了,這就是為什么代理模式功能很重要。
為了進(jìn)行第二輪測(cè)試,先刪除負(fù)載均衡器配置
- ovn-nbctl clear logical_router edge1 load_balancer
- ovn-nbctl destroy load_balancer $uuid
在邏輯交換機(jī)上配置負(fù)載均衡
接下來(lái)的實(shí)驗(yàn)將負(fù)載均衡規(guī)則應(yīng)用到邏輯交換機(jī),會(huì)發(fā)生什么呢? 由于我們將負(fù)載均衡從邊緣移開(kāi),***步需要?jiǎng)?chuàng)建一個(gè)帶有內(nèi)部VIP的新的負(fù)載均衡器。 我們將使用172.16.255.62作為VIP。
在ubuntu1上:
- uuid=`ovn-nbctl create load_balancer vips:172.16.255.62="172.16.255.130,172.16.255.131"`
- echo $uuid
***個(gè)測(cè)試:將負(fù)載均衡器應(yīng)用于“內(nèi)部”邏輯交換機(jī)。
在ubuntu1上:
- # apply and verify
- ovn-nbctl set logical_switch inside load_balancer=$uuid
- ovn-nbctl get logical_switch inside load_balancer
然后從vm3測(cè)試(位于“inside”):
- root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
- i am vm1
- root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
- i am vm1
- root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
- i am vm2
實(shí)驗(yàn)貌似成功了。
再?gòu)?ldquo;inside”刪除負(fù)載均衡器,并將其應(yīng)用于“dmz”。在ubuntu1上:
- ovn-nbctl clear logical_switch inside load_balancer
- ovn-nbctl set logical_switch dmz load_balancer=$uuid
- ovn-nbctl get logical_switch dmz load_balancer
然后再次從 vm3測(cè)試:
- root@ubuntu2:~# ip netns exec vm3 curl 172.16.255.62:8000
- ^C
不好,它掛起了。 那我們?cè)囋噺膙m1(它也駐留在“dmz”)測(cè)試:
- root@ubuntu2:~# ip netns exec vm1 curl 172.16.255.62:8000
- ^C
也不行。 這強(qiáng)烈說(shuō)明了對(duì)客戶(hù)端的邏輯交換機(jī)而不是服務(wù)器的邏輯交換機(jī)應(yīng)用負(fù)載平衡的要求。一定要清理環(huán)境。
在ubuntu1上:
- ovn-nbctl clear logical_switch dmz load_balancer
- ovn-nbctl destroy load_balancer $uuid
結(jié)語(yǔ)
基本的負(fù)載平衡功能是非常有用的。 由于它直接構(gòu)建到OVN中,意味著在你的SDN解決方案中又少部署一個(gè)軟件。 雖然OVN負(fù)載均衡器的功能不多,但是我認(rèn)為它滿(mǎn)足了大部分用戶(hù)的需求。我也期望某些不足,如缺乏的健康檢查功能未來(lái)能夠在OVN中實(shí)現(xiàn)。。在下一篇文章中,我將介紹OVN的網(wǎng)絡(luò)安全功能。