1. 程式人生 > >OVN實戰---《The OVN Load Balancer》翻譯

OVN實戰---《The OVN Load Balancer》翻譯

現在 負載均衡 refused balancer and led pan connect conf

Overview

基於前面幾篇文章的基礎之上,我們接下來將要探索OVN中的load balancingz這一特性。但是在開始之前,我們先來回顧一下上一個lab中創建好的拓撲結構。

The lab network

技術分享

The OVN logical network

技術分享

The OVN Load Balancer

The OVN load balancer用於為OVN邏輯網絡空間中的負載提供基本的負載均衡的功能。由於它的簡單特性,它並不是用來替代基於應用的,專有的load balancer,後者往往提供了更多高級特性。

The load balancer利用一種基於哈希的算法來將對於VIP的請求均衡到邏輯地址空間中一個相關的IP地址池中。因為哈希值是根據用戶請求的頭部計算的,因此均衡的結果會非常隨機。而每個用戶的請求都會在連接期間和負載池中的某個成員互相綁定。OVN中的Load balancing既可以應用到logical switch中,也可以應用到logical router中。我們需要根據具體的需求來確定在什麽地方應用該特性。下面是對各種方法的說明:

當將該特性應用到logical routers時,我們需要考慮以下事項:

  • 負載均衡可能被應用到一個"centralized" router(或者說一個gateway router)
  • 基於上一點,路由器中的負載均衡將不是一個分布式的服務

當將該特性應用到logical switch時,我們需要考慮以下事項:

  • 負載均衡是“分布式”的,它可能會應用到多個OVS hosts中
  • logical switch上的負載均衡只能被應用於來自VIF的流量。這意味著它只能用於"client" logical switch而不是"server" logical switch
  • 基於上一點,你可能需要根據你設計所需的擴展性將負載均衡應用到多個logical switch中

Using Our Fake "VMs" as Web Servers

為了模擬load balancer,我們需要在"dmz"上創建一對web server,每一個server都提供可識別的服務。為了讓演示更為簡單,我們將在vm1/vm2的namespace中用一行python代碼來啟動一個web server。下面就來啟動我們的web servers。

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

上述命令用於創建web server,並且在TCP端口8000進行監聽,它會通過顯示不同的文件內容來標識不同的虛擬機。

同時我們還想要測試到達web server的連通性。對此,我們將在Ubuntu host的global namespace利用curl進行檢測。確保已經安裝了curl命令

apt-get -y install curl

  

Configuring the Load Balancer Rules

首先,我們需要定義load balancing rules,VIP以及後端的IP池。下文命令的內容就是在OVN northbound DB中創建一個記錄,並且獲取它的UUID。為了測試,我們將使用"data" network中的10.127.0.254作為VIP,並且將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

上述命令在northbound DB的load_balancer表中創建了一個記錄,並且將結果UUID存放在了變量"uuid"中。我們將在下面的命令中引用該變量。

The Gateway Router As a Load Balancer

首先,讓我們將load balancer profile應用到OVN gateway router "edge1"中

ubuntu1

ovn-nbctl set logical_router edge1 load_balancer=$uuid

  

我們可以通過如下命令來確認

ovn-nbctl get logical_router edge1 load_balancer

  

現在,從任意Ubuntu host的global namespace中,我們都能連接VIP了

[email protected]:~# curl 10.127.0.254:8000
i am vm2
[email protected]:~# curl 10.127.0.254:8000
i am vm1
[email protected]:~# curl 10.127.0.254:8000
i am vm2

  

我重復執行了上述命令好幾次,最終顯示負載均衡的結果是非常隨機的

讓我們看看,如果我關閉了其中一個web server會發生什麽。因此我們停止了vm1 namespace中的python程序,以下是我得到的結果:

[email protected]:~# curl 10.127.0.254:8000
curl: (7) Failed to connect to 10.127.0.254 port 8000: Connection refused
[email protected]:~# curl 10.127.0.254:8000
i am vm2

  

