APISIX Ingress 對 Gateway API 的支援和應用

Apache_APISIX發表於2022-12-29

本文介紹了 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 的完整支援仍在積極開發中,歡迎感興趣的朋友參與貢獻。

相關文章