Rainbond 作為一款云原生應用管理平臺,天生帶有引導南北向網路流量的分布式網關 rbd-gateway,rbd-gateway 組件,實際上是好雨科技團隊開發的一種 Ingress Controller 實作,那么作為集群中部署的服務的網路流量出入口,如何為它設定反向代理呢?這篇文章會做出詳細的解讀,
實際場景
Rainbond 在企業內部一般會扮演云原生應用管理平臺的角色,通過一站式開箱即用的使用體驗,可以大幅度降低企業運維人員的管理成本,在網關策略方面,免去了運維人員配置相對復雜的 Service 、Ingress 資源組態檔的麻煩,在圖形化界面下, 即可實作 L4 或 L7 的網關策略配置,
Rainbond 的網關組件 rbd-gateway 天生支持分布式部署,這就意味著,我們可以在外部流量和 Rainbond 網關集群之間設立負載均衡,來進行流量的分發,使網關具備容錯能力的同時,成倍提升其抗并發的能力,
這種負載均衡可以是物理的,也可以是軟體定義的,當然也可以是云服務商提供的,今天重點探討如何使用 Nginx 實作的全域負載均衡器實作對網關的負載,

負載均衡與VIP的對比
當企業沒有負載均衡時,也可以直接將 Rainbond 的網關直接暴露給外部訪問流量,在這種情況下,我們一般會為集群部署 VIP 虛擬IP,這個 IP 地址可以在多個網關節點之間漂移,當網關節點發生故障時提供高可用特性,通過將域名決議指向 VIP,網關節點集群擁有了一個統一的訪問入口,但是相對于負載均衡而言,VIP 方案還是有些劣勢的,
- VIP 方案不提供高并發:由于VIP同時只會系結在一個網關節點上,所以同一時刻,只會有一個網關節點接受流量,負載均衡方案可以將流量分發到每一個網關節點,故而提供了高并發能力,
- VIP 方案相當于將網關直接暴露向公網,這在安全方面有一定的隱患,負載均衡同時也是一種反向代理,可以將網關節點保護在其身后,
我們可以得出結論:當企業內部存在負載均衡設施的時候,就不再需要為網關節點集群設定 VIP ,
Nginx 負載均衡特性
Nginx 提供了強大的流量轉發能力,作為負載均衡時,Nginx 提供的穩定性和性能表現都堪稱驚艷,甚至不遜色硬體負載均衡,這些特性,使它成為了大部分企業在軟體定義負載均衡領域的第一選擇,它可以同時提供 L4 、L7 層負載均衡能力,支持 SSL 證書、多種負載均衡演算法等高級特性,
L4負載均衡
L4 負載均衡策略,其目的是在 Nginx 負載均衡的配置中,實作負載均衡的埠,到后端所有網關節點的指定埠的流量轉發,一般用于最終業務并非使用 Http 協議作業的場景,比如 Mysql 業務對外暴露 3306 埠的場景,

Rainbond網關配置
在 Rainbond 一側,需要在網關策略中,為 Mysql 一鍵開啟如下的設定:

對上述配置作出如下解釋:
- 埠號: 3306 # Mysql 業務監聽的埠
- 埠協議: mysql # 業務埠協議,可選值包括 TCP、UDP、HTTP、MYSQL、Grpc,此處 MYSQL 可以理解為 TCP中的一種
- 對外服務: 開啟 # 用戶通過開啟此開關來將 Mysql 的 3306 埠對外暴露服務
- 訪問策略: 0.0.0.0:10001 # 網關的代理策略,這里意味著將 Mysql 的 3306 埠,通過所有網關節點的 10001 埠對外代理
負載均衡配置
在負載均衡一側,則需要添加一段 Nginx 配置,將所有網關的 10001 埠,通過四層代理,對外暴露,
Nginx 的組態檔,需要在最頂層創建一個 stream{} 塊,這一句翻譯自 Nginx 官方檔案,實際操作時,其意義是不要將 stream 放入到 http 塊中去,
繼續在 stream{}塊中分別創建 upstream{} 和 server{} 塊,
stream {
upstream lbserver {
server 192.168.0.1:10001;
server 192.168.0.2:10001;
server 192.168.0.3:10001;
}
server {
listen 10001;
proxy_pass lbserver;
proxy_connect_timeout 1s;
proxy_timeout 3s;
}
}
重新加載組態檔之后,就可以通過 Nginx 對外IP地址的 10001 埠,訪問到 Mysql 業務的 3306 埠了,
L7負載均衡
L7負載均衡,一般用于 Http 業務的處理,當我們希望通過一個域名,可以訪問到部署在 Rainbond 上的 Http 業務時,這種用法就會派上用場,接下來聊一聊如何在負載均衡上,處理 Http 請求,
實際上,Rainbond 的網關節點也是一種負載均衡,網關節點負載均衡是為了將流量分發到運行于 Rainbond 集群中的業務實體上去,根據網關所使用的負載均衡策略,我們可以在使用 L7負載均衡的情況下,繼續細分兩種場景:
- 網關使用 L4 負載均衡
- 網關使用 L7 負載均衡
而這兩種場景下,我們都希望通過一個決議到 Nginx 負載均衡對外 IP 地址的域名,訪問到部署于 Rainbond 集群中的 web 服務,假定這個域名是 index.guox.grapps.cn .
網關使用 L4 負載均衡

