協定選擇

Istio 支援代理任何 TCP 流量。這包括 HTTP、HTTPS、gRPC 以及原始 TCP 協定。為了提供額外的功能,例如路由和豐富的指標,必須確定協定。這可以自動完成,也可以明確指定。

非基於 TCP 的協定,例如 UDP,不會被代理。這些協定將繼續正常運作,不會受到 Istio 代理的任何攔截,但不能在僅限代理的元件(例如入口或出口閘道)中使用。

自動協定選擇

Istio 可以自動偵測 HTTP 和 HTTP/2 流量。如果無法自動確定協定,流量將被視為普通的 TCP 流量。

明確協定選擇

可以在服務定義中手動指定協定。

這可以通過兩種方式配置

  • 通過埠的名稱:name: <協定>[-<後綴>]
  • 在 Kubernetes 1.18+ 中,通過 appProtocol 欄位:appProtocol: <協定>

如果兩者都定義了,appProtocol 的優先順序高於埠名稱。

請注意,閘道的行為在某些情況下有所不同,因為閘道可以終止 TLS,並且可以協商協定。

支援以下協定

協定Sidecar 用途閘道用途
http純文字 HTTP/1.1 流量純文字 HTTP (1.1 或 2) 流量
http2純文字 HTTP/2 流量純文字 HTTP (1.1 或 2) 流量
httpsTLS 加密資料。由於 Sidecar 不解密 TLS 流量,這與 tls 相同TLS 加密 HTTP (1.1 或 2) 流量
tcp不透明 TCP 資料流不透明 TCP 資料流
tlsTLS 加密資料TLS 加密資料
grpc, grpc-webhttp2 相同http2 相同
mongo, mysql, redis實驗性應用程式協定支援。要啟用它們,請配置相應的環境變數。如果未啟用,則視為不透明 TCP 資料流實驗性應用程式協定支援。要啟用它們,請配置相應的環境變數。如果未啟用,則視為不透明 TCP 資料流

以下是一個服務的示例,該服務通過 appProtocol 定義了一個 https 埠,並通過名稱定義了一個 http

kind: Service
metadata:
  name: myservice
spec:
  ports:
  - port: 3306
    name: database
    appProtocol: https
  - port: 80
    name: http-web

HTTP 閘道協定選擇

與 sidecar 不同,閘道預設無法自動偵測將請求轉發到後端服務時要使用的特定 HTTP 協定。因此,除非使用明確的協定選擇來指定 HTTP/1.1 (http) 或 HTTP/2 (http2grpc),否則閘道將使用 HTTP/1.1 轉發所有傳入的 HTTP 請求。

除了使用明確的協定選擇之外,您還可以通過為服務設定 useClientProtocol 選項,指示閘道使用與傳入請求相同的協定轉發請求。但是請注意,將此選項與不支援 HTTP/2 的服務一起使用可能會有風險,因為 HTTPS 閘道總是宣告支援 HTTP/1.1 和 HTTP/2。因此,即使後端服務不支援 HTTP/2,現代客戶端也會認為它支援,並且通常會選擇使用它。

這些資訊是否有用?
您是否有任何改進建議?

感謝您的回饋!