Envoy Gateway 快速上手:10 分鐘跑通第一條流量

4 min read

這篇的目標超單純:不要先談人生大道理,先把 Envoy Gateway 跑起來。 你只要成功打到範例服務,就已經贏過一票還停留在看文件首頁的人了。

前置條件

你至少要有一個可用的 Kubernetes 叢集,像是:

  • 本地:kindminikubek3d
  • 雲上:EKS、GKE、AKS
  • 家裡 lab:K3s + MetalLB 也可以

另外要準備:

  • kubectl
  • helm
  • 叢集能拿到 LoadBalancer 位址,或能接受你用 port-forward

⚠️ 如果你的叢集沒有 LoadBalancer,官方也建議搭配 MetalLB。沒有外部位址不是世界末日,但測試路徑會改成 port-forward

步驟 1:安裝 Envoy Gateway

先裝控制平面:

helm install eg oci://docker.io/envoyproxy/gateway-helm \
  --version v1.7.0 \
  -n envoy-gateway-system \
  --create-namespace

等它 Ready:

kubectl wait --timeout=5m -n envoy-gateway-system \
  deployment/envoy-gateway \
  --for=condition=Available

這一步完成後,代表 Envoy Gateway controller 已經進駐叢集,可以開始看懂 Gateway API 資源並幫你建立對應的 Envoy 設定。

步驟 2:套用官方 quickstart 資源

官方直接準備了一包範例,裡面包含:

  • GatewayClass
  • Gateway
  • HTTPRoute
  • 範例 backend app

直接套:

kubectl apply -f \
  https://github.com/envoyproxy/gateway/releases/download/v1.7.0/quickstart.yaml \
  -n default

你可以把它想成「官方幫你把 demo 場景一次鋪好」,先求能跑,之後再自己拆開研究。

步驟 3:驗證流量有沒有通

做法 A:叢集有 LoadBalancer

拿到 Gateway 位址:

export GATEWAY_HOST=$(kubectl get gateway/eg -o jsonpath='{.status.addresses[0].value}')

打請求:

curl --verbose \
  --header "Host: www.example.com" \
  http://$GATEWAY_HOST/get

如果你看到 HTTP 200,就代表:

  • Gateway 有對外提供入口
  • HTTPRoute 有成功附掛
  • backend service 有被正確轉送

做法 B:沒有 LoadBalancer,用 port-forward

先找出 Envoy service:

export ENVOY_SERVICE=$(kubectl get svc -n envoy-gateway-system \
  --selector=gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=eg \
  -o jsonpath='{.items[0].metadata.name}')

把本機 8888 轉到 Gateway 的 80

kubectl -n envoy-gateway-system port-forward service/${ENVOY_SERVICE} 8888:80

另一個 terminal 打:

curl --verbose \
  --header "Host: www.example.com" \
  http://localhost:8888/get

這條路適合本機測試。雖然比較像走後門,但能驗證就先給過,工程師的浪漫有時候就是「先通再優雅」。

出問題先看哪裡

最常見的卡點通常不是 Envoy Gateway 壞掉,而是其中一段沒接上:

現象 先檢查什麼
gateway/eg 沒地址 叢集有沒有 LoadBalancer 實作
curl 404 或 503 HTTPRouteService、backend Pod 狀態
kubectl wait 卡住 envoy-gateway-system 裡的 Pod 有沒有起來

幾個實用指令:

kubectl get pods -n envoy-gateway-system
kubectl get gatewayclass
kubectl get gateway -A
kubectl get httproute -A
kubectl get svc,pod -n default

如果你想更進一步確認 Gateway 狀態:

kubectl get gateway/eg -o yaml

重點看:

  • status.addresses
  • listener 的 condition
  • route 有沒有被接受

你剛剛其實做了什麼

雖然只貼了幾個指令,但背後其實已經跑完一條完整鏈路:

  1. 安裝 Envoy Gateway
  2. 建立 GatewayClass,告訴叢集用哪個 gateway controller
  3. 建立 Gateway,宣告入口 port 與 protocol
  4. 建立 HTTPRoute,把流量導到 backend service
  5. Envoy Gateway 幫你把這些宣告翻成 Envoy Proxy 可執行的設定

這就是為什麼 Gateway API 很香。你寫的是 Kubernetes 資源,不是自己手工維護一大坨代理設定檔。

下一步

現在你已經跑通第一條流量,下一篇要補的是「這些資源各自到底在幹嘛」,把腦內模型建起來: 👉 核心概念