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 控制器的南向接口 |
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。
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 协议如何从控制面动态下发配置。
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 }