连接管理基础:Listener、Filter、Cluster、Endpoint 概念解析
Envoy 代理的连接管理围绕四个核心抽象构建:Listener(监听器)、Filter(过滤器)、Cluster(集群) 和 Endpoint(端点)。这四个概念构成了 Envoy 处理入站流量、执行中间处理逻辑、以及将请求分发到上游服务的完整链路。理解它们之间的关系是进行连接断开与重试机制调优的前提。
2.1 Listener:入站流量的入口
Listener 是 Envoy 接收客户端连接的入口点。它绑定到指定的 IP 地址和端口,监听入站 TCP 连接或 UDP 数据报。每个 Listener 可以配置独立的协议检测、连接超时、TLS 终止以及统计信息。
| 配置项 | 说明 | 性能影响 |
|---|---|---|
address |
绑定的 IP:Port,如 0.0.0.0:8080 |
端口冲突会导致启动失败 |
bind_to_port |
是否实际绑定端口(调试时可设为 false) | false 时无法接收流量 |
listener_filters |
在 Filter 链之前执行的预过滤器 | 增加处理延迟,但可做早期丢弃 |
connection_limit |
最大并发连接数 | 防止资源耗尽,过高导致 OOM |
tcp_backlog_size |
TCP 监听队列大小 | 过小导致连接拒绝(SYN 泛洪) |
调优要点:在高并发场景下,
connection_limit 应结合系统 ulimit -n 设置,避免 Envoy 打开过多文件描述符。同时 tcp_backlog_size 建议设置为 1024 或更高,防止突发流量下的连接丢失。
2.2 Filter:可插拔的处理管道
Filter 是 Envoy 最灵活的设计之一。它允许将多个处理模块串联成管道,每个 Filter 负责一个特定的功能。Filter 分为三类:
- Listener Filter:在连接建立初期执行,用于 TLS 检测、代理协议解析等。
- Network Filter (L3/L4):处理原始 TCP 数据,如 TCP 代理、MySQL 代理。
- HTTP Filter (L7):处理 HTTP 请求/响应,如路由、限流、重试、故障注入。
重试机制的关键 Filter:
envoy.filters.http.router:内置重试逻辑,支持retry_on条件。envoy.filters.http.fault:用于测试重试行为,可注入延迟和错误。envoy.filters.http.circuit_breaker:与重试配合,防止重试风暴。
2.3 Cluster:上游服务的逻辑分组
Cluster 定义了一组提供相同服务的上游主机。Envoy 通过 Cluster 管理连接池、负载均衡、健康检查和断路器。Cluster 的类型决定了端点发现方式:
| 类型 | 发现方式 | 适用场景 |
|---|---|---|
STATIC |
静态配置 IP:Port 列表 | 测试、固定后端 |
STRICT_DNS |
DNS 解析,严格遵循 TTL | Kubernetes Headless Service |
LOGICAL_DNS |
DNS 解析,但连接复用 | 需要长连接的后端 |
EDS |
通过 Envoy Discovery Service 动态发现 | 大规模微服务、动态扩缩容 |
2.4 Endpoint:实际处理请求的上游实例
Endpoint 是 Cluster 中的最小单元,代表一个具体的上游服务实例(IP:Port)。每个 Endpoint 可以携带元数据,如权重、区域、健康状态。Envoy 通过健康检查动态标记 Endpoint 为健康或不健康,不健康的 Endpoint 会被负载均衡器排除。
2.5 四者协作:一次请求的完整生命周期
理解四个抽象如何协作,是调优连接断开和重试机制的基础。以下是一个典型 HTTP 请求的路径:
- Listener 接受连接:客户端 TCP 连接到达 Listener,Envoy 分配连接槽位并记录统计。
- Listener Filter 预处理:如 TLS 握手、代理协议解析,提取原始客户端 IP。
- Network Filter 链:HTTP 连接管理器(HCM)将 TCP 字节流解析为 HTTP 请求。
- HTTP Filter 链:路由 Filter 根据
virtual_hosts和routes匹配目标 Cluster。 - Cluster 选择 Endpoint:负载均衡器从健康 Endpoint 列表中选取一个实例。
- 连接池复用:Envoy 从连接池中获取或新建到上游 Endpoint 的连接。
- 请求转发与响应:请求发送到上游,响应沿 Filter 链返回客户端。
连接断开调优关联:如果 Listener 的
connection_limit 设置过小,新连接会被直接拒绝,导致客户端重试。如果 Cluster 的 max_requests_per_connection 设置过低,频繁断开连接会增加握手开销。重试机制必须与 Cluster 的断路器配合,否则重试风暴会压垮上游。
2.6 配置示例:四者联动
以下是一个简化配置,展示 Listener、Filter、Cluster、Endpoint 的 YAML 结构:
static_resources:
listeners:
- name: http_listener
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
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:
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match: { prefix: "/" }
route:
cluster: service_backend
retry_policy: # 重试策略
retry_on: gateway-error
num_retries: 3
http_filters:
- name: envoy.filters.http.router
clusters:
- name: service_backend
connect_timeout: 0.25s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_backend
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: 10.0.1.1, port_value: 8080 }
- endpoint:
address:
socket_address: { address: 10.0.1.2, port_value: 8080 }
circuit_breakers: # 断路器配置
thresholds:
- priority: DEFAULT
max_connections: 100
max_pending_requests: 10
max_requests: 1000
max_retries: 3
配置解读:Listener 监听 8080 端口,HTTP 连接管理器将流量路由到
service_backend 集群。集群使用 STRICT_DNS 发现两个 Endpoint,负载均衡策略为轮询。重试策略配置了最多 3 次重试,仅对网关错误触发。断路器限制了最大连接数和重试数,防止重试风暴。