3. Envoy故障注入原理:HTTP故障过滤器配置详解

Envoy 的 HTTP 故障过滤器(Fault Filter) 是服务网格混沌工程的核心工具。它允许在应用层(L7)对出站或入站流量注入延迟与中断,而无需修改业务代码。本章将深入剖析该过滤器的配置结构、YAML 字段语义以及延迟/中断注入的完整示例。

3.1 故障过滤器在 Envoy 架构中的位置

故障过滤器作为 HTTP 连接管理器(HttpConnectionManager)下的一个 HTTP 过滤器 运行。其处理阶段位于路由决策之后、上游集群转发之前。下图展示了过滤器在请求处理流水线中的位置:

Envoy HTTP 过滤器链(故障注入位置) 入站请求 Router Fault CORS RBAC 上游集群 故障注入决策逻辑 匹配路由 → 检查百分比 命中 → 注入延迟/中断
关键理解: 故障过滤器在路由匹配之后生效,因此可以针对特定路由、集群或请求头进行条件注入。它不会影响控制面通信,只作用于数据面请求。

3.2 故障过滤器核心配置结构

故障过滤器的配置位于 envoy.filters.http.fault 过滤器名称下,其顶层结构包含三个主要部分:延迟注入(delay)、中断注入(abort) 和 响应速率限制(response_rate_limit)。以下 YAML 展示了完整骨架:

name: envoy.filters.http.fault
typed_config:
  "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
  delay:
    # 延迟注入配置
    percent: 50
    fixed_delay: 5s
    header_delay: {}
  abort:
    # 中断注入配置
    percentage:
      numerator: 30
      denominator: HUNDRED
    http_status: 503
    grpc_status: 14
    header_abort: {}
  response_rate_limit:
    # 响应速率限制(可选)
    percentage:
      numerator: 100
      denominator: HUNDRED
    limit_kbps: 100
  max_active_faults: 100
  filter_enabled:
    # 过滤器全局启用百分比
    numerator: 100
    denominator: HUNDRED
  filter_enabled_metadata: {}

3.3 延迟注入(Delay)配置详解

延迟注入模拟网络延迟或服务处理缓慢。Envoy 支持两种延迟模式:固定延迟 和 基于请求头的延迟。

字段 类型 默认值 说明
percent uint32 0 延迟注入的请求百分比(0-100),已弃用,推荐使用 percentage
percentage FractionalPercent 0% 精确的百分比控制,支持分子/分母结构
fixed_delay Duration 无 固定延迟时长,例如 3s、500ms
header_delay HeaderDelay 无 从请求头 x-envoy-fault-delay-request 读取延迟时长
延迟注入 YAML 示例(固定延迟 3 秒,命中率 20%):
delay:
  percentage:
    numerator: 20
    denominator: HUNDRED
  fixed_delay: 3s

3.4 中断注入(Abort)配置详解

中断注入模拟服务不可用、HTTP 错误或 gRPC 错误。Envoy 会在请求到达上游之前直接返回错误响应。

字段 类型 默认值 说明
percentage FractionalPercent 0% 中断注入的请求百分比
http_status uint32 503 HTTP 响应状态码(200-600)
grpc_status uint32 0 gRPC 状态码(仅 gRPC 请求生效)
header_abort HeaderAbort 无 从请求头 x-envoy-fault-abort-request 读取状态码
中断注入 YAML 示例(返回 503,命中率 10%):
abort:
  percentage:
    numerator: 10
    denominator: HUNDRED
  http_status: 503

3.5 延迟与中断注入的完整 YAML 结构对比

下表从配置维度对比两种注入模式的关键差异:

对比维度 延迟注入 中断注入
核心效果 请求被挂起指定时长后继续转发 直接返回错误响应,不转发到上游
对客户端感知 超时、重试、连接池耗尽 HTTP 错误码、gRPC 错误
对上游影响 连接数增加、请求堆积 无影响(请求未到达上游)
主要配置字段 fixed_delay / header_delay http_status / grpc_status
百分比控制 percentage 或 percent percentage
典型测试场景 超时重试、熔断、负载均衡 降级、容错、断路器

