3. Envoy故障注入原理:HTTP故障过滤器配置详解
Envoy 的 HTTP 故障过滤器(Fault Filter) 是服务网格混沌工程的核心工具。它允许在应用层(L7)对出站或入站流量注入延迟与中断,而无需修改业务代码。本章将深入剖析该过滤器的配置结构、YAML 字段语义以及延迟/中断注入的完整示例。
3.1 故障过滤器在 Envoy 架构中的位置
故障过滤器作为 HTTP 连接管理器(HttpConnectionManager)下的一个 HTTP 过滤器 运行。其处理阶段位于路由决策之后、上游集群转发之前。下图展示了过滤器在请求处理流水线中的位置:
关键理解: 故障过滤器在路由匹配之后生效,因此可以针对特定路由、集群或请求头进行条件注入。它不会影响控制面通信,只作用于数据面请求。
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 在处理故障注入时遵循以下优先级顺序:
- 请求头覆盖:如果请求头携带故障注入指令,优先使用请求头值。
- 路由级别配置:如果当前路由有
typed_per_filter_config,使用该配置。 - 虚拟主机级别配置:如果虚拟主机有覆盖配置,使用该配置。
- 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 字段进行全局开关控制。