2. Envoy 基础架构:线程模型、核心概念与动态配置

Envoy 作为高性能边缘与服务代理,其架构设计围绕三个核心维度展开:并发模型(如何高效利用多核)、抽象资源模型(Listener / Cluster / Endpoint)以及动态配置协议(xDS)。理解这三者是掌握 Envoy 流量迁移与集群治理的前提。

2.1 线程模型:主线程 + Worker 线程池

Envoy 采用单进程、多线程架构,避免多进程带来的资源浪费与连接共享难题。其线程模型分为三类角色:

线程角色数量核心职责
Main 线程1配置加载、xDS 订阅、DNS 解析、证书轮换、统计刷新、Admin 接口
Worker 线程N(通常 = CPU 核数)监听器 accept、连接读写、L3/L4/L7 过滤链处理、转发决策
文件刷新线程1异步文件访问(访问日志、统计输出)
关键设计原则:每个 Worker 线程拥有独立的连接池与事件循环,无锁竞争。连接一旦被 Worker 接受,后续所有处理都在该 Worker 内完成,避免跨线程锁开销。
Envoy 线程模型架构 Main 线程 xDS 订阅 / 配置加载 DNS 解析 / 证书轮换 Admin 接口 / 统计刷新 Worker 线程池 (N = CPU 核数) Worker 0: 连接 accept / 过滤链 / 转发 Worker 1: 连接 accept / 过滤链 / 转发 Worker N-1: 连接 accept / 过滤链 / 转发 配置下发 文件刷新线程 异步日志 / 统计输出 异步写入 无锁设计 每个 Worker 独立事件循环,连接绑定到固定 Worker,无跨线程锁竞争

2.2 核心抽象:Listener / Cluster / Endpoint

Envoy 将流量处理路径抽象为三个层次,形成从入站到出站的完整链路:

概念作用域核心属性类比
Listener入站(服务端)监听地址端口、TLS 配置、过滤链(Filter Chain)nginx 的 server block
Cluster出站(客户端)上游端点集合、负载均衡策略、连接池、健康检查nginx 的 upstream
Endpoint上游实例IP:Port、元数据、权重、健康状态upstream 中的 server
流量迁移场景映射:在集群升级治理中,Listener 负责接收入站流量并注入迁移过滤器;Cluster 定义新旧版本的服务分组;Endpoint 代表每个节点池中的具体 Pod IP。通过动态调整 Endpoint 权重或 Cluster 路由规则,实现灰度迁移。

2.3 xDS 协议:动态配置的神经中枢

xDS(Discovery Service)是 Envoy 与控制平面(如 Istiod)之间的标准配置协议,基于 gRPC 流式推送或轮询拉取。xDS 家族覆盖了 Envoy 所有核心配置维度:

协议全称推送内容在流量迁移中的作用
LDSListener Discovery ServiceListener 配置(端口、过滤链)动态注入迁移过滤器、修改监听端口
RDSRoute Discovery Service路由规则(域名、路径匹配)按 header/权重分流到新旧 Cluster
CDSCluster Discovery ServiceCluster 配置(端点发现方式、LB 策略)动态创建/删除新旧版本 Cluster
EDSEndpoint Discovery ServiceEndpoint 列表(IP:Port、权重、健康状态)实时调整节点池 Pod 的流量权重
SDSSecret Discovery ServiceTLS 证书、私钥迁移过程中的证书轮换
运维注意:在集群升级节点池巡检场景中,EDS 是最高频更新的 xDS 资源。每次节点池扩缩容或 Pod 健康状态变化,控制平面都会推送增量 EDS 更新。Envoy 的 EDS 更新延迟直接影响流量迁移的实时性,建议将 EDS 的 cds_resources_locator 超时配置在 5s 以内。
xDS 协议交互与流量迁移映射 控制平面 Istiod / go-control-plane 聚合集群状态 生成 xDS 资源 Envoy 代理 接收 xDS 推送 热更新配置 执行流量转发 LDS RDS CDS EDS 流量迁移场景映射 LDS → 注入迁移过滤器 | RDS → 按权重分流新旧版本 | CDS → 创建新旧 Cluster | EDS → 调整节点池 Pod 权重 旧版本节点池 权重 30% 新版本节点池 权重 70% 金丝雀节点池 权重 5%

2.4 动态配置工作流

Envoy 通过 xDS 实现配置热更新,无需重启进程。典型工作流如下:

  1. 启动阶段:Envoy 启动时通过 --config-path 加载静态引导配置,其中包含 xDS 服务端地址(如 Istiod 的 gRPC 端点)。
  2. 订阅阶段:Envoy 向控制平面发起 LDS 订阅,获取 Listener 配置;Listener 中引用的 RouteConfiguration 触发 RDS 订阅;Cluster 声明触发 CDS 订阅;CDS 中的 type: EDS 触发 EDS 订阅。
  3. 增量推送:当节点池状态变化(如 Pod 就绪/摘除),控制平面推送增量 EDS 更新,Envoy 在 Worker 线程中无锁热切换端点列表。
  4. 一致性保证:Envoy 使用 version_info 和 nonce 机制确保配置有序生效,避免部分更新导致路由黑洞。
巡检关键指标:在节点池巡检中,应重点监控 Envoy 的 listener_manager.listener_added、cluster_manager.cluster_added、eds.update_success 等计数器,确认动态配置是否按预期生效。若 eds.update_rejected 持续增长,说明控制平面推送的端点数据格式异常或 Envoy 资源耗尽。