理解 Envoy 的架構對于深入理解 Istio 至關重要,因為 Envoy 是 Istio 數據平面的核心。Envoy 是一個高性能的 C++ 分布式代理,設計為云原生應用和大規模微服務架構的網絡基礎。
以下是 Envoy 架構的關鍵組成部分和核心理念:
核心設計理念:
-
進程外架構 (Out-of-Process):?Envoy 作為獨立的代理進程運行,與應用程序進程解耦。這使得它可以為任何語言編寫的應用程序提供通用的網絡功能。
-
高性能 (High Performance):
-
非阻塞 I/O:?完全基于事件驅動和非阻塞的異步處理模型(通常使用 libevent 或類似的庫),能夠在少量線程下處理大量并發連接。
-
多線程模型:?通常有一個主線程處理協調和信號,多個 Worker 線程處理連接和請求。每個 Worker 線程獨立處理一部分連接,減少了線程間同步的開銷。
-
-
L3/L4 和 L7 感知:?Envoy 既能作為 L3/L4 層的網絡代理(如 TCP 代理),也能作為 L7 層的應用代理(如 HTTP/2, gRPC 代理)。
-
可擴展性 (Extensibility):?通過過濾器 (Filters)?機制,可以輕松地插入自定義邏輯來處理網絡流量,例如修改頭部、認證、授權、速率限制等。
-
動態配置 (Dynamic Configuration):?Envoy 可以通過一組稱為?xDS (Discovery Service)?的 API 從管理服務器(如 Istio 的 Istiod)動態獲取其全部配置,無需重啟即可更新。
-
可觀測性 (Observability):?Envoy 從一開始就設計為具有強大的可觀測性,提供詳細的統計數據 (stats)、日志 (logging) 和分布式追蹤 (distributed tracing) 支持。
-
最終一致性 (Eventually Consistent):?在大規模分布式系統中,配置的更新是最終一致的,Envoy 的設計能夠很好地適應這一點。
核心架構組件:
下面我們來看一下 Envoy 內部的關鍵組件以及請求是如何流經這些組件的:
-
Downstream (下游):?指發起請求的客戶端,例如你的服務 A,或者瀏覽器。
-
Upstream (上游):?指接收請求并提供響應的服務,例如你的服務 B。
-
Listener (監聽器):
-
作用:?監聽器是 Envoy 接收下游連接的入口。每個監聽器綁定到一個 IP 地址和端口。
-
配置:?定義了當連接被接受時如何處理。
-
核心:?每個監聽器都包含一個或多個過濾器鏈 (Filter Chains)。
-
-
Filter Chain (過濾器鏈):
-
作用:?當監聽器接受一個新連接時,它會根據匹配條件(如 SNI、ALPN、源/目標 IP 等)選擇一個過濾器鏈來處理該連接。
-
組成:?過濾器鏈由一個或多個網絡過濾器 (Network Filters)?組成。
-
-
Network Filters (L3/L4 網絡過濾器):
-
作用:?處理原始字節流和連接級別的事件。它們按順序執行。
-
常見的網絡過濾器:
-
envoy.filters.network.tcp_proxy:?TCP 代理,將 TCP 流量轉發到上游集群。
-
envoy.filters.network.http_connection_manager?(HCM):?這是最重要的網絡過濾器之一。?它將原始字節流解釋為 HTTP/1.x, HTTP/2, HTTP/3 協議,并管理 HTTP 流的生命周期。HCM 內部有其自己的?HTTP 過濾器鏈。
-
envoy.filters.network.tls_inspector:?檢查 TLS 握手中的 SNI 或 ALPN,用于過濾器鏈匹配。
-
envoy.filters.network.rbac:?基于角色的訪問控制。
-
envoy.filters.network.mongo_proxy,?envoy.filters.network.redis_proxy?等:?特定協議的解析和代理。
-
-
-
HTTP Connection Manager (HCM):
-
作用:?如上所述,它是一個特殊的網絡過濾器,專門用于處理 HTTP 流量。
-
核心:?HCM 內部包含一個或多個?HTTP 過濾器 (HTTP Filters)。
-
-
HTTP Filters (L7 HTTP 過濾器):
-
作用:?處理 HTTP 請求和響應的各個方面,例如讀取/修改頭部、請求體、路由決策、認證、授權等。它們也按順序執行。
-
常見的 HTTP 過濾器:
-
envoy.filters.http.router?(Router Filter):?這是最重要的 HTTP 過濾器,通常是 HTTP 過濾器鏈中的最后一個。?它的核心任務是根據請求的屬性(如 Host, Path, Headers)和路由配置 (Route Configuration)?將請求路由到合適的上游集群 (Upstream Cluster)。
-
envoy.filters.http.jwt_authn:?JWT 認證。
-
envoy.filters.http.rbac:?HTTP 級別的 RBAC。
-
envoy.filters.http.lua:?通過 Lua 腳本擴展功能。
-
envoy.filters.http.wasm:?通過 WebAssembly 插件擴展功能 (Istio 常用)。
-
envoy.filters.http.cors:?CORS 處理。
-
envoy.filters.http.fault:?故障注入。
-
envoy.filters.http.gzip:?壓縮/解壓縮。
-
-
-
Router Filter 和 Route Configuration (路由配置):
-
作用:?Router 過濾器使用路由配置來決定如何處理一個 HTTP 請求。
-
路由配置包含:
-
Virtual Hosts (虛擬主機):?根據?Host?頭部匹配。
-
Routes (路由規則):?在虛擬主機內,根據路徑、頭部、查詢參數等匹配請求。
-
Action:?匹配成功后執行的動作,最常見的是將請求轉發到一個或多個集群 (Cluster),但也可能是重定向、直接響應等。
-
Retry Policy (重試策略):?定義失敗請求的重試行為。
-
Timeout (超時):?定義請求超時。
-
-
-
Cluster (集群):
-
作用:?Cluster 是 Envoy 可以連接的一組邏輯上相似的上游主機(后端服務實例)。
-
配置:
-
Load Balancing Policy (負載均衡策略):?如 Round Robin, Least Request, Ring Hash 等。
-
Health Checking (健康檢查):?Envoy 會主動對集群中的主機進行健康檢查,并將不健康的主機從負載均衡池中剔除。
-
Outlier Detection (異常點檢測):?根據連續的 5xx 錯誤、延遲等指標,暫時將表現不佳的主機從負載均衡池中移除。
-
Circuit Breaking (熔斷):?限制對上游集群的并發連接數、掛起請求數等,防止雪崩效應。
-
TLS Context:?定義連接到上游主機時使用的 TLS 配置(如客戶端證書、CA 證書等)。
-
-
-
Endpoints / Hosts (端點/主機):
-
作用:?Cluster 中的具體上游服務實例,通常是 IP:Port。
-
發現方式:?端點信息可以通過靜態配置,或通過?EDS (Endpoint Discovery Service)?動態發現。
-
-
xDS API (動態發現服務):
Envoy 通過 gRPC 或 REST API 從管理服務器獲取其配置。主要的 xDS 服務包括:-
LDS (Listener Discovery Service):?獲取監聽器配置。
-
RDS (Route Discovery Service):?獲取 HTTP 路由配置 (由 HCM 內的 Router Filter 使用)。
-
CDS (Cluster Discovery Service):?獲取集群配置。
-
EDS (Endpoint Discovery Service):?獲取集群中各個端點(主機)的信息。
-
SDS (Secret Discovery Service):?獲取 TLS 證書、私鑰等敏感信息。
-
ADS (Aggregated Discovery Service):?將多個 xDS 服務聚合在一個 gRPC 流上,簡化管理和保證更新順序。
-
請求處理流程概覽 (以 HTTP 為例):
-
連接建立:?客戶端 (Downstream) 向 Envoy 的某個 Listener 的 IP:Port 發起 TCP 連接。
-
Listener 接受:?Listener 接受連接。
-
Filter Chain 匹配:?根據連接屬性選擇一個 Filter Chain。
-
Network Filter 處理:?連接流經 Network Filter Chain:
-
例如,TLS Inspector 可能首先運行。
-
然后,http_connection_manager?(HCM) 接管。
-
-
HCM 處理:?HCM 開始解析 HTTP 協議。
-
HTTP Filter 處理:?請求流經 HCM 內部的 HTTP Filter Chain:
-
例如,JWT 認證過濾器檢查 Token。
-
RBAC 過濾器檢查權限。
-
最后到達 Router Filter。
-
-
路由決策:?Router Filter 根據其 Route Configuration (通過 RDS 獲取) 匹配請求,找到目標 Cluster。
-
上游連接:
-
Envoy 從 Cluster (通過 CDS 獲取) 中選擇一個健康的 Endpoint (通過 EDS 獲取),并根據負載均衡策略。
-
Envoy 與選定的 Endpoint 建立上游連接 (可能使用 mTLS,證書通過 SDS 獲取)。
-
-
請求轉發:?Envoy 將 HTTP 請求轉發給上游 Endpoint。
-
響應處理:?上游 Endpoint 返回響應。
-
響應過濾:?響應數據會反向流經 HTTP Filter Chain (某些過濾器也處理響應) 和 Network Filter Chain。
-
響應返回:?Envoy 將最終的響應發送給下游客戶端。
線程模型:
-
Main Thread:?負責初始化、xDS 通信、信號處理、Admin 端點等。
-
Worker Threads:?數量可配置。每個 Worker 線程運行一個事件循環 (event loop),處理分配給它的監聽器上的連接、I/O 事件、執行過濾器鏈等。Worker 線程之間幾乎沒有共享狀態,數據通過線程本地存儲 (TLS - Thread Local Storage,非 Transport Layer Security) 或消息傳遞來處理。這種設計大大減少了鎖競爭,提高了并發性能。
總結:
Envoy 的架構設計使其成為一個功能強大、高性能且高度可配置的代理。其分層的過濾器模型提供了極大的靈活性,而 xDS API 則使其能夠適應動態的微服務環境。理解這些核心組件和它們之間的交互方式,是理解 Istio 如何實現流量管理、安全性和可觀測性的基礎。