1. Envoy 数据面基础:架构概述与核心模型
Envoy 是一个高性能、可编程的 L3/L4/L7 代理,专为云原生环境设计。作为数据面组件,它负责处理所有进出服务的流量,并向上层控制面暴露统一的配置接口。理解 Envoy 的架构模型是排查容器网络缓存命中问题的基础。
1.1 Envoy 整体架构
Envoy 采用单进程多线程架构,主线程负责配置管理、统计收集和热重启协调,工作线程通过 L3 级连接均衡(如 SO_REUSEPORT)或 accept 均衡 来分担连接处理。每个工作线程运行独立的事件循环,不共享连接状态,从而避免锁竞争。
架构要点: Envoy 不依赖共享内存或跨线程锁来转发数据包,而是通过“每个工作线程独立监听 + 连接级分发”实现线性扩展。这一设计对缓存命中率有直接影响——连接亲和性决定了缓存条目在哪个线程上被访问。
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 等,分别对应不同的配置维度。
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。
- 缓存关键点: 连接亲和性、线程隔离、配置变更频率直接影响缓存命中率。