3. Envoy 基础架构:Listener、Cluster、Endpoint、Route 配置详解

Envoy 作为高性能数据平面代理,其核心配置模型围绕四个基本构件展开:Listener(监听器)、Cluster(集群)、Endpoint(端点)和 Route(路由)。理解这四者的关系与配置方式是掌握 Envoy 流量管理的基础,也是后续实现 GitOps 自动化回滚与恢复的前提。

3.1 核心架构概览

Envoy 的流量处理流程可以概括为:Listener 接收请求 → Route 匹配路由 → Cluster 选择上游集群 → Endpoint 转发到具体实例。下图展示了这一核心数据流。

Envoy 核心数据流:Listener → Route → Cluster → Endpoint Listener 0.0.0.0:8080 Route 路径 /api/* Cluster service-backend Endpoint 10.0.1.5:3000 配置说明 • Listener:定义 Envoy 监听的 IP 地址和端口,是流量的入口。 • Route:根据请求属性(路径、Header、Method 等)匹配并转发到指定 Cluster。 • Cluster:定义一组提供相同服务的上游主机,包含负载均衡策略、健康检查等配置。 • Endpoint:Cluster 中的具体后端实例,通常由服务发现动态提供或静态配置。 • 在 GitOps 场景中,这四个配置项均以 YAML 形式存储在 Git 仓库中,通过同步窗口管理变更。

3.2 Listener(监听器)

Listener 是 Envoy 流量的入口点。它定义了 Envoy 进程在哪个 IP 地址和端口上监听入站连接。每个 Listener 可以绑定多个 Filter Chain(过滤器链),用于处理不同协议或 TLS 配置的流量。

3.2.1 核心配置字段

字段 类型 说明 示例值
name string 监听器名称,用于标识和日志 http_listener
address SocketAddress 监听的 IP 和端口 0.0.0.0:8080
filter_chains list 过滤器链列表,处理入站流量 包含 HTTP 连接管理器
listener_filters list 在 filter_chains 之前执行的过滤器 OriginalDst、TLS Inspector
traffic_direction enum 流量方向:INBOUND / OUTBOUND INBOUND

3.2.2 典型配置示例

static_resources:
  listeners:
  - name: http_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: "/api/"
                route:
                  cluster: service_backend
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
GitOps 实践提示: Listener 配置通常较为稳定,变更频率低。在 GitOps 工作流中,建议将 Listener 配置与 Route/Cluster 配置分离存储,减少不必要的同步窗口触发。

3.3 Route(路由)

Route 配置定义了如何将进入 Listener 的请求匹配并转发到特定的 Cluster。Envoy 支持丰富的匹配条件,包括路径前缀、精确路径、正则表达式、HTTP Header、Query 参数等。

3.3.1 路由匹配与动作

每个 Route 条目包含两个核心部分:match(匹配条件)和 route(转发动作)。

匹配类型 配置字段 说明 示例
路径前缀 prefix 匹配 URL 路径前缀 /api/
精确路径 path 完全匹配 URL 路径 /healthz
正则路径 safe_regex 使用 RE2 正则匹配路径 ^/v[1-2]/.*
Header 匹配 headers 匹配 HTTP Header 键值对 env: canary
Query 参数 query_parameters 匹配 URL Query 参数 version=v2

3.3.2 路由配置示例

route_config:
  name: local_route
  virtual_hosts:
  - name: backend_services
    domains: ["*"]
    routes:
    - match:
        prefix: "/api/v1/"
      route:
        cluster: service_v1
        timeout: 5s
    - match:
        prefix: "/api/v2/"
      route:
        cluster: service_v2
        timeout: 10s
    - match:
        prefix: "/static/"
      route:
        cluster: static_assets
        prefix_rewrite: "/assets/"
    - match:
        prefix: "/"
      route:
        cluster: default_service
回滚关键点: 路由配置的变更(如修改 cluster 指向、调整超时时间)可能直接影响线上流量。在 GitOps 同步窗口中,建议对 Route 变更设置 人工审批 或 渐进式发布 策略,避免因错误路由导致全局故障。

3.4 Cluster(集群)

Cluster 定义了一组提供相同逻辑服务的上游主机集合。Envoy 通过 Cluster 管理负载均衡、健康检查、连接池、断路器等关键功能。

3.4.1 Cluster 核心配置

配置项 说明 常见值
name 集群名称,被 Route 引用 service_backend
type 服务发现类型 STRICT_DNS / STATIC / EDS
lb_policy 负载均衡策略 ROUND_ROBIN / LEAST_REQUEST / RING_HASH
connect_timeout 与上游建立连接的超时时间 0.5s
circuit_breakers 断路器配置,防止级联故障 最大连接数、最大请求数
health_checks 主动健康检查配置 HTTP / TCP 检查

3.4.2 典型 Cluster 配置

clusters:
- name: service_backend
  type: STRICT_DNS
  dns_lookup_family: V4_ONLY
  lb_policy: LEAST_REQUEST
  connect_timeout: 0.5s
  circuit_breakers:
    thresholds:
    - priority: DEFAULT
      max_connections: 1000
      max_pending_requests: 500
      max_requests: 2000
      max_retries: 3
  health_checks:
    timeout: 1s
    interval: 5s
    unhealthy_threshold: 3
    healthy_threshold: 2
    http_health_check:
      path: "/healthz"
  load_assignment:
    cluster_name: service_backend
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: service-backend.default.svc.cluster.local
              port_value: 3000

3.5 Endpoint(端点)

Endpoint 是 Cluster 中具体的后端实例,包含 IP 地址和端口。Envoy 支持多种方式获取 Endpoint 信息:

  • 静态配置(STATIC): 在配置文件中直接列出所有 Endpoint 地址。
  • DNS 解析(STRICT_DNS / LOGICAL_DNS): 通过 DNS 查询动态获取 Endpoint 列表。
  • EDS(Endpoint Discovery Service): 通过 xDS 协议从控制平面动态获取 Endpoint,是 Istio 等 Service Mesh 的默认方式。

3.5.1 Endpoint 配置对比

发现方式 适用场景 动态性 GitOps 管理复杂度
STATIC 测试环境、固定后端 低 低(直接写入 YAML)
STRICT_DNS Kubernetes Service、固定域名 中 中(需管理 DNS 记录)
EDS 大规模动态微服务、Service Mesh 高 高(需控制平面配合)

3.5.2 静态 Endpoint 配置示例

clusters:
- name: static_backend
  type: STATIC
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: static_backend
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: 10.0.1.10
              port_value: 3000
      - endpoint:
          address:
            socket_address:
              address: 10.0.1.11
              port_value: 3000
      - endpoint:
          address:
            socket_address:
              address: 10.0.1.12
              port_value: 3000

3.6 四者协同关系总结

下图展示了 Listener、Route、Cluster、Endpoint 在 Envoy 配置中的层级关系与数据流向,帮助理解 GitOps 变更影响范围。

Envoy 配置层级与数据流向 Listener (入口) Filter Chain Route Cluster A Cluster B Endpoint A1 Endpoint A2 Endpoint B1 Endpoint B2
GitOps 自动化回滚要点:
  • Listener 变更: 影响面最大(端口、协议变更),建议设置较长的同步窗口和人工审批。
  • Route 变更: 流量调度核心,建议使用 权重路由 或 影子流量 验证后再全量切换。
  • Cluster 变更: 负载均衡策略、超时、断路器参数调整需谨慎,错误配置可能导致服务雪崩。
  • Endpoint 变更: 在 GitOps 中通常由 Operator 自动管理,回滚时需确保 Endpoint 列表与 Cluster 配置一致。