了解 TLS 設定
Istio 最重要的功能之一是能夠鎖定和保護網格內、外和之間的網路流量。然而,設定 TLS 可能令人困惑,並且是常見的設定錯誤來源。本文檔試圖解釋在 Istio 中發送請求時涉及的各種連線,以及如何設定其相關的 TLS 設定。有關一些最常見的 TLS 設定問題的摘要,請參閱 TLS 設定錯誤。
邊車 (Sidecars)
邊車流量有多種相關的連線。讓我們逐一分解它們。
外部入站流量 這是來自外部客戶端且被邊車捕獲的流量。如果客戶端位於網格內部,則此流量可能會使用 Istio 相互 TLS 進行加密。預設情況下,邊車將被設定為接受 mTLS 和非 mTLS 流量,這稱為
PERMISSIVE
模式。該模式也可以設定為STRICT
,其中流量必須是 mTLS,或DISABLE
,其中流量必須是純文字。mTLS 模式是使用PeerAuthentication
資源 來設定的。本地入站流量 這是從邊車流向您的應用程式服務的流量。此流量將始終按原樣轉發。請注意,這並不意味著它總是純文字;邊車可能會傳遞 TLS 連線。這僅表示永遠不會從邊車發起新的 TLS 連線。
本地出站流量 這是從您的應用程式服務發出的,並被邊車攔截的出站流量。您的應用程式可能會發送純文字或 TLS 流量。如果啟用了自動協定選擇,Istio 將自動偵測協定。否則,您應該使用目標服務中的埠名稱來手動指定協定。
外部出站流量 這是從邊車流向某個外部目標的出站流量。流量可以按原樣轉發,也可以發起 TLS 連線(mTLS 或標準 TLS)。這是在
DestinationRule
資源的trafficPolicy
中使用 TLS 模式設定來控制的。DISABLE
的模式設定將發送純文字,而SIMPLE
、MUTUAL
和ISTIO_MUTUAL
將發起 TLS 連線。
主要重點是
PeerAuthentication
用於設定邊車將接受何種類型的 mTLS 流量。DestinationRule
用於設定邊車將發送何種類型的 TLS 流量。- 埠名稱或自動協定選擇決定了邊車將解析流量的協定。
自動 mTLS
如上所述,DestinationRule
控制出站流量是否使用 mTLS。但是,為每個工作負載設定此項可能會很繁瑣。通常,您希望 Istio 盡可能始終使用 mTLS,並且僅向不屬於網格的工作負載(即沒有邊車的工作負載)發送純文字。
Istio 使用稱為「自動 mTLS」的功能使其變得容易。自動 mTLS 的工作方式正是如此。如果未在 DestinationRule
中明確設定 TLS 設定,邊車將自動確定是否應發送 Istio 相互 TLS。這表示在沒有任何設定的情況下,所有網格間流量都將使用 mTLS 加密。
閘道 (Gateways)
對閘道的任何請求都會有兩個連線。
由某些客戶端(例如
curl
或網頁瀏覽器)發起的入站請求。這通常稱為「下游」連線。由閘道發起到某些後端的出站請求。這通常稱為「上游」連線。
這兩個連線都有獨立的 TLS 設定。
請注意,入口和出口閘道的設定是相同的。istio-ingress-gateway
和 istio-egress-gateway
只是兩個專門的閘道部署。不同之處在於,入口閘道的客戶端在網格外部執行,而出口閘道的目標在網格外部。
入站 (Inbound)
作為入站請求的一部分,閘道必須解碼流量才能應用路由規則。這是基於Gateway
資源中的伺服器設定完成的。例如,如果入站連線是純文字 HTTP,則埠協定會設定為 HTTP
。
apiVersion: networking.istio.io/v1
kind: Gateway
...
servers:
- port:
number: 80
name: http
protocol: HTTP
同樣,對於原始 TCP 流量,協定將設定為 TCP
。
對於 TLS 連線,還有一些選項
封裝的是什麼協定?如果連線是 HTTPS,則伺服器協定應設定為
HTTPS
。否則,對於使用 TLS 封裝的原始 TCP 連線,協定應設定為TLS
。是否終止或傳遞 TLS 連線?對於直通流量,請將 TLS 模式欄位設定為
PASSTHROUGH
apiVersion: networking.istio.io/v1 kind: Gateway ... servers: - port: number: 443 name: https protocol: HTTPS tls: mode: PASSTHROUGH
在此模式下,Istio 將根據 SNI 資訊進行路由,並按原樣將連線轉發到目標。
是否應使用相互 TLS?相互 TLS 可以透過 TLS 模式
MUTUAL
來設定。設定此項後,將請求用戶端憑證並根據已設定的caCertificates
或credentialName
進行驗證。apiVersion: networking.istio.io/v1 kind: Gateway ... servers: - port: number: 443 name: https protocol: HTTPS tls: mode: MUTUAL caCertificates: ...
出站 (Outbound)
雖然入站端設定了要預期的流量類型以及如何處理它,但出站設定控制著閘道將發送的流量類型。這是透過 DestinationRule
中的 TLS 設定來設定的,就像來自邊車的外部出站流量,或預設自動 mTLS一樣。
唯一的區別是您在設定此項時應仔細考慮 Gateway
設定。例如,如果 Gateway
設定為 TLS PASSTHROUGH
,而 DestinationRule
設定為 TLS 發起,您最終會得到雙重加密。這可以正常運作,但通常不是所需的行為。
綁定到閘道的 VirtualService
也需要謹慎處理,以確保其與 Gateway
定義一致。