Envoy Gateway Route 類型速查表:HTTPRoute、GRPCRoute、TCPRoute、TLSRoute 怎麼選

6 min read

如果你前面幾篇都看了,現在最容易卡住的問題通常不是「我不懂 Gateway API」,而是:

「幹,所以這次到底該寫 HTTPRouteGRPCRouteTCPRoute 還是 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 細節

如果你只想背一個超短版:

  • 想看 pathheader,用 HTTPRoute
  • 想看 gRPC service/method,用 GRPCRoute
  • 只是在轉 TCP 連線,用 TCPRoute
  • 不解 TLS、只看 SNI,用 TLSRoute

三步判斷法:不要再用猜的

你可以用這個順序判斷:

  1. 流量進來後,Gateway 會不會解開 HTTP 語意?
  2. 如果會,它是一般 HTTP/REST,還是 gRPC?
  3. 如果不會,它是單純 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

看到 pathhostnamesbackendRefs,基本上就是它。

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.servicemethod.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: 5432

TCPRoute 幾乎不談 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 來分流。

💡 TCPRouteTLSRoute 在不同 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 設計指南