高可用負載均衡:開源PaaS Rainbond組件Rainbond-Entrance揭秘
負載均衡(Load Balancing)是開源PaaS Rainbond的亮點功能,主要由「軟體定義負載均衡」Rainbond-Entrance控制器完成。
本文將圍繞設計架構和實現介紹Rainbond-Entrance。
為什麼需要負載均衡
Rainbond內部網路劃分支持多租戶,每個租戶都有一個私有的IP段,不同租戶的網路相互不可見。當我們把一個容器化應用部署到Rainbond,Rainbond會為該容器分配一個內部IP,用於同一租戶中不同應用在集群內部的通信,而集群外部無法直接訪問,因此我們需要有一個集群入口控制器,以便用戶可以方便地訪問這些應用。
另外,Rainbond中部署的每個應用都可以有多個實例,即假設我們為一個WEB應用部署了三個實例,每個實例分擔一部分流量,我們就需要這三個實例前增加負載均衡控制器來完成分發流量的工作。
除了上述的基本功能以外,負載均衡控制器還必須支持更多功能,例如:
入口控制器能夠根據數據包信息(如協議、埠號、主機名等)將請求轉發給指定的應用
實時發現集群中應用的變化(如添加自定義域名、添加證書、添加埠等)並動態更新自身的轉發規則
同時支持HTTP、TLS、TCP、UDP協議,因為有時不只WEB應用需要向外提供服條,RPC、MySQL等也需要對外開放
支持高可用
綜上所述,我們需要一個同時支持L4或各類應用協議(L7)的負載均衡控制器集群,還必須能夠自動發現集群中的應用變化以更新自己的轉發規則。
Rainbond中的負載均衡整體架構
:表示Rainbond中的一個應用,並且有三個實例
:kubeneters的kube-apiserver組件
:Rainbond的負載均衡控制器通用介面,支持多種負載均衡插件
Entrance實現Rainbond中的負載均衡是面嚮應用的,不同應用可以使用不同的負載均衡。Rainbond的Entrance組件設計,使之可以集成集成多種負載均衡插件,也就是說,Rainbond不僅支持常用的OpenResty,還可以支持其它負載均衡插件,例如商業支持的F5等。
Entrance的主要工作是從kube-apiserver中監聽應用運行節點信息的變化,例如Service、Endpoint、Pod等,然後把這些資源抽象為通用的負載均衡抽象並緩存在etcd中,這些通用抽象包括:
:負載均衡池,其中包括多個節點,對應上圖中的三個WEB實例
:Pool中的一個節點,對應上圖中的其中一個WEB實例
:域名,負載均衡控制器可以識別一個數據包中的域名信息然後將數據轉發給對應的Pool
:監聽了某個埠的虛擬主機,還指明了埠的協議名稱,主要用來處理L4入口控制和負載均衡
:轉發規則,用來描述域名跟Pool的對應關係,還指明了埠的協議名稱與證書信息,處理L7入口控制和負載均衡
當有資源發生變化時,Entrance會將通用資源轉化為相應插件的資源,並根據應用所選擇的不同的插件驅動操作負載均衡控制器。
從架構中可以看到,有兩個Entrance和兩個OpenResty實例,它們的關係是:每個Entrance中持有所有OpenResty的地址,當有信息需要更新時,Entrance會將信息更新到所有的OpenResty。那兩個Entrance之間怎麼協調呢?這裡我們利用etcd本身的特性做了分散式鎖,保證只有一個Entrance有許可權向OpenResty更新信息,如此實現了高可用。
OpenResty插件
OpenResty是一個可以用Lua腳本來處理請求和業條邏輯的WEB應用,並且內置了眾多Lua相關的指定和函數供開發者使用,很合適開發Restful API伺服器,我們將OpenResty作為Entrance的插件之一原因如下:
基於Nginx開發,在穩定性和性能方面表現出色
接近Rainbond的設計目標,它已經幫我們把Lua模塊編譯進去,可以很方便地用Lua腳本豐富負載均衡控制器的功能
同時支持L7和L4的負載均衡
我們在OpenResty端嵌入了一個Rest API伺服器,這些API是用Lua寫的。前面說過OpenResty集成了Lua腳本功能,我們可以直接用Lua來處理請求,下面是Nginx配置文件的其中一部分:
當我們調用下面的API時:
OpenResty會執行相應的Lua腳中,也就是,前面說過,OpenResty內置了很多Lua相關的指命與函數,可以讓Lua與Nginx更好地交互,所以我們在腳本中很容器處理接收到的JSON數據,並將其轉換為配置Nginx文件,由於Lua代碼較多就不貼出來了,可以在本文的引用部分找到該項目地址。
這裡有個需要注意的地方,當收到大量修改server和upstream的請求時,OpenResty需要頻繁載入配置文件,這樣會增加負載且影響性能。實際上OpenResty有很多第三方插件可以使用,有一個叫dyups的插件可以做到動態修改upstream,它的使用方式如下,Lua代碼:
執行成功後就已經生效了,不需要我們執行命令,這會提高一些效率。
對於server的修改暫時還沒有相應用插件做到動態修改,所以實際上我們的負載均衡控制器分兩種情況,如果更新了upstream配置會即時生效,而更新server配置則需要加上命令。
結語
我們用Entrance加OpenResty實現了一個可插拔且高可用的負載均衡控制器,整體來說並不複雜,希望本文能帶給你一些幫助。
目前我們已經把Rainbond的OpenResty插件分離出來做為一個子項目並且開源在Github上,你可以下載並單獨使用:https://github.com/goodrain/lb-openresty
希望本文對你有幫助,求幫轉,謝謝
公眾號推薦:
公眾號:VOA英語每日一聽


TAG:IT技術精選文摘 |