Rainbond的 Gateway API 外掛製作實踐

Rainbond發表於2023-03-28

Gateway API 作為新一代的流量管理標準,對原有 Ingress 的擴充套件不規範、移植性差等問題做出了改進。從相容K8s生態和最佳化閘道器體驗出發,Rainbond 支援以外掛的形式擴充套件平臺閘道器能力,目前已經有多家社群提供了 Gateway API 的實現,將其製作成平臺外掛後,一鍵部署後即可在平臺中使用擴充閘道器能力。我們可以製作不同的閘道器實現外掛來應對不同的場景和需求,同時可以將自己製作的外掛釋出到應用商店供大家使用。

本篇文章將以 Envoy Gateway 為例詳細介紹如何製作併發布你的 Kubernetes Gateway API 外掛。最後釋出到開源應用商店的 Gateway API 外掛將可以被其他使用者使用,同時積極參與貢獻也有機會獲得由我們提供的小禮品。

前提條件

  • Rainbond 版本大於 v5.13

  • Rainbond 已經對接過開源應用商店並擁有推送許可權

Rainbond 與 Gateway API 整合機制

在 Rainbond 中,之前僅支援內建閘道器,應用定義好路由規則後,外部流量即可直接訪問到對應應用。而 Gateway API 是以外掛和能力擴充套件的形式與平臺進行結合的。在平臺中,只有安裝了 Gateway API 自定義資源以及至少有一個閘道器實現後,才可以擴充套件平臺閘道器能力。

如下圖所示,如果 App 4App 5等應用想要使用支援 Gateway API 的閘道器實現,那麼首先需要定義 Gateway API 的相關資源,而這類資源是由 Gateway API 基礎資源外掛提供的,它主要包含了 Gateway API 資源型別的定義以及相關的 WebHook 資源。同時它在平臺上暴露了 GatewayClass 和 Gateway 型別的資源,在平臺能力擴充套件中可以看到。這樣使用者可以自定義閘道器行為和配置。

因此我們只需要製作一個閘道器外掛,即可讀取 Gateway 型別的資源並生成對應的配置,向外提供閘道器能力。目前 Gateway API 已有多種實現,如 Envoy、Nginx、Istio 等。這裡我們選擇 Envoy 作為閘道器,這樣外部流量進入 Envoy後,即可根據對應的路由策略到達 App 4 等應用上。

製作自定義閘道器外掛的步驟

實現 Gateway API 外掛的完整流程如上圖所示,主要分為以下五步:

  1. 部署 Gateway API 基礎資源:目前 Gateway API 主要由一系列自定義資源(CRD)組成,在叢集中使用其能力時,需要先部署這些基礎資源,才能使叢集識別該型別的資源。
  2. 選擇 Gateway API 閘道器實現:目前 Gateway API 已有多家 下游實現,這些閘道器實現都可以自由選擇,提供對外服務的能力。
  3. 平臺部署閘道器並測試:需要將閘道器實現轉化為平臺資源進行部署測試。只有這樣最後才可以一鍵釋出到開源應用商店供他人使用。
  4. 製作和釋出外掛:定義外掛相關後設資料,併發布到開源應用商店。
  5. 完善外掛資訊並上架:完善外掛的介紹後,可以讓使用者更好的使用該外掛。

下面將會針對這幾個步驟詳細說明。

部署 Gateway API 基礎資源

在製作下游閘道器實現外掛之前,我們需要安裝 Gateway API 基礎的 CRD 和控制器等資源,平臺已經將這些資源打包成外掛應用上架到開源應用商店。我們只需要在 平臺管理->應⽤市場->開源應⽤商店->搜尋 GatewayAPI-Base 並進行安裝即可,由於 Gateway API 中 RBAC 相關資源對名稱空間有依賴,所以我們需要在安裝時,新建一個團隊,團隊英文名設定為 gateway-system,這樣將會將其安裝至 gateway-system 名稱空間下,最好單獨建立⼀個應⽤,應⽤的名稱⻅名知意,便於後期管理。

選擇 Gateway API 閘道器實現

