理解 Envoy 的架构
理解 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 如何实现流量管理、安全性和可观测性的基础。