我們可以發現,the load balancer並不會做任何健康檢查。因為我們現在假設健康檢查將由Kubernetes這樣的編排方案來解決,但是我們可以相信,這個特性會在以後添加進來的。

在進行下一個測試前先重啟vm1中的python web server。

負載均衡在外部是可以正常工作的,接著我們來看看,從內部的虛擬機訪問VIP會有什麽樣的結果。在ubuntu2的vm3執行curl的結果如下:

[email protected]:~# ip netns exec vm3 curl 10.127.0.254:8000
i am vm1
[email protected]:~# ip netns exec vm3 curl 10.127.0.254:8000
i am vm2

  

看起來從內部訪問負載均衡也是可以正常工作的,不過還有另外一個有趣的問題。我們先來看看我們的OVN network的拓撲結構,再仔細想想在vm3上發出curl請求之後的網絡流。同時再觀察一下python web server的日誌。我的日誌如下所示:

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 -

  

我們來看一下日誌中的client IP address。第一個IP來自ubuntu1,而第二個IP則是edge1。但是為什麽請求來自edge1而不是直接來自vm3呢?這是因為實現OVN負載均衡特性的開發者考慮了所謂的"proxy mode",對於這種模式,某些情況下,load balancer會隱藏client side IP。那麽為什麽要這麽做呢?想想如果web server看到了vm3的真實的IP會怎麽樣。那麽server的應答會直接路由到vm3,繞過edge1中的load balancer。從vm3的角度來看,它對VIP發出了一個請求,但是卻從其中一個web server收到了應答,用的是web server的真實的IP地址。這顯然不是我們想要的,這也就是proxy-mode存在的原因。

現在讓我們先刪除load balancer profile,進入下一輪的實驗。

Configure the Load Balancer On a Logical Switch

接下去讓我們來看看,將load balancing rule應用到各個logical switch中會有什麽情況。因為之前我們從edge移除了load balancing,因此我們要做的第一步就是用internal VIP創建一個新的load balancer profile。這次我們將使用172.16.255.62。

ubuntu1

uuid=`ovn-nbctl create load_balancer vips:172.16.255.62="172.16.255.130,172.16.255.131"`
echo $uuid

  

首先,我們將它設置到"inside" 這個logical switch

ubuntu1

# apply and verify
ovn-nbctl set logical_switch inside load_balancer=$uuid
ovn-nbctl get logical_switch inside load_balancer

  

從vm3測試連通性(vm3位於"inside"中)

[email protected]:~# ip netns exec vm3 curl 172.16.255.62:8000
i am vm1
[email protected]:~# ip netns exec vm3 curl 172.16.255.62:8000
i am vm1
[email protected]:~# ip netns exec vm3 curl 172.16.255.62:8000
i am vm2

  

看起來好像工作正常。接著將load balancer從"inside"中移除,並將它加到"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發起測試

[email protected]:~# ip netns exec vm3 curl 172.16.255.62:8000
^C

  

很不幸,卡住了。那我們再從vm1發起測試(vm1位於"dmz"中)

[email protected]:~# ip netns exec vm1 curl 172.16.255.62:8000
^C

  

結果同樣不令人滿意。這也就說明負載均衡應該設置到用戶的logical switch而不是server的logical switch

最後,清理配置

ubuntu1

ovn-nbctl clear logical_switch dmz load_balancer
ovn-nbctl destroy load_balancer $uuid

  

Final Words

基礎的負載均衡是一個非常好的特性。將它內置於OVN中意味著在部署你自己的SDN時可以減少一些依賴。盡管這個特性非常小,但是我認為它已經覆蓋了絕大多數客戶的需求。希望經過一段時間後,它的某些限制,例如缺少健康檢查,能夠被解決。

在下一篇文章中,我將進一步探索OVN中的網絡安全相關的內容

原文鏈接:http://blog.spinhirne.com/2016/09/the-ovn-load-balancer.html

OVN實戰---《The OVN Load Balancer》翻譯