2. Envoy 基础架构回顾:线程模型、Listener、Cluster、Endpoint 与 Filter 链
在深入服务网格治理回滚与 SLO 护栏之前,必须重新审视 Envoy 的核心架构。Envoy 并非简单的反向代理,而是一个基于事件驱动、多线程并行的 L3/L4/L7 代理。理解其线程模型与核心抽象(Listener、Cluster、Endpoint、Filter 链)是后续配置面板化与治理策略的基础。
2.1 线程模型:主线程 + Worker 线程池
Envoy 使用 单进程多线程 架构,避免多进程带来的高昂上下文切换。其线程模型分为三类:
| 线程类型 | 数量 | 职责 |
|---|---|---|
| Main 线程 | 1 | 配置加载/热重启、DNS 解析、集群管理、统计刷新、健康检查、全局 xDS 订阅。不处理数据面流量。 |
| Worker 线程 | 通常 = CPU 核数 | 处理所有网络 I/O、连接管理、Filter 链执行、TLS 终止。每个 Worker 拥有独立的 Event Loop 和连接池。 |
| 文件刷新线程 | 1(可选) | 异步写入访问日志、统计文件,避免阻塞 Worker。 |
关键设计: Worker 线程之间 无锁。每个 Worker 独立持有自己的连接、定时器、内存池。连接通过 Accept 后绑定(ReusePort 或轮询)分配给固定 Worker,后续该连接的所有事件都在同一 Worker 上处理,彻底避免跨线程竞争。
2.2 Listener:流量入口
Listener 定义了 Envoy 如何监听入站流量。每个 Listener 绑定一个 IP:Port,并关联一组 Filter 链。关键属性:
- 地址绑定:支持 TCP、UDP、Unix Domain Socket。
- SO_REUSEPORT:启用后内核将新连接均匀分发到多个 Worker,提升多核扩展性。
- Listener Filter:在连接建立初期执行,用于 TLS 嗅探、代理协议解析、原始目标 IP 提取。
- Filter 链匹配:根据 SNI、源 IP、端口等条件选择不同的 Filter 链。
实践要点: 在服务网格中,每个 Sidecar 通常只暴露一个 Listener(如 15001),通过 iptables 规则将 Pod 内所有入站流量劫持到该 Listener。Listener 的 Filter 链根据目标端口(如 8080、9090)进行分流。
2.3 Cluster 与 Endpoint:上游服务抽象
Cluster 是 Envoy 对上游服务集群的逻辑抽象,定义了如何发现、连接和负载均衡到一组 Endpoint(实际后端实例)。
| 概念 | 说明 | 典型配置 |
|---|---|---|
| Cluster | 服务集群定义,包含发现类型、负载均衡策略、连接池大小、健康检查配置。 | type: STRICT_DNS / type: EDS |
| Endpoint | 具体的后端实例,包含 IP:Port、健康状态、权重、元数据。 | socket_address: { address: "10.0.1.5", port_value: 8080 } |
| Locality | 区域/可用区标签,用于优先级路由和就近访问。 | locality: { region: "us-east-1", zone: "a" } |
回滚护栏关联: 在 SLO 错误预算治理中,Cluster 的 异常检测(Outlier Detection) 和 主动健康检查 是自动回滚的底层触发机制。当 Endpoint 连续失败达到阈值,Envoy 会将其弹出负载均衡池,触发面板上的“实例熔断”事件。
2.4 Filter 链:可插拔的请求处理管道
Filter 链是 Envoy 最强大的扩展点。每个 Listener 或 Route 可以串联多个 Filter,形成 L4 → L7 的流水线处理。Filter 分为三类:
- Listener Filter:连接建立阶段,如 TLS 嗅探、代理协议。
- Network Filter (L4):原始字节流处理,如 TCP Proxy、MongoDB 嗅探、MySQL 嗅探。
- HTTP Filter (L7):HTTP 请求/响应处理,如 Router、RBAC、Rate Limit、gRPC-Web、Local Reply。
2.5 核心抽象关系总结
Envoy 的配置模型可以归纳为以下层级关系,这也是面板化呈现的底层数据模型:
Listener (IP:Port)
└─ Filter 链 (L4 → L7)
└─ Route (域名/路径匹配)
└─ Cluster (服务集群)
└─ Endpoint (实例 IP:Port + 健康状态 + 权重)
└─ Locality (区域/可用区)
面板化映射: 在后续课程中,我们将把上述每个抽象映射为面板上的可视化节点。例如:
• Listener → 流量入口卡片,显示 QPS、连接数、TLS 版本。
• Cluster → 服务拓扑节点,显示健康实例数、错误率、P99 延迟。
• Endpoint → 实例列表,显示 CPU/内存、活跃请求、熔断状态。
• Filter 链 → 治理策略流水线,显示 RBAC 规则、速率限制阈值、重试配置。
• Listener → 流量入口卡片,显示 QPS、连接数、TLS 版本。
• Cluster → 服务拓扑节点,显示健康实例数、错误率、P99 延迟。
• Endpoint → 实例列表,显示 CPU/内存、活跃请求、熔断状态。
• Filter 链 → 治理策略流水线,显示 RBAC 规则、速率限制阈值、重试配置。