4. Envoy 网关架构概览:核心组件与数据面/控制面分离

Envoy 是云原生时代高性能、可编程的七层代理与网关,其架构围绕四个核心抽象构建:Listener、Cluster、Route、Endpoint。理解这四者的关系以及数据面与控制面分离的设计,是进行 Envoy 网关参数配置与 GitOps 交付的基础。

4.1 核心组件:四层抽象模型

Envoy 将网络流量处理路径抽象为四个层级,每个层级负责独立的职责,通过静态文件或动态 xDS 协议进行配置。

组件 职责 类比
Listener 定义 Envoy 监听的 IP 地址、端口及传输层协议(TCP/UDP)。它是流量的入口。 机场的登机口
Route 定义匹配规则(域名、路径、Header)并将请求路由到指定 Cluster。支持权重分流、重定向、直接响应。 登机牌上的目的地标签
Cluster 定义一组提供相同服务的上游主机集合,以及连接池、负载均衡策略、健康检查等行为。 飞往同一城市的航班机组
Endpoint Cluster 中具体的上游主机实例(IP:Port),是流量的最终目的地。 航班上的具体座位
关键原则: 在 GitOps 场景下,这四个组件的配置通常以 Kubernetes CRD(如 EnvoyProxy、HTTPRoute)的形式存储在 Git 仓库中,通过控制器转换为 Envoy 原生 xDS 资源。

4.2 数据面与控制面分离架构

Envoy 原生采用 数据面(Data Plane) 与 控制面(Control Plane) 分离的架构。数据面负责处理实际流量,控制面负责下发配置与策略。这种分离带来了极致的扩展性与运维灵活性。

  • 数据面(Envoy Proxy):无状态、高性能转发。只负责执行,不负责决策。通过 xDS API 从控制面拉取最新的 Listener、Cluster、Route、Endpoint 配置。
  • 控制面(如 Istio Pilot、Kuma CP、自定义 xDS Server):有状态、集中决策。负责将用户意图(如 Istio VirtualService、DestinationRule)转换为 Envoy 可理解的 xDS 资源,并推送给所有数据面实例。
GitOps 集成点: 控制面本身也可以作为 GitOps 的“Agent”。用户将网关配置提交到 Git 仓库,GitOps Operator(如 Argo CD)将配置同步到 Kubernetes 集群,控制面监听到 CRD 变化后,自动生成并推送 xDS 配置给 Envoy 数据面。
Envoy 核心组件与数据流(数据面视角) 外部流量 Listener Route Cluster Endpoint 上游服务 数据流方向:外部流量 → Listener → Route → Cluster → Endpoint → 上游服务 每个组件均可通过 xDS API 动态更新,无需重启 Envoy 进程

4.3 xDS 协议:控制面与数据面的通信桥梁

xDS(Discovery Service)是 Envoy 数据面与控制面之间的标准通信协议集合。每个核心组件对应一个独立的 xDS API:

  • LDS (Listener Discovery Service):下发 Listener 配置。
  • RDS (Route Discovery Service):下发 Route 配置。
  • CDS (Cluster Discovery Service):下发 Cluster 配置。
  • EDS (Endpoint Discovery Service):下发 Endpoint 配置。

控制面通过 gRPC 流或 REST-JSON 将配置推送给 Envoy。Envoy 在收到新配置后,会优雅地热更新,不中断现有连接。

GitOps 实践注意: 当使用 GitOps 管理 Envoy 配置时,控制面本身也需要被 GitOps 管理。确保控制面的 CRD 定义(如 Istio Operator、Kuma CRDs)与 Envoy 数据面版本兼容,避免因 xDS 版本不匹配导致配置下发失败。
Envoy 数据面与控制面分离架构 控制面(Control Plane) xDS Server(Istio Pilot / Kuma CP) 配置转换(CRD → xDS) GitOps 同步(Argo CD / Flux) Git 仓库(声明式配置) 数据面(Data Plane) Envoy Proxy 实例 1 Envoy Proxy 实例 2 Envoy Proxy 实例 N 实际流量处理 控制面通过 xDS(LDS/RDS/CDS/EDS)协议推送配置,数据面无状态转发流量

4.4 核心组件配置示例(静态文件)

以下是一个简化的 Envoy 静态配置片段,展示了四个核心组件如何协同工作:

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_cluster }
          http_filters:
          - name: envoy.filters.http.router

  clusters:
  - name: service_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 10.0.0.1, port_value: 80 }
        - endpoint:
            address:
              socket_address: { address: 10.0.0.2, port_value: 80 }
GitOps 映射: 在 Kubernetes 环境中,上述静态配置通常由控制面自动生成。GitOps 仓库中存储的是更高级别的抽象(如 HTTPRoute),而非原始的 Envoy 配置。控制面负责将 HTTPRoute 转换为 RouteConfiguration,将 Backend 转换为 Cluster 和 Endpoint。

4.5 架构优势总结

  • 热更新:通过 xDS 动态下发配置,Envoy 无需重启即可生效,适合频繁变更的 GitOps 流程。
  • 可观测性:数据面暴露丰富的指标(请求数、延迟、错误率),控制面可集中采集并关联配置版本。
  • 多租户隔离:每个数据面实例独立运行,控制面可以按租户或命名空间隔离配置。
  • 声明式管理:控制面将 Git 仓库中的声明式配置(CRD)转换为 Envoy 原生配置,实现“配置即代码”。