Rainbond 作為一款雲原生應用管理平台,天生帶有引導南北向網絡流量的分布式網關 rbd-gateway。差別于一般的 Ingress 配置中,使用者需要自行定義域名的使用體驗,Rainbond 的網關政策可以一鍵自動生成域名通路政策,使用者通過這個域名可以立刻通路到部署在 Rainbond 上的業務系統。這個使用體驗在開發測試場景下非常友好,這篇文章詳解了這一機制到底是如何實作的。
Gateway 與 Ingress
Rainbond 團隊開發了高性能分布式網關元件 rbd-gateway,作為叢集内部的 Ingress Controller 處理叢集南北流量。它同時支援 L4 和 L7 層協定,以及一鍵開啟 WebSocket 等進階功能。在使用它的時候,一個細節功能點非常好用,就是可以一鍵生成一個可以被通路的域名位址。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SY2YWN1EmMwQGZ3Y2N2gjY0IDO0IjYzYzM3MTZllzYh9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
這個域名的格式詳解如下:
http://<servicePort>.<service_alias>.<tenant_name>.17a4cc.grapps.cn/
- servicePort: 通路政策對應的目标端口名稱
- service_alias: 目前服務元件的别名
- tenant_name: 目前團隊的别名
- .17a4cc.grapps.cn: 目前叢集的泛解析域名
實際上,這一條路由規則,是由 Kubernetes 中對應的 ingress 和 service 所定義的。整個通路鍊路可以歸納為下圖:
開啟 對外服務 開關,相當于自動生成了以下資源:
apiVersion:
v1
kind:
Service
metadata:
labels:
creator:
Rainbond
event_id:
""
name:
gr49d848ServiceOUT
port_protocol:
http
protocol:
http
rainbond.com/tolerate-unready-endpoints:
"true"
service_alias:
gr49d848
service_port:
"5000"
service_type:
outer
tenant_name:
2c9v614j
name:
service-8965-5000out
namespace:
3be96e95700a480c9b37c6ef5daf3566
spec:
clusterIP:
172.21
.7
.172
ports:
-
name:
tcp-5000
port:
5000
protocol:
TCP
targetPort:
5000
selector:
name:
gr49d848
sessionAffinity:
None
type:
ClusterIP
status:
loadBalancer:
{}
---
apiVersion:
extensions/v1beta1
kind:
Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/weight:
"100"
generation:
1
labels:
creator:
Rainbond
service_alias:
gr49d848
tenant_name:
2c9v614j
name:
3cf8d6bd89250eda87ac127c49694a05
namespace:
3be96e95700a480c9b37c6ef5daf3566
spec:
rules:
-
host:
5000.
gr49d848.2c9v614j.17a4cc.grapps.cn
http:
paths:
-
backend:
serviceName:
service-8965-5000out
servicePort:
5000
path:
/
status:
loadBalancer:
{}
自動生成域名
對于大多數開發者而言,域名算是一種稀缺資源,如何為自己茫茫多的 Ingress rule 配置設定域名,是一件很令人頭疼的事情。畢竟隻有擁有了自己的域名時,才能夠徹底掌控其解析的規則,避免無止境的修改
/etc/hosts
檔案。
市面上絕大多數 Kubernetes 管理工具都可以用半自動的方式生成 Service 與 Ingress資源。這種半自動的方式特指讓使用者在圖形化 UI 界面上,輸入必要的資訊後,由管理工具自行生成對應的 yaml 配置檔案,并加載到 Kubernetes 中去。但是對于所配置的域名,鮮有工具可以做到如 Rainbond 一樣的使用體驗。
達成這一優秀體驗的關鍵在于泛解析域名的使用。
對泛解析域名最簡單明了的解釋就是:符合
*.mydomain.com
這一規則的任意域名,都可以解析到同一個 IP 位址上去。在當下這一使用場景中,我們隻需要将泛解析域名
*.17a4cc.grapps.cn
解析到 rbd-gateway 所在的伺服器 IP 位址,就可以随意為
Ingress rule
配置符合規則的域名了。
Rainbond 在産品設計層面将
Ingress rule
和泛解析域名結合在了一起,自動為每個服務端口生成全局唯一的域名。并在叢集安裝時,自動向公網 DNS 伺服器注冊了解析記錄,叢集安裝完畢之後,所生成的所有域名,都是可以被公網解析的,隻要 PC 用戶端可以使用公網 DNS 服務,就可以解析域名,并通路到指定的服務端口。
Rainbond 通過不同的三級域名 (比如目前場景中的
17a4cc
)來區分不同的叢集。這裡涉及到關于泛解析域名的一個特點,子級域名的解析記錄,優先級高于父級域名的解析記錄。
===========================================
// 對兩級泛解析域名注冊解析記錄
*.grapps.cn =解析記錄注冊=> 1.1.1.1
*.17a4cc.grapps.cn =解析記錄注冊=> 2.2.2.2
===========================================
===========================================
// 用戶端解析結果
abc.grapps.cn =解析 IP 位址=> 1.1.1.1
abc.def.grapps.cn =解析 IP 位址=> 1.1.1.1
abc.17a4cc.grapps.cn =解析 IP 位址=> 2.2.2.2 // 優先使用 *.17a4cc.grapps.cn 的解析記錄
是一個開源的雲原生應用管理平台,使用簡單,不需要懂容器和Kubernetes,支援管理多個Kubernetes叢集,提供企業級應用的全生命周期管理,功能包括應用開發環境、應用市場、微服務架構、應用持續傳遞、應用運維、應用級多雲管理等。
Github:
https://github.com/goodrain/rainbond官網:
https://www.rainbond.com?channel=aliyun微信群:請搜尋添加群助手微信号
wylhzmyj
釘釘群:請搜尋釘釘群号
31096419