Gateway API 作為新一代的流量管理標準,對原有 Ingress 的擴充套件不規範、移植性差等問題做出了改進。從相容K8s生態和優化閘道器體驗出發,Rainbond 支援以外掛的形式擴充套件平臺閘道器能力,目前已經有多家社群提供了 Gateway API 的實現,將其製作成平臺外掛後,一鍵部署後即可在平臺中使用拓展閘道器能力。我們可以製作不同的閘道器實現外掛來應對不同的場景和需求,同時可以將自己製作的外掛釋出到應用商店供大家使用。
本篇文章將以 Envoy Gateway 為例詳細介紹如何製作並行布你的 Kubernetes Gateway API 外掛。最後釋出到開源應用商店的 Gateway API 外掛將可以被其他使用者使用,同時積极參與貢獻也有機會獲得由我們提供的小禮品。
Rainbond 版本大於 v5.13
Rainbond 已經對接過開源應用商店並擁有推播許可權
在 Rainbond 中,之前僅支援內建閘道器,應用定義好路由規則後,外部流量即可直接存取到對應應用。而 Gateway API 是以外掛和能力擴充套件的形式與平臺進行結合的。在平臺中,只有安裝了 Gateway API 自定義資源以及至少有一個閘道器實現後,才可以擴充套件平臺閘道器能力。
如下圖所示,如果 App 4
、App 5
等應用想要使用支援 Gateway API 的閘道器實現,那麼首先需要定義 Gateway API 的相關資源,而這類資源是由 Gateway API 基礎資源外掛
提供的,它主要包含了 Gateway API 資源型別的定義以及相關的 WebHook 資源。同時它在平臺上暴露了 GatewayClass 和 Gateway 型別的資源,在平臺能力擴充套件中可以看到。這樣使用者可以自定義閘道器行為和設定。
因此我們只需要製作一個閘道器外掛,即可讀取 Gateway 型別的資源並生成對應的設定,向外提供閘道器能力。目前 Gateway API 已有多種實現,如 Envoy、Nginx、Istio 等。這裡我們選擇 Envoy 作為閘道器,這樣外部流量進入 Envoy後,即可根據對應的路由策略到達 App 4
等應用上。
實現 Gateway API 外掛的完整流程如上圖所示,主要分為以下五步:
下面將會針對這幾個步驟詳細說明。
在製作下游閘道器實現外掛之前,我們需要安裝 Gateway API 基礎的 CRD 和控制器等資源,平臺已經將這些資源打包成外掛應用上架到開源應用商店。我們只需要在 平臺管理->應⽤市場->開源應⽤商店->搜尋 GatewayAPI-Base 並進行安裝即可,由於 Gateway API 中 RBAC 相關資源對名稱空間有依賴,所以我們需要在安裝時,新建一個團隊,團隊英文名設定為 gateway-system
,這樣將會將其安裝至 gateway-system
名稱空間下,最好單獨建立⼀個應⽤,應⽤的名稱⻅名知意,便於後期管理。
k8s Gateway API 實現列表中有多個實現,製作的話可以去這裡挑選,由於目前 k8s Gateway API 目前 HttpRoute 已支援到 Beta 版本,所以我們需要挑選 HTTPRoute 資源支援到 beta 版本的下游實現,如 Istio 、Cilium 、Kong 等。由於 Envoy Gateway 已支援到 Beta 版本,所以我們本次使用其作為閘道器外掛的擴充套件。
挑選好實現後,你可以在實現的官網中看到如何安裝實現,拿 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
將整理好的資源 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,如果不存在則不展示。
完成以上操作後,我們需要進行測試,主要檢查以下幾項。
如果想將該閘道器實現作為平臺閘道器外掛進行釋出,那麼還需要準備標誌應用為外掛的 RBDPlugin 資源,定義好該資源後,才可以在平臺管理->外掛
中檢視到該外掛並進行管理。範例如下:
apiVersion: rainbond.io/v1alpha1
kind: RBDPlugin
metadata:
name: RBDPlugin 資源名稱
spec:
alias: 外掛別名
author: 外掛製作人
description: 外掛簡介
icon: 外掛圖示
version: 外掛版本
定義好該資源後,我們可以進行釋出了,在應用拓撲圖頁面,點選左側釋出
按鈕,選擇釋出到雲應用商店
,即可將其釋出到開源應用商店。
釋出到開源應用商店的外掛或應用,我們需要登入開源應用商店編輯其資訊並上架後,該應用才可被其他使用者檢視和使用。可以參考如何分享外掛或應用到 Rainbond 應用商店。
登入完成後點選右上角控制檯,選擇管理應用。這時候應該可以看到剛剛釋出的 Envoy 外掛。點選應用名稱進入詳情頁面,此時需要編輯應用的名稱、Logo、詳細資訊。
當應用基礎資訊補充完成後,我們需要為其新增一個套餐,才可以上架。套餐在這裡的作用主要是將應用的版本管理起來。使用者使用不同的套餐安裝的版本也不同。
在補充完應用的基本資訊和套餐後,就可以準備上架了。只有上架的應用才可以被其他使用者瀏覽和使用。回到管理應用的頁面,選擇上架即可。
我們可以在開源應用商店檢視到我們製作的閘道器外掛,如下圖所示,其餘使用者也可以在 Rainbond 中一鍵部署使用,具體使用可以參考 Gateway API 使用檔案。