k8s Gateway API 實現列表中有多個實現,製作的話可以去這裡挑選,由於目前 k8s Gateway API 目前 HttpRoute 已支援到 Beta 版本,所以我們需要挑選 HTTPRoute 資源支援到 beta 版本的下游實現,如 IstioCiliumKong 等。由於 Envoy Gateway 已支援到 Beta 版本,所以我們本次使用其作為閘道器外掛的擴充套件。

在Rainbond上部署並測試

挑選好實現後,你可以在實現的官網中看到如何安裝實現,拿 envoy 為例,envoy 官網給出了兩組 Yaml 如下:

kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v0.3.0/install.yaml
kubectl apply -f https://raw.githubusercontent.com/envoyproxy/gateway/v0.3.0/examples/kubernetes/http-routing.yaml
  • install.yaml 此 YAML 檔案中存放的便是我們外掛所需的基礎資源。
  • http-routing.yaml 這個 YAML 檔案我們需要進行處理,只保留我們外掛所需的 GatewayClass 資源和 Gateway 資源,HttpRoute 資源不需要保留,在平臺定義閘道器策略後將會自動生成。

將整理好的資源 YAML 後,在應用檢視的 k8s 資源管理處建立,功能位置:應用檢視 ---> k8s 資源 ---> 新增

⚠️注意:如果有RoleBinding 等需要標識名稱空間的資源,則需要確保標識的名稱空間和當前上傳的團隊所對應的名稱空間是否一致,以免造成許可權不足等問題,示例如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
...
subjects:
- kind: ServiceAccount
  name: certgen
  namespace: envoy-gateway-system

上傳建立完成後,我們還需要在 平臺管理檢視->擴充套件->能力 中處理一下 Gateway 資源,將閘道器的 Service 名稱或字首標記出來,後續在建立 HTTP 策略的時候便可獲取並展示你的域名解析地址。

labels:
    service-name: envoy-envoy-gateway-system-envoy

NodePort 是從節點上獲取的 IP ,預設為 NodeInternalIP ,如果存在 NodeExternalIP 則優先使用 NodeExternalIP 。

LoadBalancerIP 是從 Service 資源上的 ExternalIPs 獲取IP,如果不存在則不展示。

完成以上操作後,我們需要進行測試,主要檢查以下幾項。

  1. 檢查元件是否都執行正常,狀態是否都為執行中。
  2. 檢查應用下的 k8s 資源是否都建立成功。
  3. 當所有資源的狀態都正常後,參考 Gateway API 閘道器使用文件進行使用測試,檢視是否可以正常使用。

製作和釋出外掛

如果想將該閘道器實現作為平臺閘道器外掛進行釋出,那麼還需要準備標誌應用為外掛的 RBDPlugin 資源,定義好該資源後,才可以在平臺管理->外掛中檢視到該外掛並進行管理。示例如下:

apiVersion: rainbond.io/v1alpha1
kind: RBDPlugin
metadata:
  name: RBDPlugin 資源名稱
spec:
  alias: 外掛別名
  author: 外掛製作人
  description: 外掛簡介
  icon: 外掛圖示
  version: 外掛版本

定義好該資源後,我們可以進行釋出了,在應用拓撲圖頁面,點選左側釋出按鈕,選擇釋出到雲應用商店,即可將其釋出到開源應用商店。

完善外掛資訊並上架

釋出到開源應用商店的外掛或應用,我們需要登入開源應用商店編輯其資訊並上架後,該應用才可被其他使用者檢視和使用。可以參考如何分享外掛或應用到 Rainbond 應用商店

登入完成後點選右上角控制檯,選擇管理應用。這時候應該可以看到剛剛釋出的 Envoy 外掛。點選應用名稱進入詳情頁面,此時需要編輯應用的名稱、Logo、詳細資訊。

當應用基礎資訊補充完成後,我們需要為其新增一個套餐,才可以上架。套餐在這裡的作用主要是將應用的版本管理起來。使用者使用不同的套餐安裝的版本也不同。

在補充完應用的基本資訊和套餐後,就可以準備上架了。只有上架的應用才可以被其他使用者瀏覽和使用。回到管理應用的頁面,選擇上架即可。

最終效果

我們可以在開源應用商店檢視到我們製作的閘道器外掛,如下圖所示,其餘使用者也可以在 Rainbond 中一鍵部署使用,具體使用可以參考 Gateway API 使用文件。

相關文章