Envoy Gateway Route 類型速查表:HTTPRoute、GRPCRoute、TCPRoute、TLSRoute 怎麼選
如果你前面幾篇都看了,現在最容易卡住的問題通常不是「我不懂 Gateway API」,而是:
「幹,所以這次到底該寫 HTTPRoute、GRPCRoute、TCPRoute 還是 TLSRoute?」
這篇就是專門拿來解這個結的。把它當成口袋速查表就好,之後要開新服務時,先翻這篇,比先亂寫 YAML 再被 condition 教做人省時間很多。
先講結論:四種 Route 的差別
| Route 類型 | 流量層級 | 會看什麼 | 適合場景 | 不適合場景 |
|---|---|---|---|---|
HTTPRoute |
L7 HTTP/HTTPS | host、path、header、query、method | 網站、REST API、一般 Web 流量 | 純 TCP 協定、TLS passthrough |
GRPCRoute |
L7 gRPC | hostname、service、method、header | gRPC service / method 路由 | 一般 REST API、原始 TCP |
TCPRoute |
L4 TCP | listener 與連線層資訊 | 資料庫、自訂 TCP 協定、非 HTTP 服務 | 想看 path/header 的場景 |
TLSRoute |
L4/L5 TLS | TLS SNI hostname | TLS passthrough、端到端加密保留到後端 | 需要在 Gateway 解密後看 HTTP 細節 |
如果你只想背一個超短版:
- 想看
path、header,用HTTPRoute - 想看 gRPC
service/method,用GRPCRoute - 只是在轉 TCP 連線,用
TCPRoute - 不解 TLS、只看 SNI,用
TLSRoute
三步判斷法:不要再用猜的
你可以用這個順序判斷:
- 流量進來後,Gateway 會不會解開 HTTP 語意?
- 如果會,它是一般 HTTP/REST,還是 gRPC?
- 如果不會,它是單純 TCP,還是 TLS passthrough?
對照起來就是:
- 有 HTTP path/header/method 要看:
HTTPRoute - 有 gRPC service/method 要看:
GRPCRoute - 沒有 L7 規則,只是 TCP 轉送:
TCPRoute - 想保留 TLS 到後端才解:
TLSRoute
這個判斷超重要。很多人一看到 route 就先手滑寫 HTTPRoute,結果寫到一半才發現自己其實在處理資料庫流量,整份 YAML 瞬間進入「我到底在幹嘛」模式。
最小 YAML 範例:一眼看懂每種長相
先看最短、最有辨識度的版本。
HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: web-route
spec:
parentRefs:
- name: eg
sectionName: http
hostnames:
- "app.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api-service
port: 8080看到 path、hostnames、backendRefs,基本上就是它。
GRPCRoute
apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
name: user-grpc
spec:
parentRefs:
- name: eg
sectionName: grpc
hostnames:
- "grpc.example.com"
rules:
- matches:
- method:
service: com.example.User
method: Login
backendRefs:
- name: user-grpc-service
port: 50051看到 method.service、method.method,就知道是在走 gRPC 語意,不是普通 HTTP。
TCPRoute
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: postgres-route
spec:
parentRefs:
- name: eg
sectionName: postgres
rules:
- backendRefs:
- name: postgres
port: 5432TCPRoute 幾乎不談 path/header,因為它根本不看這些。
它更像是「這個 listener 進來的 TCP 連線,送到哪個 backend」。
TLSRoute
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TLSRoute
metadata:
name: passthrough-route
spec:
parentRefs:
- name: eg
sectionName: tls
hostnames:
- "db.example.com"
rules:
- backendRefs:
- name: db-service
port: 5432它常搭配 protocol: TLS 的 listener 使用,重點不是解密,而是根據 SNI 來分流。
💡
TCPRoute與TLSRoute在不同 Gateway API 版本中常落在 experimental channel,實際套用前請先確認你叢集安裝的 CRD 版本。
最容易踩坑的四件事
1. gRPC 不代表一定要寫 GRPCRoute
如果你只是想讓 gRPC 流量能通,某些實作下用 HTTPRoute 也可能跑得動,因為 gRPC 底層是 HTTP/2。
但如果你想用 gRPC 的 service/method 當規則語意,GRPCRoute 才是比較正統、也比較好讀的選擇。
2. TLSRoute 不是「HTTPS 的進階版」
這是最多人誤會的點。
HTTPS listener + HTTPRoute:Gateway 會終止 TLS,後面看 HTTP 規則TLS listener + TLSRoute:Gateway 不終止 TLS,只看 SNI 分流
一個是解密後玩 L7,一個是保持加密做 passthrough,完全不同宇宙。
3. TCPRoute 看不到 path/header
你如果需求寫的是:
/api走 A/admin走 B
那就不是 TCPRoute 的工作。
TCPRoute 不會理解這些 HTTP 細節,硬塞進去只會變成技術版情勒。
4. parentRefs.sectionName 很重要
如果同一個 Gateway 上有多個 listener,記得善用:
parentRefs:
- name: eg
sectionName: https這樣 route 才會精準掛到你要的 listener。
不然你以為自己在指定 VIP 包廂,實際上可能被安排去隔壁廳。
一句話總結
先判斷你手上的流量是 HTTP、gRPC、TCP,還是 TLS passthrough,再選對 route 類型。
Route 選對,後面 80% 的 YAML 都會順;Route 選錯,後面就是一場你和 condition 的互相折磨。
下一步
搞懂 route 類型後,下一個很常卡的點就是:
同一個 Gateway 上有很多 listener 時,到底該怎麼拆才不會亂。
下一篇來講多 listener 設計: 👉 Listener 設計指南