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 概念关系全景图

下图展示了从入站流量到后端服务的完整数据流,以及各概念之间的层级关系:

Envoy 核心概念关系与数据流 Listener 0.0.0.0:8080 (HTTP) Filter 链 HTTP Connection Manager VirtualHost Host: api.example.com Route 匹配规则 Path: /v1/users/* Headers: method=GET Cluster service-user-cluster LB: Round Robin Endpoint 10.0.1.1:8080 Endpoint 10.0.1.2:8080 Endpoint 10.0.1.3:8080 数据流方向 Listener → Filter → VirtualHost → Route → Cluster → Endpoint
排查要点: 当流量异常时,按此链路逐层排查:Listener 是否监听成功 → Filter 链是否阻断 → VirtualHost 是否匹配 → Route 规则是否命中 → Cluster 是否有健康 Endpoint。

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 协议下发,每个核心概念对应一个独立的发现服务:

核心概念与 xDS 发现服务映射 Listener LDS Filter LDS (内嵌) Route RDS Cluster CDS Endpoint EDS LDS: Listener Discovery Service | RDS: Route Discovery Service | CDS: Cluster Discovery Service | EDS: Endpoint Discovery Service
常见误区: VirtualHost 并非独立的 xDS 资源,它内嵌在 RDS 或 LDS 的 HTTP Connection Manager 配置中。排查时需注意,VirtualHost 的变更通常通过 RDS 或 LDS 更新下发。

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 权重配置异常。
最佳实践: 在 Envoy 管理页面(/config_dump)查看当前生效的配置快照,逐层对比预期配置与实际配置,是定位概念链断裂的最有效手段。