詳解 Rainbond Ingress 泛解析域名機制

Rainbond 作爲一款雲原生應用管理平臺,天生帶有引導南北向網絡流量的分佈式網關 rbd-gateway。區別於一般的 Ingress 配置中,用戶需要自行定義域名的使用體驗,Rainbond 的網關策略可以一鍵自動生成域名訪問策略,用戶通過這個域名可以立刻訪問到部署在 Rainbond 上的業務系統。這個使用體驗在開發測試場景下非常友好,這篇文章詳解了這一機制到底是如何實現的。

Gateway 與 Ingress

Rainbond 團隊開發了高性能分佈式網關組件 rbd-gateway,作爲集羣內部的 Ingress Controller 處理集羣南北流量。它同時支持 L4 和 L7 層協議,以及一鍵開啓 WebSocket 等高級功能。在使用它的時候,一個細節功能點非常好用,就是可以一鍵生成一個可以被訪問的域名地址。

image-20211202142555295

這個域名的格式詳解如下:

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/rainbond

官網:https://www.rainbond.com?channel=oschina

微信羣:請搜索添加羣助手微信號 wylhzmyj

釘釘羣:請搜索釘釘羣號 31096419

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章