協定選擇
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) 流量 |
https | TLS 加密資料。由於 Sidecar 不解密 TLS 流量,這與 tls 相同 | TLS 加密 HTTP (1.1 或 2) 流量 |
tcp | 不透明 TCP 資料流 | 不透明 TCP 資料流 |
tls | TLS 加密資料 | TLS 加密資料 |
grpc , grpc-web | 與 http2 相同 | 與 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 (http2
或 grpc
),否則閘道將使用 HTTP/1.1 轉發所有傳入的 HTTP 請求。
除了使用明確的協定選擇之外,您還可以通過為服務設定 useClientProtocol
選項,指示閘道使用與傳入請求相同的協定轉發請求。但是請注意,將此選項與不支援 HTTP/2 的服務一起使用可能會有風險,因為 HTTPS 閘道總是宣告支援 HTTP/1.1 和 HTTP/2。因此,即使後端服務不支援 HTTP/2,現代客戶端也會認為它支援,並且通常會選擇使用它。