本文介紹了 Gateway API 這個將服務暴露到叢集之外的全新規範,並且介紹瞭如何在 APISIX Ingress Controller 中使用它。
作者@lingsamuel,API7.ai 雲原生技術專家,Apache APISIX Committer。
Gateway API 是除原生 Service 與 Ingress 之外,APISIX 社群發起的獨立規範,幫助使用者將 Kubernetes 中的服務暴露到叢集之外,由 sig-network (特別興趣小組)管理。
Gateway API 支援大部分常用網路協議(HTTP、TCP、UDP 等)和對 TLS 的支援。此外,Gateway API 中的 Gateway 資源能夠透過 Kubernetes API 來管理代理和閘道器的生命週期。
隨著 Gateway API 被廣泛實現與應用,Gateway API 釋出了 v0.5.0 版本。在該版本中,一些核心 API 首次進入 Beta 階段,包括:GatewayClass、Gateway、HTTPRoute。
Gateway API 優勢盤點
Gateway API 不僅是 Ingress 的功能父集,還具有如下改進:
- 面向角色:Gateway 由一組 API 資源組成,不同的 API 資源代表了使用與配置 Kubernetes 網路資源的不同角色。
- 表現力強:Gateway API 的核心功能包含基於 Header 匹配、流量加權以及以及其他部分由 annotations 實現的非標準化功能。
- 可擴充套件:Gateway API 允許不同資源在不同層級一同使用。這使得能夠對 API 結構進行更精細化的控制。
此外,Gateway API 還包含了可移植、閘道器共享與跨名稱空間引用等特性。
如下圖所示,面向角色的設計使不同團隊之間可以共享叢集內部的網路基礎設施,和叢集管理員設定的策略與約束。由此,基礎設施提供方、叢集管理員、應用開發者等各種身份的角色可以只專注自己的工作,無需對其他角色負責。
不同的角色配置不同層級的 Gateway API 資源,這些資源相互配合,共同作用:
如何在 APISIX Ingress 中使用 Gateway API
1 安裝 Gateway API CRD
要使用 Gateway API,需要先安裝 Gateway API 的 CRD,有兩種安裝方式:APISIX Ingress Controller 倉庫下的副本或官方倉庫 kubernetes-sigs/gateway-api。
此處以 APISIX Ingress Controller 倉庫的 CRD 副本為例,安裝命令如下:
git pull git@github.com:apache/apisix-ingress-controller.git
cd apisix-ingress-controller
kubectl apply -f ./samples/deploy/gateway-api/
2 安裝 APISIX Ingress Controller
在 APISIX Ingress Controller 中,預設不啟用 Gateway API 支援,可透過引數 --enable-gateway-api=true
啟用。隨後在使用 Helm 安裝時,可透過配置 values 來啟用。
APISIX 與 APISIX Ingress Controller 安裝命令如下:
helm repo add apisix https://charts.apiseven.com
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
kubectl create ns apisix-ingress
helm install apisix apisix/apisix --namespace apisix-ingress \
--set gateway.type=NodePort \
--set ingress-controller.enabled=true \
--set ingress-controller.config.apisix.serviceNamespace=apisix-ingress \
--set ingress-controller.config.kubernetes.enableGatewayAPI=true
引數 --set ingress-controller.config.kubernetes.enableGatewayAPI=true
用於開啟 Gateway API 支援。
這些命令將在 apisix-ingress
名稱空間下建立完整的測試環境,包括 APISIX、etcd 與 APISIX Ingress Controller。
3 部署測試負載
使用 kennethreitz/httpbin
映象作為測試負載。
在預設名稱空間下部署這些負載,安裝命令如下:
kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80
4 配置 HTTPRoute
目前,APISIX Ingress Controller 支援 v1alpha2
版本的 Gateway API 資源。
在測試時,使用如下 HTTPRoute 配置,將其儲存到 httproute.yaml
檔案中:
# httproute.yaml
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: basic-http-route
spec:
hostnames:
- local.httpbin.org
rules:
- backendRefs:
- name: httpbin
port: 80
matches:
- path:
type: PathPrefix
value: /
部署該 HTTPRoute 配置:
kubectl apply -f ./httproute.yaml
5 驗證
在 APISIX 的 Pod 中直接驗證,執行以下命令:
kubectl -n apisix-ingress exec -it \
$(kubectl -n apisix-ingress get Pods -l "app.kubernetes.io/name=apisix" -o name) -c apisix -- \
curl -H "Host: local.httpbin.org" localhost:9080/ip
預期輸出為:
{
"origin": "127.0.0.1"
}
由此,配置成功生效。
APISIX Ingress 對 Gateway API 的支援狀態
APISIX Ingress Controller 正在對 Gateway API 新增支援,現已處於 Alpha 階段,支援 HTTPRoute、TCPRoute 等資源。
目前 Gateway API 已更新至 v0.5.1 版本,但對於 Gateway 與 Gateway Class 的支援還處於開發階段,因此目前這些資源的配置暫時不會生效。
總結
在本文中,我們介紹了 Gateway API 這個將服務暴露到叢集之外的全新規範,並且介紹瞭如何在 APISIX Ingress Controller 中使用它。APISIX Ingress Controller 對 Gateway API 的完整支援仍在積極開發中,歡迎感興趣的朋友參與貢獻。