Gateway API替代Ingress
Gateway API 核心組件與應用場景詳解
Gateway API 是 Kubernetes 社區為標準化服務網絡流量管理而設計的下一代 API,相比傳統的 Ingress,它提供了更豐富、更靈活的流量控制能力。以下是 Gateway API 的核心組件及其應用場景的詳細介紹:
一、Gateway API 核心資源組件
1. GatewayClass(網關類)
- 作用:定義網關的實現類型,將 Gateway 與特定的控制器(如 Istio、Contour)綁定。
- 應用層級:集群級資源,由集群管理員創建和管理。
- 關鍵字段:
controllerName:指定實現網關的控制器(如istio.io/gateway-controller)。
- 示例:
yaml
apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: istio spec: controllerName: istio.io/gateway-controller
2. Gateway(網關)
- 作用:定義流量入口點(如端口、協議、TLS),是實際運行的網關實例。
- 應用層級:命名空間級資源,通常由平臺團隊部署。
- 關鍵字段:
gatewayClassName:引用 GatewayClass。listeners:定義監聽的端口、協議和路由綁定規則。
- 示例:
yaml
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: bookinfo-gateway spec: gatewayClassName: istio listeners: - name: http port: 80 protocol: HTTP
3. HTTPRoute/TCPRoute/UDPRoute/TLSRoute(路由規則)
- 作用:定義具體的流量匹配和轉發規則,綁定到 Gateway。
- 應用層級:命名空間級資源,由應用團隊部署。
- 關鍵字段:
parentRefs:引用要綁定的 Gateway。matches:定義匹配條件(如路徑、Header、方法)。backendRefs:指定轉發的目標服務。
- 示例(HTTPRoute):
yaml
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: bookinfo-route spec: parentRefs: - name: bookinfo-gateway rules: - matches: - path: { type: PathPrefix, value: /productpage } backendRefs: - name: productpage port: 9080
4. ReferenceGrant(引用授權)
- 作用:允許跨命名空間的路由引用(如不同命名空間的 Gateway 和 HTTPRoute)。
- 應用層級:命名空間級資源,用于解決跨命名空間訪問的權限問題。
- 示例:
yaml
apiVersion: gateway.networking.k8s.io/v1alpha2 kind: ReferenceGrant metadata: name: allow-cross-namespace namespace: gateway-ns # Gateway 所在命名空間 spec: from: - group: gateway.networking.k8s.io kind: HTTPRoute namespace: apps-ns # HTTPRoute 所在命名空間 to: - group: "" kind: Service
二、組件間的關系與工作流程
plaintext
客戶端請求 → GatewayClass(控制器) → Gateway(監聽配置) → HTTPRoute(匹配規則) → Service(后端服務)
- 集群管理員創建 GatewayClass,指定使用的控制器(如 Istio)。
- 平臺團隊部署 Gateway,引用特定的 GatewayClass,并配置監聽端口。
- 應用團隊創建 HTTPRoute,綁定到 Gateway,并定義流量轉發規則。
- 可選:如果 HTTPRoute 和 Gateway 不在同一命名空間,需創建 ReferenceGrant 授權。
三、應用場景與最佳實踐
1. 基礎流量路由
- 場景:將不同路徑的請求轉發到不同服務。
- 配置:使用 HTTPRoute 的
matches和backendRefs。 - 示例:
yaml
rules: - matches: - path: { type: PathPrefix, value: /api/v1 } backendRefs: - name: api-service port: 8080 - matches: - path: { type: PathPrefix, value: /web } backendRefs: - name: web-service port: 80
2. 流量拆分(A/B 測試、灰度發布)
- 場景:按比例將流量分發到不同版本的服務。
- 配置:使用
backendRefs的weight字段。 - 示例:
yaml
backendRefs: - name: service-v1 port: 8080 weight: 90 # 90% 流量到 v1 - name: service-v2 port: 8080 weight: 10 # 10% 流量到 v2
3. 基于 Header 的路由
- 場景:根據請求 Header 分發流量(如用戶分組)。
- 配置:使用
matches.headers。 - 示例:
yaml
matches: - headers: - name: user-group value: beta path: type: PathPrefix value: /
4. TLS 終止與加密
- 場景:在網關層處理 HTTPS 請求。
- 配置:在 Gateway 的
listeners中添加 TLS 配置。 - 示例:
yaml
listeners: - name: https port: 443 protocol: HTTPS tls: certificateRefs: - kind: Secret name: tls-cert
5. 跨命名空間路由
- 場景:不同命名空間的服務需要通過同一網關暴露。
- 配置:使用 ReferenceGrant 授權跨命名空間引用。
- 示例:
yaml
# 在網關命名空間創建 ReferenceGrant spec: from: - group: gateway.networking.k8s.io kind: HTTPRoute namespace: apps-ns to: - group: "" kind: Service
四、與傳統 Ingress 的對比
| 特性 | Gateway API | 傳統 Ingress |
|---|---|---|
| 資源模型 | 多資源協作(GatewayClass、Gateway、Route) | 單一 Ingress 資源 |
| 命名空間支持 | 支持跨命名空間引用(需 ReferenceGrant) | 通常限于同一命名空間 |
| 路由規則 | 更豐富(路徑、Header、方法、權重) | 主要基于路徑前綴 |
| 協議支持 | HTTP、TCP、UDP、TLS | 主要 HTTP,TCP 支持有限 |
| 流量策略 | 可擴展(通過 Policy 資源) | 有限(依賴控制器特定注解) |
| API 演進 | 標準化、版本化設計 | 碎片化、控制器特定實現 |
五、生產環境部署建議
-
權限分離:
- 集群管理員管理 GatewayClass
- 平臺團隊部署和維護 Gateway
- 應用團隊創建和管理 Route
-
漸進式遷移:
- 在現有 Ingress 基礎上逐步引入 Gateway API
- 使用雙網關共存進行測試
-
監控與日志:
- 配置 Gateway API 資源的狀態監控
- 收集 Envoy 或其他網關控制器的訪問日志
-
安全加固:
- 限制 Route 只能引用授權的 Service
- 使用 TLS 加密所有外部流量
六、主流實現與支持情況
- Istio:從 1.18 版本開始支持 Gateway API,逐步替代自定義資源。
- Contour:完全支持 Gateway API。
- NGINX:通過 Gateway API 控制器提供支持。
- Traefik:開發中,計劃支持。
總結
Gateway API 通過分層設計(GatewayClass → Gateway → Route)和更豐富的路由規則,解決了傳統 Ingress 的局限性,提供了更靈活、更安全的流量管理方案。它特別適合大型復雜集群、多團隊協作的場景,是 Kubernetes 流量管理的未來標準。
k3s集群需手動安裝 Gateway API CRD
可以通過以下命令在 K3s 中安裝 Gateway API CRD:
bash
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
驗證安裝:
bash
kubectl get crd | grep gateway
# 應看到 gatewayclasses、gateways、httproutes 等資源
問題一:如果使用 Gateway API 加上 nginx ingress controller, 是否可以替代 istio? 比如按流量百分比分發類似的功能?
回答一:
是的,Gateway API + NGINX Ingress Controller 可以部分替代 Istio 的功能,包括按流量百分比分發(灰度發布)。但兩者的定位和能力范圍有所不同,需要根據具體需求權衡。
一、功能對比
| 功能 | Gateway API + NGINX | Istio |
|---|---|---|
| 流量分發 | ? 支持按百分比分發(通過 weight 字段) |
? 更豐富的流量策略(權重、Header、Cookie) |
| 協議支持 | ? HTTP、HTTPS、TCP | ? 全協議支持(HTTP、TCP、gRPC、MQTT 等) |
| 可觀測性 | ? 基礎指標(需額外集成 Prometheus) | ? 內置分布式追蹤、指標、日志 |
| 安全 | ? TLS 終止、簡單認證 | ? mTLS、細粒度訪問控制、JWK 驗證 |
| 服務網格能力 | ? 僅邊緣網關功能 | ? 全網狀流量管理(內部服務間通信) |
| API 復雜度 | ? 標準化 API(Gateway API) | ? 自定義 CRD(學習成本較高) |
二、流量百分比分發實現
使用 Gateway API + NGINX 可以通過 HTTPRoute 實現流量百分比分發,示例如下:
yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: traffic-split
spec:
parentRefs:
- name: nginx-gateway # 引用NGINX Gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: service-v1
port: 80
weight: 90 # 90%流量到v1版本
- name: service-v2
port: 80
weight: 10 # 10%流量到v2版本
關鍵點:
- weight 字段:控制流量分配比例(總和為 100)。
- NGINX 支持:確保使用的 NGINX Ingress Controller 版本支持 Gateway API(如 v1.7+)。
- 部署方式:需先安裝 Gateway API CRD,再部署支持 Gateway API 的 NGINX 控制器。
三、替代場景分析
1. 可以替代的場景
- 僅需邊緣網關功能:如果只需要對外暴露服務,處理外部流量(如 Web 應用入口),不需要管理內部服務間通信。
- 輕量級部署:Istio 對資源要求較高(需部署多個組件),而 NGINX 更輕量。
- 標準化優先:Gateway API 是 Kubernetes 社區標準,未來兼容性更好。
2. 不可替代的場景
- 全網狀流量管理:需要管理集群內所有服務間的通信(如微服務間的重試、熔斷、負載均衡)。
- 深度可觀測性:需要自動收集服務間調用鏈路(如 Jaeger 追蹤)、細粒度指標。
- 多集群 / 多協議支持:需要跨集群流量分發或支持非 HTTP 協議(如 gRPC、TCP)。
四、混合方案建議
如果需要部分 Istio 功能(如網格內流量管理),同時希望利用 Gateway API 的標準化,可以采用 混合架構:
- 邊緣網關層:使用 Gateway API + NGINX 處理外部流量。
- 內部服務層:使用 Istio 管理服務間通信。
這種方案結合了兩者的優勢,但需要注意:
- 避免功能重疊導致復雜性增加。
- 確保兩個系統的配置協調一致(如 TLS 證書管理)。
五、總結
Gateway API + NGINX Ingress Controller 可以滿足基礎的流量百分比分發需求,但如果需要完整的服務網格功能(如內部流量治理、深度可觀測性),Istio 仍是更合適的選擇。選擇時需根據實際需求、團隊技術棧和資源限制綜合評估。

浙公網安備 33010602011771號