網關使用 L4 負載均衡時,Rainbond 一側的配置是不需要進行調整的,接下來的用例,我使用一個作業于 80 埠的 web 服務作為示例,依然在 tcp 協議下,開啟訪問策略,

此時,web 服務的 80 埠會通過網關的 10002 埠暴露出來,
而在 Nginx 負載均衡一側,則需要基于域名配置一個虛擬服務器(Virtual Servers),并將所有的網關節點的 10002 埠作為這一虛擬服務器的上游,
Nginx 的組態檔,在 http{} 塊中進行配置,分別創建 server{} 和 upstream{},
upstream lbserver {
server 192.168.0.1:10002;
server 192.168.0.2:10002;
server 192.168.0.3:10002;
}
server {
listen 80;
server_name index.guox.grapps.cn;
location / {
proxy_pass http://lbserver;
}
}
重新加載組態檔后,訪問 http://index.guox.grapps.cn/ 就可以訪問到 web 服務的主頁,
網關使用 L7 負載均衡

網關使用 L7 負載均衡時,我們需要為 web 服務的 80 埠系結目標域名,在埠協議為 http 時,點擊添加域名即可添加目標域名,

即使這個域名并沒有直接決議到 Rainbond 的網關上,我們依然需要系結這個域名,因為 Rainbond 網關在 7 層作業時,需要通過域名來決定將流量轉發到哪個服務實體上去,
那么如何將這個域名資訊傳遞到 Rainbond 網關上去呢?答案是 proxy_set_header HOST $host, Nginx 負載均衡在接受到帶有指定域名的請求時,可以將域名資訊編輯到 header 資訊中向后方的 Rainbond 網關傳遞,
Nginx 的組態檔需要添加這一配置,
upstream lbserver {
server 192.168.0.1:80;
server 192.168.0.2:80;
server 192.168.0.3:80;
}
server {
listen 80;
server_name index.guox.grapps.cn;
location / {
proxy_pass http://lbserver;
proxy_set_header HOST $host # 將域名資訊保存在 HOST 傳遞給下一層代理
}
}
優劣對比
L7 作為更高級的協議,提供了埠復用、TLS加密以及基于HTTP協議實作的各種高級功能,L4 是更通用的協議,所有基于 TCP/IP 協議堆疊實作的業務都可以使用,對于最外層的 Nginx 負載均衡而言,無論是 L4 還是 L7 都有各自合適的使用場景,所以并沒有優劣之分,用戶根據自己的需要被訪問的業務型別判斷:Http 業務使用 L7,其余情況使用 L4 ,
但是,在最外層的 Nginx 使用 L7 負載均衡時,對于 Rainbond 網關使用哪一層的負載均衡策略是有區別的,在這里我推薦網關使用 L4 負載均衡,因為在實作同樣效果的前提下,L4 比 L7 的開銷更小,
一點擴展
當為一個基于 http 協議作業的埠開啟對外服務的時候,Rainbond 會默認生成一個可以被直接訪問的域名,比如下圖中的 http://80.gr6538fd.0c9yg42x.695d35.grapps.cn/ ,但是我們今天并沒有探討直接通過網關分配域名的訪問方式,關于這個自動生成域名的實作機制,感興趣的同學請關注 詳解 Rainbond Ingress 泛決議域名機制 ,
在 Rainbond 網關策略管理中,對同一個埠,是可以同時系結多個訪問策略的,下圖中既有基于域名的 L7 訪問策略,也有基于 IP 埠轉發的 L4 訪問策略,

Rainbond是一個開源的云原生應用管理平臺,使用簡單,不需要懂容器和Kubernetes,支持管理多個Kubernetes集群,提供企業級應用的全生命周期管理,功能包括應用開發環境、應用市場、微服務架構、應用持續交付、應用運維、應用級多云管理等,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/375823.html
標籤:其他
上一篇:dhcp實驗
