4. Envoy 核心概念:Listener、Cluster、Endpoint、Filter、xDS 协议

Envoy 作为云原生服务网格的数据面核心,其架构围绕五个核心概念构建。理解这些概念是掌握 Envoy 配置、调试以及后续与 Cilium 联合升级链路追踪的基础。Envoy 通过一组标准化的 API(即 xDS 协议)动态获取这些配置,实现热更新与弹性伸缩。

4.1 核心概念总览

Envoy 的配置模型可以抽象为“监听-路由-转发”三层。下表总结了五个核心概念的定义与职责:

概念 英文 核心职责 类比(网络设备)
监听器 Listener 定义 Envoy 在哪个 IP:Port 上接收入站流量,以及如何处理 TLS 终止。 路由器上的 WAN 接口
集群 Cluster 定义一组提供相同服务的上游主机,以及负载均衡策略、连接池、健康检查。 路由器上的 LAN 网段
端点 Endpoint 属于某个集群的具体上游主机实例(IP:Port),是流量的最终目的地。 网段内的具体设备 IP
过滤器 Filter 可插拔的处理链,在流量路径上执行 HTTP 解析、RBAC、限流、日志、链路追踪等操作。 路由器上的 ACL / QoS 模块
xDS 协议 xDS 一组用于动态发现配置的 API 集合(LDS, RDS, CDS, EDS 等),实现控制面与数据面解耦。 SDN 控制器的南向接口
关键认知: 在 Cilium 与 Envoy 联合部署的场景中,Cilium 通常作为网络层(CNI)提供 eBPF 加速,而 Envoy 作为应用层代理处理七层流量。Envoy 的 Listener 和 Cluster 配置决定了哪些流量需要被拦截并注入追踪上下文。

4.2 核心概念详解

4.2.1 Listener(监听器)

Listener 是流量的入口。每个 Listener 绑定一个或多个地址端口,并可以配置多个 FilterChain(过滤器链)。Envoy 支持通过 LDS(Listener Discovery Service) 动态添加或修改监听器,无需重启进程。

  • 核心字段:address(监听地址)、filter_chains(过滤器链列表)、listener_filters(监听器级过滤器,如 TLS 检测)。
  • 典型场景:Sidecar 模式中,Envoy 监听 15001 端口,拦截 Pod 的所有出站流量。

4.2.2 Cluster(集群)

Cluster 定义了流量的上游目标池。它不直接指向具体 IP,而是通过 CDS(Cluster Discovery Service) 动态获取集群定义,再通过 EDS(Endpoint Discovery Service) 获取该集群的端点列表。

  • 核心字段:name(集群名称)、type(STRICT_DNS / STATIC / EDS)、lb_policy(ROUND_ROBIN / LEAST_REQUEST / RING_HASH)。
  • 链路追踪关联:集群的 upstream_http_protocol_options 或 http2_protocol_options 决定了是否支持 W3C Trace Context 传播。

4.2.3 Endpoint(端点)

Endpoint 是 Cluster 的实例化。当 Cluster 类型为 EDS 时,端点由控制面(如 Istio Pilot 或 Cilium Operator)通过 xDS 动态下发。每个端点包含 address(IP:Port)和 health_status(健康状态)。

4.2.4 Filter(过滤器)

Filter 是 Envoy 实现七层处理能力的核心机制。过滤器分为三类:

  • Listener Filter:在连接建立初期处理,如 TLS 检测、代理协议解析。
  • Network Filter:处理四层数据,如 TCP 代理、MySQL 代理。
  • HTTP Filter:处理七层 HTTP 数据,是链路追踪的关键位置。常见的 HTTP Filter 包括 Router、RBAC、Fault Injection、Trace。
实战要点: 在 Cilium 与 Envoy 联合升级时,需要确保 HTTP Connection Manager(HCM)中的 tracing 配置正确引用了 Zipkin 或 OpenTelemetry 收集器地址。Envoy 的 Trace Filter 会自动在请求头中注入 x-request-id 和 traceparent。

4.2.5 xDS 协议

xDS 是 Envoy 动态配置的基石。它是一组基于 gRPC 流或 REST-JSON 的 API 集合,允许控制面(Control Plane)实时推送配置变更到数据面(Envoy)。

API 名称 全称 发现内容
LDS Listener Discovery Service 监听器配置
RDS Route Discovery Service 路由表(匹配规则、目标集群)
CDS Cluster Discovery Service 集群定义
EDS Endpoint Discovery Service 集群内的端点列表
SDS Secret Discovery Service TLS 证书与密钥

4.3 核心概念关系图(SVG)

下图展示了 Envoy 数据面中 Listener、Filter、Cluster、Endpoint 之间的数据流关系,以及 xDS 协议如何从控制面动态下发配置。

Envoy 核心概念关系与 xDS 数据流 Envoy 核心概念关系与 xDS 数据流 控制面 (Control Plane) Istiod / Cilium Operator xDS 配置生成与推送 LDS / CDS / EDS RDS / SDS Envoy 数据面 (Data Plane) Listener IP:Port 绑定 Filter Chain HTTP / TCP / Trace Cluster 负载均衡 / 健康检查 Endpoint Pod IP:Port 实例 下游客户端 链路追踪关键点 1. Trace Filter 注入 span 2. Cluster 配置传播上下文 3. xDS 动态下发追踪配置

4.4 配置示例:Listener 与 Cluster 的静态配置

以下是一个简化的 Envoy 静态配置片段,展示 Listener 如何通过 Filter 路由到 Cluster,并启用链路追踪:

static_resources:
  listeners:
  - name: ingress_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:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: service_cluster }
          http_filters:
          - name: envoy.filters.http.router
          tracing:
            provider:
              name: envoy.tracers.zipkin
              typed_config:
                "@type": type.googleapis.com/envoy.config.trace.v3.ZipkinConfig
                collector_cluster: zipkin_collector
                collector_endpoint: "/api/v2/spans"
  clusters:
  - name: service_cluster
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: my-service.default.svc.cluster.local, port_value: 80 }
  - name: zipkin_collector
    type: STRICT_DNS
    connect_timeout: 1s
    load_assignment:
      cluster_name: zipkin_collector
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: tracing-collector.monitoring.svc.cluster.local, port_value: 9411 }
升级注意事项: 在 Cilium 与 Envoy 联合升级场景中,xDS 配置的版本兼容性至关重要。Envoy 1.24+ 默认使用 xDS v3 API,而 Cilium 1.13+ 的 Envoy 集成也基于 v3。升级前务必确认控制面(如 Cilium Operator)下发的 xDS 资源版本与数据面 Envoy 版本匹配,否则会导致配置拒绝或链路追踪数据丢失。

4.5 小结