1. Envoy 数据面基础:架构概述与核心模型

Envoy 是一个高性能、可编程的 L3/L4/L7 代理,专为云原生环境设计。作为数据面组件,它负责处理所有进出服务的流量,并向上层控制面暴露统一的配置接口。理解 Envoy 的架构模型是排查容器网络缓存命中问题的基础。

1.1 Envoy 整体架构

Envoy 采用单进程多线程架构,主线程负责配置管理、统计收集和热重启协调,工作线程通过 L3 级连接均衡(如 SO_REUSEPORT)或 accept 均衡 来分担连接处理。每个工作线程运行独立的事件循环,不共享连接状态,从而避免锁竞争。

架构要点: Envoy 不依赖共享内存或跨线程锁来转发数据包,而是通过“每个工作线程独立监听 + 连接级分发”实现线性扩展。这一设计对缓存命中率有直接影响——连接亲和性决定了缓存条目在哪个线程上被访问。
Envoy 数据面架构概览 主线程 (Main Thread) xDS 配置订阅 统计/日志聚合 热重启协调 Admin 接口 工作线程 1 事件循环 (Event Loop) 连接处理 L3/L4/L7 过滤 本地缓存 工作线程 2 事件循环 (Event Loop) 连接处理 L3/L4/L7 过滤 本地缓存 连接分发层 (SO_REUSEPORT / Accept 均衡) 控制面 (xDS Server / Istio / Consul / K8s API) 每个工作线程拥有独立的连接池和缓存,线程间不共享转发状态

1.2 Listener / Cluster / Endpoint 模型

Envoy 使用三层抽象模型来描述流量处理路径:Listener 定义入口,Cluster 定义上游服务组,Endpoint 定义具体的后端实例。这三层模型是 xDS 配置的核心对象,也是缓存命中分析的关键维度。

模型层 角色 缓存相关属性 典型配置字段
Listener 流量入口,绑定 IP:Port,应用过滤器链 连接空闲超时、TLS 会话复用、per-connection buffer address, filter_chains, connection_buffer_limit
Cluster 上游服务组,定义负载均衡策略、连接池、健康检查 连接池大小、空闲超时、健康检查间隔、circuit breaker type, connect_timeout, max_requests_per_connection
Endpoint 具体的后端实例(IP:Port),由 EDS 动态下发 权重、健康状态、locality、metadata socket_address, health_status, load_balancing_weight
缓存命中视角: Listener 的 connection_buffer_limit 决定了每个连接可缓存的请求元数据上限;Cluster 的 max_requests_per_connection 控制连接复用深度,直接影响连接级缓存的命中率。Endpoint 的 locality 信息用于区域感知路由,避免跨 AZ 缓存失效。

1.3 xDS 协议与动态配置

xDS(Discovery Service)是 Envoy 与控制面之间的标准配置协议,支持动态发现各类资源。Envoy 通过 gRPC 流或 REST-JSON 从控制面订阅配置变更,实现零停机重载。xDS 协议族包括 LDS、RDS、CDS、EDS 等,分别对应不同的配置维度。

xDS 协议交互流程 控制面 (xDS Server) LDS: Listener 配置 RDS: Route 配置 CDS: Cluster 配置 EDS: Endpoint 配置 SDS: Secret 配置 Envoy 数据面 gRPC Stream / REST 订阅 & ACK 本地配置缓存 热更新生效 统计上报 推送配置 (SotW / Delta) ACK / NACK 配置生效顺序:LDS → RDS → CDS → EDS → SDS 先有 Listener,才能关联 Route;先有 Cluster,才能下发 Endpoint xDS 支持 State of the World (全量) 和 Delta (增量) 两种推送模式,Delta 模式对缓存更新更友好

1.4 关键配置示例

以下是一个典型的 Envoy 静态配置片段,展示了 Listener、Cluster 和 Endpoint 的声明方式。在实际生产环境中,这些配置通常由 xDS 动态下发。

static_resources:
  listeners:
  - name: ingress_listener
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: backend_cluster }
          http_filters:
          - name: envoy.filters.http.router

  clusters:
  - name: backend_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: backend_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 10.0.0.1, port_value: 8080 }
        - endpoint:
            address:
              socket_address: { address: 10.0.0.2, port_value: 8080 }
缓存命中陷阱: 当 Cluster 的 type 设置为 STRICT_DNS 时,Envoy 会定期解析 DNS 并更新 Endpoint 列表。如果 DNS TTL 设置过短,会导致 Endpoint 频繁变更,进而使连接池和缓存条目大量失效。建议将 DNS TTL 与缓存超时时间对齐,避免不必要的缓存抖动。

1.5 本章小结

  • Envoy 架构: 单进程多线程,主线程负责控制面交互,工作线程独立处理连接和缓存。
  • 三层模型: Listener(入口)→ Cluster(服务组)→ Endpoint(实例),每层都有独立的缓存参数。
  • xDS 协议: 支持全量和增量推送,配置生效顺序为 LDS → RDS → CDS → EDS → SDS。
  • 缓存关键点: 连接亲和性、线程隔离、配置变更频率直接影响缓存命中率。