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,接收连接后,通过过滤器链处理,最终将流量转发到目标集群。
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 请求的本地限流。
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 工作流程
- Envoy 启动:读取静态引导配置(bootstrap.yaml),包含控制平面地址。
- 建立 gRPC 流:Envoy 向控制平面发起 LDS 订阅,请求监听器配置。
- 增量推送:控制平面通过 ADS(Aggregated Discovery Service)统一推送变更。
- 热更新:Envoy 在内存中应用新配置,不重启进程,实现零停机更新。
- ACK/NACK:Envoy 对每次更新回复确认(ACK)或拒绝(NACK),控制平面据此调整。
3.4 动态配置在链路追踪中的应用
在网格升级场景中,xDS 动态配置为链路追踪协同提供了关键能力:
- 动态注入追踪过滤器:通过 LDS 推送新的 HTTP 过滤器配置,启用或禁用 Zipkin/OpenTelemetry 追踪。
- 采样率热更新:通过 RDS 或集群元数据动态调整追踪采样率,无需重启 Envoy。
- 追踪后端切换:通过 CDS/EDS 动态修改追踪上报的目标集群地址,实现从 Zipkin 到 OpenTelemetry Collector 的平滑迁移。
- 标签与上下文传播:通过动态配置自定义追踪标签(如集群名、命名空间),增强链路数据的可观测性。
升级实践提示: 在 Cilium 与 Envoy 协同升级时,建议先通过 xDS 动态配置将追踪采样率降为 1%,验证新版本 Envoy 的追踪数据格式兼容性,再逐步恢复采样率。这可以避免升级期间追踪数据丢失或格式错误。