Envoy 流量拓扑基础:Cluster、Endpoint、Listener、Route 配置模型

Envoy 作为服务网格的数据面核心,其流量处理能力建立在四个基础配置模型之上:Listener(监听器)、Route(路由)、Cluster(集群)和 Endpoint(端点)。理解这四个模型及其静态/动态资源管理方式,是掌握 Envoy 流量拓扑的基石。

2.1 四大核心配置模型

Envoy 的流量处理流水线遵循“监听 → 路由 → 转发”的线性路径。每个模型承担明确的职责:

模型 职责 类比
Listener 定义 Envoy 在哪个 IP:Port 上监听入站流量,以及使用何种协议(HTTP、TCP、TLS 等) 机场的登机口
Route 根据请求属性(Host、Path、Header 等)匹配并决定将流量转发到哪个 Cluster 登机口的航班指示牌
Cluster 定义一组提供相同服务的上游主机集合,以及负载均衡策略、连接池、健康检查等 航班的机组人员团队
Endpoint Cluster 中具体的上游主机实例(IP:Port),是流量的最终目的地 机组中的每位成员
关键理解: 流量从 Listener 进入,经过 Route 匹配,被转发到 Cluster,最终到达具体的 Endpoint。这四个模型构成了 Envoy 流量拓扑的完整闭环。

2.2 配置模型关系与流量路径

下图展示了 Envoy 内部四个模型之间的层级关系与流量流转路径:

Envoy 流量拓扑:Listener → Route → Cluster → Endpoint Listener 0.0.0.0:8080 Route Host: api.example.com Cluster service-api Endpoint 1 Endpoint 2 Endpoint 3 流量路径说明 ① 客户端请求到达 Listener ② Route 根据规则匹配 Cluster ③ Cluster 负载均衡到 Endpoint

2.3 静态资源 vs 动态资源

Envoy 支持两种资源配置方式:静态资源(Static)和动态资源(Dynamic)。静态资源在 Envoy 启动时通过配置文件一次性加载,之后不可变更;动态资源则通过 xDS 协议从控制面(如 Istiod)实时获取,支持热更新。

对比维度 静态资源 动态资源
配置来源 本地 YAML/JSON 配置文件 控制面 xDS 服务(CDS、EDS、LDS、RDS)
更新方式 需重启 Envoy 进程 热更新,无需重启
适用场景 固定基础设施、边缘代理 服务网格、动态微服务环境
配置复杂度 低,所有配置写在一个文件 高,需配合控制面协调
可观测性 静态,变更需人工审计 动态,变更可追踪、可回滚
最佳实践: 在生产服务网格中,推荐使用动态资源。Istio 通过 Pilot 组件向 Envoy 推送 LDS、RDS、CDS、EDS 更新,实现服务发现、流量路由、故障注入等策略的秒级生效。

2.4 静态资源配置示例

以下是一个完整的静态资源配置片段,展示了 Listener、Route、Cluster 和 Endpoint 的声明方式:

static_resources:
  listeners:
  - name: listener_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:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/api" }
                route: { cluster: service_api }
          http_filters:
          - name: envoy.filters.http.router

  clusters:
  - name: service_api
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_api
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 10.0.1.10, port_value: 9090 }
        - endpoint:
            address:
              socket_address: { address: 10.0.1.11, port_value: 9090 }

2.5 动态资源与 xDS 协议

动态资源通过以下 xDS API 实现:

  • LDS(Listener Discovery Service):动态下发 Listener 配置,包括端口、过滤器链、TLS 证书等。
  • RDS(Route Discovery Service):动态下发 Route 配置,支持按域名、路径、Header 等条件分流。
  • CDS(Cluster Discovery Service):动态下发 Cluster 配置,包括连接池大小、超时时间、健康检查参数等。
  • EDS(Endpoint Discovery Service):动态下发 Endpoint 列表,实现服务实例的自动发现与摘除。
注意: 动态资源虽然灵活,但需要控制面具备高可用能力。如果控制面故障,Envoy 会继续使用最后一次成功获取的配置,不会自动回退到静态配置。建议在 bootstrap 配置中同时设置静态 fallback 资源。

2.6 动态资源配置示例(bootstrap + xDS)

以下 bootstrap 配置声明 Envoy 通过 xDS 从控制面获取动态资源:

dynamic_resources:
  lds_config:
    api_config_source:
      api_type: GRPC
      transport_api_version: V3
      grpc_services:
      - envoy_grpc:
          cluster_name: xds_cluster
  cds_config:
    api_config_source:
      api_type: GRPC
      transport_api_version: V3
      grpc_services:
      - envoy_grpc:
          cluster_name: xds_cluster

static_resources:
  clusters:
  - name: xds_cluster
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    typed_extension_protocol_options:
      envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
        "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
        explicit_http_config:
          http2_protocol_options: {}
    load_assignment:
      cluster_name: xds_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: istiod.istio-system.svc.cluster.local, port_value: 15012 }

2.7 静态与动态的混合使用策略

在实际部署中,静态和动态资源并非互斥,而是可以混合使用:

资源类型 推荐方式 原因
xDS 控制面连接 静态 控制面地址固定,避免循环依赖
管理端口(Admin) 静态 运维入口需稳定可靠
业务 Listener 动态(LDS) 支持端口、协议、TLS 策略热更新
路由规则 动态(RDS) 灰度发布、流量镜像、故障注入等场景
上游集群 动态(CDS) 服务扩缩容、集群参数调整
端点列表 动态(EDS) 服务实例自动发现与健康检查
核心结论: Listener、Route、Cluster、Endpoint 是 Envoy 流量拓扑的四大支柱。静态资源适合固定不变的底座配置,动态资源(xDS)则赋予服务网格弹性与实时控制能力。在 Istio 环境中,这四个模型完全由控制面动态管理,SRE 无需手动修改 Envoy 配置文件。