连接管理基础:Listener、Filter、Cluster、Endpoint 概念解析

Envoy 代理的连接管理围绕四个核心抽象构建:Listener(监听器)、Filter(过滤器)、Cluster(集群) 和 Endpoint(端点)。这四个概念构成了 Envoy 处理入站流量、执行中间处理逻辑、以及将请求分发到上游服务的完整链路。理解它们之间的关系是进行连接断开与重试机制调优的前提。

Envoy 核心抽象:Listener → Filter → Cluster → Endpoint Listener 监听端口与协议 • 绑定 IP:Port • 协议检测 (HTTP/TCP) • 连接接受与生命周期 • 统计与日志 流量 Filter 处理管道 • 连接管理器 • HTTP 路由 • 重试/熔断 • 健康检查 路由 Cluster 上游服务组 • 负载均衡策略 • 连接池管理 • 断路器设置 • 超时配置 分发 Endpoint IP:Port 权重 状态 数据流说明 1. 客户端请求到达 Listener 监听的端口(如 80/443)。 2. Listener 将原始连接交给 Filter 链处理(协议解析、路由匹配)。 3. Filter 链根据路由规则选择目标 Cluster。 4. Cluster 根据负载均衡算法从 Endpoint 列表中选取一个上游实例。 5. Envoy 建立与上游 Endpoint 的连接并转发请求。 关键调优点:Listener 连接超时、Filter 重试策略、Cluster 连接池大小、Endpoint 健康检查频率。

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 会被负载均衡器排除。

Cluster 与 Endpoint 关系:负载均衡与健康检查 Cluster: service-backend 负载均衡器 Endpoint 1 10.0.1.1:8080 Endpoint 2 10.0.1.2:8080 Endpoint 3 10.0.1.3:8080 健康 不健康(已排除) 健康

2.5 四者协作:一次请求的完整生命周期

理解四个抽象如何协作,是调优连接断开和重试机制的基础。以下是一个典型 HTTP 请求的路径:

  1. Listener 接受连接:客户端 TCP 连接到达 Listener,Envoy 分配连接槽位并记录统计。
  2. Listener Filter 预处理:如 TLS 握手、代理协议解析,提取原始客户端 IP。
  3. Network Filter 链:HTTP 连接管理器(HCM)将 TCP 字节流解析为 HTTP 请求。
  4. HTTP Filter 链:路由 Filter 根据 virtual_hosts 和 routes 匹配目标 Cluster。
  5. Cluster 选择 Endpoint:负载均衡器从健康 Endpoint 列表中选取一个实例。
  6. 连接池复用:Envoy 从连接池中获取或新建到上游 Endpoint 的连接。
  7. 请求转发与响应:请求发送到上游,响应沿 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 次重试,仅对网关错误触发。断路器限制了最大连接数和重试数,防止重试风暴。