2. 核心概念:Listener、Cluster、Endpoint、Route、Filter、VirtualHost,以及它们之间的关系
Envoy 作为数据面代理,其核心配置模型由六个基础概念构成。理解这些概念及其关系,是掌握 Envoy 流量治理与故障排查的基石。本章将逐一拆解这些概念,并通过结构图与表格阐明它们如何协同工作。
2.1 概念速览与职责定义
Envoy 的配置模型遵循“监听 → 路由 → 转发”的线性逻辑。下表概括了每个核心概念的职责:
| 概念 | 英文名称 | 核心职责 | 类比(传统网络) |
|---|---|---|---|
| Listener | Listener | 定义 Envoy 在哪个 IP:Port 上监听入站流量,以及使用的协议(TCP/UDP)。 | Nginx 的 server 块 + listen 指令 |
| Filter | Filter | 挂载在 Listener 或 HTTP 连接管理器上的处理插件,负责协议解析、流量拦截、日志、限流等。 | 中间件/拦截器链 |
| VirtualHost | VirtualHost | 在 HTTP 层面,根据请求的 Host 头将流量分组,并关联一组路由规则。 |
Nginx 的 server_name 匹配 |
| Route | Route | 定义匹配条件(Path、Header、Method 等)与目标 Cluster 的映射关系。 | Nginx 的 location 块 |
| Cluster | Cluster | 代表一组提供相同服务的上游主机(Endpoints),并配置负载均衡策略、健康检查、连接池等。 | Nginx 的 upstream 块 |
| Endpoint | Endpoint | Cluster 中的具体上游实例,通常表示为 IP:Port,是流量的最终目的地。 | 后端服务器节点 |
2.2 概念关系全景图
下图展示了从入站流量到后端服务的完整数据流,以及各概念之间的层级关系:
2.3 核心概念深度解析
2.3.1 Listener(监听器)
Listener 是流量的入口。Envoy 支持同时监听多个端口,每个 Listener 可独立配置协议(TCP/UDP/HTTP)和网络过滤器。生产环境中,通常为南北向流量(如 443/80)和东西向流量(如 15001)分别定义不同的 Listener。
listeners:
- name: ingress_http
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_cluster
2.3.2 Filter(过滤器)
Filter 是 Envoy 可扩展性的核心。它分为 网络层过滤器(如 TCP Proxy、HTTP Connection Manager)和 HTTP 层过滤器(如 Router、RBAC、Rate Limit)。Filter 链的执行顺序决定了流量的处理逻辑。
- 网络层 Filter:直接操作原始字节流,适用于 TCP/UDP 协议。
- HTTP 层 Filter:在 HTTP Connection Manager 内部运行,可访问请求/响应头、Body 等语义信息。
2.3.3 VirtualHost(虚拟主机)
VirtualHost 仅在 HTTP 场景下生效。它根据请求的 Host 头将流量路由到不同的路由表。一个 Listener 可以包含多个 VirtualHost,实现多域名复用同一端口。
virtual_hosts:
- name: api_service
domains: ["api.example.com", "api.internal"]
routes:
- match:
prefix: "/v1/users"
route:
cluster: user_cluster
- name: web_service
domains: ["www.example.com"]
routes:
- match:
prefix: "/"
route:
cluster: web_cluster
2.3.4 Route(路由)
Route 定义匹配条件与目标 Cluster 的映射。支持多种匹配方式:prefix(前缀)、path(精确路径)、regex(正则)、headers(请求头)、query_parameters(查询参数)。路由优先级按配置顺序决定,第一条匹配即生效。
2.3.5 Cluster(集群)
Cluster 是上游服务的抽象。它定义了如何发现 Endpoint(静态配置、DNS、EDS)、负载均衡算法(Round Robin、Least Request、Ring Hash)、健康检查策略(主动/被动)、连接池大小等。Cluster 是流量治理的核心配置点。
clusters:
- name: user_cluster
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: LEAST_REQUEST
load_assignment:
cluster_name: user_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: user-service.default.svc.cluster.local
port_value: 8080
health_checks:
- timeout: 1s
interval: 5s
unhealthy_threshold: 3
healthy_threshold: 1
http_health_check:
path: "/health"
2.3.6 Endpoint(端点)
Endpoint 是流量的最终落脚点。在 Kubernetes 环境中,Endpoint 通常由控制面(如 xDS 的 EDS 服务)动态下发,对应 Pod 的 IP:Port。Envoy 会实时跟踪 Endpoint 的健康状态,自动摘除不健康的实例。
2.4 概念关系总结表
| 关系维度 | 说明 | 典型故障场景 |
|---|---|---|
| Listener → Filter | Listener 持有 Filter 链,Filter 处理入站连接。 | Filter 配置错误导致连接被拒绝或协议解析失败。 |
| Filter → VirtualHost | HTTP Connection Manager 将请求交给 VirtualHost 匹配。 | VirtualHost 的 domains 未匹配到请求的 Host 头,返回 404。 |
| VirtualHost → Route | VirtualHost 包含一组 Route,按顺序匹配。 | Route 匹配条件过于宽泛或顺序错误,导致流量进入错误 Cluster。 |
| Route → Cluster | Route 指定目标 Cluster 名称。 | Cluster 名称拼写错误或未定义,Envoy 返回 503。 |
| Cluster → Endpoint | Cluster 管理一组 Endpoint,负责负载均衡与健康检查。 | 所有 Endpoint 不健康,流量被丢弃或返回 503。 |
2.5 配置层级与 xDS 映射
Envoy 的动态配置通过 xDS 协议下发,每个核心概念对应一个独立的发现服务:
2.6 故障排查视角:概念链断裂点
在实际运维中,流量异常往往源于概念链的某个环节断裂。以下是每个环节的典型故障模式:
- Listener 层:端口冲突、IP 绑定失败、TLS 证书缺失。
- Filter 层:HTTP Connection Manager 配置错误、自定义 Filter 崩溃、Filter 顺序导致逻辑错误。
- VirtualHost 层:
domains未匹配(如客户端发送Host: api.example.com,但 VirtualHost 配置为api.example.org)。 - Route 层:路由匹配顺序错误(宽泛路由覆盖了精确路由)、正则表达式语法错误。
- Cluster 层:Cluster 类型配置错误(如使用 STRICT_DNS 但 DNS 解析失败)、负载均衡策略导致流量倾斜。
- Endpoint 层:健康检查失败、EDS 推送延迟、Endpoint 权重配置异常。
/config_dump)查看当前生效的配置快照,逐层对比预期配置与实际配置,是定位概念链断裂的最有效手段。