Rainbond 作為一款雲原生應用管理平臺,天生帶有引導南北向網路流量的分散式閘道器 rbd-gateway。區別於一般的 Ingress 配置中,使用者需要自行定義域名的使用體驗,Rainbond 的閘道器策略可以一鍵自動生成域名訪問策略,使用者通過這個域名可以立刻訪問到部署在 Rainbond 上的業務系統。這個使用體驗在開發測試場景下非常友好,這篇文章詳解了這一機制到底是如何實現的。
Gateway 與 Ingress
Rainbond 團隊開發了高效能分散式閘道器元件 rbd-gateway,作為叢集內部的 Ingress Controller 處理叢集南北流量。它同時支援 L4 和 L7 層協議,以及一鍵開啟 WebSocket 等高階功能。在使用它的時候,一個細節功能點非常好用,就是可以一鍵生成一個可以被訪問的域名地址。
這個域名的格式詳解如下:
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 的解析記錄
Rainbond是一個開源的雲原生應用管理平臺,使用簡單,不需要懂容器和Kubernetes,支援管理多個Kubernetes叢集,提供企業級應用的全生命週期管理,功能包括應用開發環境、應用市場、微服務架構、應用持續交付、應用運維、應用級多雲管理等。
Github:https://github.com/goodrain/r...
官網:https://www.rainbond.com?chan...
微信群:請搜尋新增群助手微訊號 wylhzmyj
釘釘群:請搜尋釘釘群號 31096419