Envoy 基础回顾:架构概览与核心配置

在深入故障注入与自动化回滚护栏之前,必须牢固掌握 Envoy 的基础架构与配置模型。Envoy 并非简单的代理,而是一个高性能、可编程的 L3/L4/L7 数据平面,其核心设计围绕 Listener、Cluster、Route 三大抽象展开,并通过 xDS 协议实现动态、热更新的配置管理。本节将系统回顾这些基础概念,为后续的故障注入实验奠定坚实的知识基础。

Envoy 架构概览

Envoy 采用单进程多线程架构,主线程负责配置管理与统计刷新,工作线程通过非阻塞事件循环处理网络 I/O。其内部组件按功能分层,形成清晰的数据处理流水线。

核心设计原则: Envoy 将数据平面与控制平面解耦。数据平面负责高效转发,控制平面(如 Istiod)通过 xDS 协议下发配置,使得 Envoy 可以在不重启进程的情况下动态调整路由、负载均衡、故障注入等行为。
Envoy 内部架构分层 网络层 (Network Layer) Listener 管理、TCP/UDP 连接建立、TLS 终止、原始 socket 过滤 HTTP 连接管理 (HTTP Connection Manager / HCM) HTTP/1.1、HTTP/2、HTTP/3 编解码、请求头处理、路由匹配 L7 过滤器链 (HTTP Filter Chain) 故障注入、限流、RBAC、CORS、gRPC-Web、本地限流、外部授权 路由与上游 (Router & Upstream) Cluster 选择、负载均衡、连接池、断路器、重试、超时 故障注入过滤器位于 L7 过滤器链中,在路由决策之前或之后执行

三大核心配置:Listener / Cluster / Route

Envoy 的静态或动态配置围绕三个核心资源构建。理解它们之间的关系是编写任何 Envoy 配置(包括故障注入策略)的前提。

配置资源 作用域 关键字段 与故障注入的关系
Listener 定义 Envoy 监听的 IP:Port 及协议 address, filter_chains, listener_filters 故障注入过滤器挂载在 Listener 的 HTTP 连接管理器过滤器链中
Cluster 定义上游服务集群(后端实例组) hosts, lb_policy, circuit_breakers, health_checks 故障注入的目标是发往 Cluster 的流量;断路器与健康检查影响故障注入的可见性
Route 定义请求匹配规则与转发目标 match, route, weighted_clusters, request_headers_to_add 故障注入可以按路由粒度(特定 path、header、vCluster)生效
配置层次提示: 一个 Listener 可以包含多个 Route Table;一个 Route 可以指向多个 Cluster(通过权重路由)。故障注入过滤器通常配置在 HTTP Connection Manager 的 http_filters 数组中,位于 Router 过滤器之前。

xDS 协议与动态配置

xDS(Discovery Service)是 Envoy 动态配置的核心协议族。控制平面(如 Istiod、Kong Mesh、自定义控制面)通过 gRPC 流或 REST-JSON 将配置推送到 Envoy 节点,实现零停机配置更新。

主要的 xDS 资源类型包括:

  • LDS (Listener Discovery Service) — 动态下发 Listener 配置。
  • RDS (Route Discovery Service) — 动态下发 Route 配置。
  • CDS (Cluster Discovery Service) — 动态下发 Cluster 配置。
  • EDS (Endpoint Discovery Service) — 动态下发 Cluster 的端点(后端实例 IP:Port)列表。
  • SDS (Secret Discovery Service) — 动态下发 TLS 证书与密钥。
xDS 动态配置流程 控制平面 Istiod / 自定义控制面 聚合配置、生成 xDS 资源 gRPC 流 Envoy 数据平面 接收 xDS 资源 热更新 Listener/Route/Cluster xDS 订阅示例 LDS → 获取 Listener 配置 RDS → 获取 Route 配置 CDS/EDS → 获取 Cluster 与端点 动态配置对故障注入的意义 通过 RDS 或 LDS 动态调整故障注入百分比、延迟分布、错误码,无需重启 Envoy 进程

配置示例:静态配置中的故障注入

以下是一个简化的 Envoy 静态配置片段,展示了 Listener、Route、Cluster 以及故障注入过滤器的基本结构。在实际生产环境中,这些配置通常通过 xDS 动态下发。

static_resources:
  listeners:
  - name: ingress_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: backend_cluster }
          http_filters:
          - name: envoy.filters.http.fault
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
              delay:
                fixed_delay: 5s
                percentage: { numerator: 10, denominator: HUNDRED }
              abort:
                http_status: 503
                percentage: { numerator: 5, denominator: HUNDRED }
          - name: envoy.filters.http.router
  clusters:
  - name: backend_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: backend_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: backend-service, port_value: 3000 }
配置顺序关键: 在 http_filters 列表中,故障注入过滤器必须位于 Router 过滤器之前。如果顺序颠倒,故障注入将不会生效,因为请求在到达故障注入过滤器之前已经被路由并转发到上游。

Envoy 配置模型与自动化回滚护栏的关联

理解 Envoy 的架构与配置模型,是设计自动化回滚护栏测试验证方案的基础。以下表格总结了关键关联点:

Envoy 概念 在回滚护栏测试中的角色
Listener + HCM 故障注入过滤器的挂载点;测试验证需要确认过滤器是否按预期注入到指定 Listener 的过滤器链中
Route 匹配 按 path、header、method 等条件限定故障注入范围;回滚护栏需验证匹配逻辑是否在配置更新后仍正确
Cluster + 端点 故障注入的目标上游;回滚护栏需验证故障注入是否仅影响目标 Cluster,而不影响其他 Cluster 的流量
xDS 动态更新 回滚护栏的核心场景:模拟故障注入配置的推送、验证 Envoy 热更新后的行为、检测配置回滚是否及时恢复