前言
Envoy Proxy 作為雲原生領域最重要的資料平面之一,功能強大但配置複雜度一直是初學者的痛點。2022 年五月 Envoy 社區宣布成立 Envoy Gateway 專案,目標是大幅降低使用 Envoy 作為 API 閘道的門檻。經過五個月開發,首個開源版本 v0.2 正式發布,本文將從架構設計、快速部署到 CRD 資源一一解析。
什麼是 Envoy Gateway?
Envoy Gateway 是一個用於管理 Envoy Proxy 的開源專案,可獨立使用或作為 Kubernetes 中應用程式的 API 閘道。它的核心特點包括:
- 通過 Gateway API 核心一致性測試,使用 Gateway API 作為唯一配置語言
- 支援
GatewayClass、Gateway、HTTPRoute和TLSRoute等資源 - 輕量級、開放、可動態編程,特別適合後端 API 閘道場景
- 為供應商提供建構增值產品的基礎平台
Envoy Gateway 架構解析
Envoy Gateway 的架構採用分層設計,主要包含以下元件:
配置流程
- Provider 配置:透過配置檔案提供靜態配置(目前支援 Kubernetes 和檔案方式),啟動後亦可透過 Kubernetes 動態配置
- 資源監視:Provider 中的資源監視器偵測到配置變更後,傳遞給資源轉譯器
- 中間表示轉譯:將配置分別轉譯為基礎設施管理器的中間表示(Infra IR)和 xDS 中間表示(xDS IR)
- 基礎設施管理:透過 CRUD 操作管理 Kubernetes Deployment、Service 等資源來運行 Envoy
- xDS 配置:xDS 管理器透過 xDS 協議配置 Envoy 代理
- 流量轉發:Envoy 代理依據配置將請求轉發到對應的後端服務
快速開始:在 Kubernetes 上部署 Envoy Gateway
環境需求
部署前請確認相容性:
| Envoy Gateway 版本 | Envoy Proxy 版本 | Gateway API 版本 | Kubernetes 最低版本 |
|---|---|---|---|
| v0.2.0 | v1.23+ | v0.5.1 | v1.24 |
安裝 Gateway CRD 與 Envoy Gateway
由於 Gateway API 並非 Kubernetes 預設安裝的元件,需手動部署:
kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v0.2.0/install.yaml
此指令會建立 envoy-gateway-system 和 gateway-system 兩個命名空間,同時建立一系列 CRD 以及 Envoy Gateway 運行所需的 ConfigMap、ServiceAccount、RBAC 等資源。
部署測試應用
kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v0.2.0/quickstart.yaml
這會建立 GatewayClass、Gateway、HTTPRoute 以及範例應用程式。
驗證安裝
透過 port-forward 存取 Envoy 服務:
# 取得 Envoy Service 名稱
ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system -l gateway.envoyproxy.io/owning-gateway-name -o jsonpath='{.items[0].metadata.name}')
# 建立 port-forward
kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 8888:8080 &
# 測試請求
curl --verbose --header "Host: www.example.com" http://localhost:8888/get
看到 HTTP 200 回應及 JSON 內容,代表 Envoy Gateway 已成功安裝並正常運作。
若 Kubernetes 叢集部署在雲端環境,可直接使用 Load Balancer IP:
export GATEWAY_HOST=$(kubectl get svc/${ENVOY_SERVICE} -n envoy-gateway-system \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl --verbose --header "Host: www.example.com" http://$GATEWAY_HOST:8080/get
Envoy Gateway 使用的核心 CRD 解析
安裝過程中建立了多個 CRD,以下逐一介紹其用途:
GatewayClass
描述使用者可用於建立 Gateway 資源的一類閘道模板。建議將 GatewayClass 視為 Gateway 的範本,建立後的變更不會自動傳播到既有 Gateway。這是一個叢集層級的資源。
Gateway
代表服務流量處理基礎設施的實例,透過將 Listener 綁定到一組 IP 位址來運作。
HTTPRoute
提供路由 HTTP 請求的方法,支援透過主機名、路徑、Header 或查詢參數進行匹配,並可設定過濾器指定額外處理步驟。
TLSRoute / TCPRoute / UDPRoute
分別提供 TLS、TCP、UDP 層級的流量路由能力,搭配 Gateway Listener 使用可將特定端口的連線轉發至指定後端。
ReferenceGrant
標識其他命名空間中被信任引用的資源種類,Gateway API 中所有跨命名空間引用(除了跨命名空間的 Gateway-Route 附件)都需要 ReferenceGrant。
總結
Envoy Gateway v0.2 的發布標誌著 Envoy 生態系統在「易用性」方面邁出了重要一步。透過標準化的 Gateway API 介面,使用者無需深入理解 Envoy 複雜的 xDS 配置,即可輕鬆將 Envoy 部署為 Kubernetes 叢集的 API 閘道。隨著專案的持續演進,Envoy Gateway 有望成為雲原生 API 閘道的重要選擇之一。

發佈留言