3.6 基于路由的故障注入

故障过滤器支持在 虚拟主机(VirtualHost) 或 路由(Route) 级别覆盖全局配置。这使得可以为不同服务或端点设置不同的故障注入策略。

routes:
- match:
    prefix: "/api/v1/orders"
  route:
    cluster: order_service
  typed_per_filter_config:
    envoy.filters.http.fault:
      "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
      delay:
        percentage:
          numerator: 100
          denominator: HUNDRED
        fixed_delay: 2s
      abort:
        percentage:
          numerator: 5
          denominator: HUNDRED
        http_status: 500
注意: 路由级别的故障注入会完全覆盖 HTTP 连接管理器级别的全局故障配置。如果需要在路由级别只覆盖部分字段,必须显式声明所有需要的字段。

3.7 基于请求头的动态故障注入

Envoy 支持通过请求头动态触发故障注入,无需修改静态配置。这对于自动化测试和临时调试非常有用。

请求头 作用 示例值
x-envoy-fault-delay-request 设置延迟时长(毫秒) 3000
x-envoy-fault-abort-request 设置中断状态码 503
x-envoy-fault-delay-request-percentage 覆盖延迟注入百分比 50
x-envoy-fault-abort-request-percentage 覆盖中断注入百分比 10
自动化测试技巧: 在回滚护栏测试中,可以通过设置 x-envoy-fault-abort-request: 503 请求头来精确控制故障注入的触发,从而验证护栏是否能在指定故障条件下正确触发回滚。

3.8 故障注入的匹配与优先级

Envoy 在处理故障注入时遵循以下优先级顺序:

  1. 请求头覆盖:如果请求头携带故障注入指令,优先使用请求头值。
  2. 路由级别配置:如果当前路由有 typed_per_filter_config,使用该配置。
  3. 虚拟主机级别配置:如果虚拟主机有覆盖配置,使用该配置。
  4. HTTP 连接管理器全局配置:使用过滤器链中的全局故障配置。

下图展示了故障注入的决策流程:

故障注入决策优先级流程 请求到达故障过滤器 检查请求头故障指令 命中? 注入故障 检查路由/虚拟主机/全局配置

3.9 故障注入的统计与监控

Envoy 为故障过滤器提供了一组内置统计指标,用于监控故障注入的效果:

统计名称 类型 说明
http.fault.delay.*.total Counter 延迟注入总次数
http.fault.abort.*.total Counter 中断注入总次数
http.fault.delay.*.duration_ms Histogram 延迟注入的时长分布
http.fault.active_faults Gauge 当前活跃的故障注入数量
自动化回滚护栏测试要点: 在测试验证中,应通过 Prometheus 或 StatsD 采集 http.fault.abort.*.total 和 http.fault.delay.*.total 指标,确认故障注入的实际命中率与配置一致,从而验证护栏的触发条件是否准确。

3.10 常见配置陷阱与最佳实践

  • 百分比精度问题:使用 percent 字段(0-100)时,Envoy 内部会转换为 FractionalPercent。推荐直接使用 percentage 结构以获得更精确的控制。
  • 延迟与中断同时配置:如果同时配置了延迟和中断,Envoy 会先执行延迟,延迟结束后再执行中断。这可能导致预期外的行为。
  • max_active_faults 限制:默认值为 100,超过限制的请求将不会触发故障注入。在压测场景中需要适当调大。
  • gRPC 状态码映射:对于 gRPC 请求,http_status 会被自动映射为 gRPC 状态码。如果需要精确控制,应同时设置 grpc_status。
  • 路由匹配优先级:故障注入的匹配遵循路由的精确匹配 > 前缀匹配 > 正则匹配的优先级规则。
生产环境警告: 故障注入应仅在测试环境或金丝雀发布中使用。在生产环境启用故障注入可能导致大规模服务中断。务必配合 filter_enabled 字段进行全局开关控制。