3. Envoy 基础架构:代理模型、过滤器链与 xDS 动态配置

Envoy 是云原生服务网格中数据平面的核心组件,其架构设计围绕高性能、可扩展与动态配置展开。理解 Envoy 的代理模型、L4/L7 过滤器链以及 xDS 协议,是掌握网格升级中链路追踪协同的基础。

3.1 Envoy 代理模型:从 Sidecar 到边缘代理

Envoy 采用 进程外代理 架构,与应用程序解耦。在服务网格中,最常见的部署模式是 Sidecar 代理,即每个服务实例旁运行一个 Envoy 实例,拦截所有进出流量。

核心代理模型对比
模型 部署位置 流量范围 典型场景
Sidecar 代理 与服务 Pod 同节点 单个服务实例的出入流量 Istio / Cilium Service Mesh
边缘代理 集群入口/出口 南北向流量 API 网关、Ingress Gateway
路由代理 集群内部节点 跨节点/跨集群流量 负载均衡、流量镜像

Envoy 的代理模型基于 监听器(Listener) 和 集群(Cluster) 抽象。每个监听器绑定一个 IP:Port,接收连接后,通过过滤器链处理,最终将流量转发到目标集群。

Envoy 代理模型:Sidecar 与边缘代理 Sidecar 代理 App 容器 Envoy Sidecar iptables 拦截 出站流量 入站流量 边缘代理 外部客户端 Envoy 边缘 TLS 终止 内部服务 转发 Sidecar 代理拦截单个服务流量;边缘代理处理集群边界流量,通常承担 TLS 终止与路由职责

3.2 L4/L7 过滤器链:可插拔的流量处理管道

Envoy 的过滤器链是其可扩展性的核心。每个监听器可以配置一组过滤器,按顺序处理流量。过滤器分为 L4(网络层) 和 L7(应用层) 两类。

关键概念: 过滤器链是 Envoy 处理流量的管道。L4 过滤器处理原始连接(如 TCP 代理、TLS 终止),L7 过滤器处理应用协议(如 HTTP 路由、gRPC 桥接、链路追踪)。

3.2.1 L4 过滤器(网络过滤器)

  • TCP Proxy:将 TCP 连接透明代理到上游集群,支持连接池与健康检查。
  • TLS Inspector:解析 TLS 握手,提取 SNI(Server Name Indication)用于路由决策。
  • Original Destination:保留原始目标地址,用于透明代理场景。
  • Rate Limit:基于连接速率进行限流。

3.2.2 L7 过滤器(HTTP 过滤器)

  • Router:核心路由过滤器,根据虚拟主机和路由规则转发请求。
  • Fault Injection:注入延迟或错误,用于混沌工程测试。
  • Zipkin / OpenTelemetry:生成并传播分布式追踪 Span,是链路追踪协同的关键。
  • gRPC-Web:将 gRPC-Web 请求桥接到标准 gRPC。
  • Local Rate Limit:基于 HTTP 请求的本地限流。
Envoy 过滤器链:L4 → L7 处理流程 入站连接 L4 过滤器链 TCP Proxy | TLS Inspector | Original Dst 连接管理 L7 过滤器链 Router | Tracing | Fault Injection 上游 过滤器链处理步骤 1. 监听器接收连接,创建网络过滤器链(L4)。 2. L4 过滤器处理原始连接:TLS 终止、SNI 提取、连接限流。 3. 连接管理模块将连接与 HTTP/2 或 TCP 会话关联。 4. 创建 HTTP 过滤器链(L7),按顺序执行:Router → Tracing → Fault Injection。 5. 最终将请求转发到上游集群,并收集追踪 Span 数据。

3.3 xDS 协议:动态配置的核心机制

xDS 是 Envoy 动态配置的基石,全称为 Discovery Service。它通过一组 gRPC 流协议,让控制平面(如 Istio Pilot、Cilium Operator)实时推送配置到数据平面。

注意: 在网格升级过程中,xDS 的版本兼容性至关重要。Envoy 1.24+ 已弃用 v2 xDS API,必须使用 v3 版本。Cilium 从 1.13 开始全面支持 xDS v3。

3.3.1 核心 xDS 资源类型

资源类型 缩写 作用 更新频率
Listener Discovery Service LDS 动态配置监听器(IP:Port 绑定) 中
Route Discovery Service RDS 动态配置 HTTP 路由规则 高
Cluster Discovery Service CDS 动态配置上游集群定义 低
Endpoint Discovery Service EDS 动态配置集群端点(Pod IP) 极高
Secret Discovery Service SDS 动态配置 TLS 证书与密钥 低

3.3.2 xDS 工作流程

  1. Envoy 启动:读取静态引导配置(bootstrap.yaml),包含控制平面地址。
  2. 建立 gRPC 流:Envoy 向控制平面发起 LDS 订阅,请求监听器配置。
  3. 增量推送:控制平面通过 ADS(Aggregated Discovery Service)统一推送变更。
  4. 热更新:Envoy 在内存中应用新配置,不重启进程,实现零停机更新。
  5. ACK/NACK:Envoy 对每次更新回复确认(ACK)或拒绝(NACK),控制平面据此调整。
xDS 动态配置流程:控制平面 ↔ 数据平面 控制平面 Istio Pilot / Cilium Operator xDS v3 API ADS 聚合推送 数据平面 Envoy Sidecar gRPC 流订阅 热更新配置 LDS / CDS / EDS / RDS 订阅 ACK / NACK 响应 xDS 配置更新生命周期 1. Envoy 启动 → 读取 bootstrap.yaml → 连接控制平面 2. 控制平面推送 LDS → Envoy 配置监听器 → 请求 RDS 3. 控制平面推送 CDS → Envoy 配置集群 → 请求 EDS 4. 端点变更时 → 控制平面增量推送 EDS → Envoy 热更新 5. 链路追踪配置变更 → 通过 LDS/RDS 推送 Tracing 过滤器配置

3.4 动态配置在链路追踪中的应用

在网格升级场景中,xDS 动态配置为链路追踪协同提供了关键能力:

  • 动态注入追踪过滤器:通过 LDS 推送新的 HTTP 过滤器配置,启用或禁用 Zipkin/OpenTelemetry 追踪。
  • 采样率热更新:通过 RDS 或集群元数据动态调整追踪采样率,无需重启 Envoy。
  • 追踪后端切换:通过 CDS/EDS 动态修改追踪上报的目标集群地址,实现从 Zipkin 到 OpenTelemetry Collector 的平滑迁移。
  • 标签与上下文传播:通过动态配置自定义追踪标签(如集群名、命名空间),增强链路数据的可观测性。
升级实践提示: 在 Cilium 与 Envoy 协同升级时,建议先通过 xDS 动态配置将追踪采样率降为 1%,验证新版本 Envoy 的追踪数据格式兼容性,再逐步恢复采样率。这可以避免升级期间追踪数据丢失或格式错误。