Envoy Gateway 快速上手:10 分鐘跑通第一條流量
4 min read
這篇的目標超單純:不要先談人生大道理,先把 Envoy Gateway 跑起來。 你只要成功打到範例服務,就已經贏過一票還停留在看文件首頁的人了。
前置條件
你至少要有一個可用的 Kubernetes 叢集,像是:
- 本地:
kind、minikube、k3d - 雲上:EKS、GKE、AKS
- 家裡 lab:K3s + MetalLB 也可以
另外要準備:
kubectlhelm- 叢集能拿到
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 資源
官方直接準備了一包範例,裡面包含:
GatewayClassGatewayHTTPRoute- 範例 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 |
HTTPRoute、Service、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 有沒有被接受
你剛剛其實做了什麼
雖然只貼了幾個指令,但背後其實已經跑完一條完整鏈路:
- 安裝
Envoy Gateway - 建立
GatewayClass,告訴叢集用哪個 gateway controller - 建立
Gateway,宣告入口 port 與 protocol - 建立
HTTPRoute,把流量導到 backend service - Envoy Gateway 幫你把這些宣告翻成 Envoy Proxy 可執行的設定
這就是為什麼 Gateway API 很香。你寫的是 Kubernetes 資源,不是自己手工維護一大坨代理設定檔。
下一步
現在你已經跑通第一條流量,下一篇要補的是「這些資源各自到底在幹嘛」,把腦內模型建起來: 👉 核心概念