2. Envoy 故障模式分类

在生产环境中,Envoy 作为数据平面的核心组件,其故障模式直接影响服务可用性。本章将 Envoy 的常见故障归纳为六大类,每类故障的触发条件、表现特征和排查路径均有显著差异。理解这些分类是构建回滚护栏和自动化故障响应策略的基础。

核心原则:故障分类不是理论练习,而是为了在故障发生时快速定位根因、判断回滚优先级、选择正确的恢复手段。以下分类基于实际生产事故复盘,覆盖了 Envoy 部署中最常出现的故障场景。

2.1 故障模式总览

下表列出了六大故障模式的关键属性对比,包括典型触发条件、影响范围、可观测性信号和回滚优先级。回滚优先级分为 P0(立即回滚)、P1(尽快回滚)、P2(观察后回滚)三个等级。

故障模式 典型触发条件 影响范围 关键可观测信号 回滚优先级
配置错误 语法错误、逻辑冲突、字段缺失 局部或全局 NACK、配置拒绝、路由失效 P0
上游集群故障 后端实例宕机、健康检查失败、熔断触发 局部(特定集群) 503/504 比例上升、主动健康检查失败 P1
资源耗尽 内存泄漏、连接数超限、文件描述符耗尽 全局(节点级别) OOM、连接拒绝、CPU 高负载 P0
网络分区 网络抖动、防火墙规则变更、链路中断 局部或全局 连接超时、端点发现失败、xDS 断连 P1
证书过期 TLS 证书未续期、OCSP 响应失败 局部(特定监听器) TLS 握手失败、证书到期告警 P0
热重启失败 共享内存损坏、进程迁移异常、版本不兼容 全局(节点级别) 重启超时、旧进程未退出、新进程未就绪 P0
实战建议:在制定回滚策略时,P0 故障应触发自动回滚,无需人工确认;P1 故障建议设置观察窗口(如 30 秒内持续异常)再触发回滚;P2 故障可先告警,由 SRE 判断是否回滚。

2.2 配置错误

配置错误是 Envoy 故障中最常见、也最容易被忽视的一类。Envoy 采用 xDS 协议动态下发配置,配置变更的复杂度远高于静态配置文件。配置错误通常分为以下子类:

  • 语法错误:JSON/YAML 格式错误、字段类型不匹配、枚举值无效。Envoy 在配置加载阶段会进行严格校验,语法错误会导致 NACK(拒绝确认)。
  • 逻辑冲突:路由规则重叠导致流量黑洞、权重分配总和不为 100、虚拟主机重复定义。这类错误在语法校验阶段无法发现,只有在流量经过时才会暴露。
  • 字段缺失或默认值陷阱:Envoy 的某些字段有默认值,但默认值可能不符合预期。例如 idle_timeout 默认值为 0(表示无限超时),可能导致连接泄漏。
  • 版本兼容性:新版本 Envoy 废弃了某些字段或改变了行为,旧配置在新版本上可能被拒绝或产生非预期行为。
# 配置错误示例:路由权重总和不为 100
routes:
  - match: { prefix: "/api/v1" }
    route: { cluster: "v1_cluster", weight: 60 }
  - match: { prefix: "/api/v1" }
    route: { cluster: "v2_cluster", weight: 30 }  # 错误:权重总和为 90,Envoy 会拒绝此配置
关键信号:配置错误最直接的信号是 Envoy 管理接口的 /config_dump 返回 NACK 状态,以及日志中的 Rejected configuration 或 config validation failed 条目。在回滚护栏设计中,NACK 事件应作为最高优先级的回滚触发条件。

2.3 上游集群故障

上游集群故障是指 Envoy 后端的服务实例出现异常,导致 Envoy 无法正常转发流量。这类故障通常不是 Envoy 自身的问题,但 Envoy 的熔断、重试、健康检查机制会直接影响故障的传播范围。

  • 实例宕机:后端 Pod/VM 崩溃或停止服务,Envoy 通过主动健康检查(Active Health Check)发现并标记为不健康。
  • 熔断触发:当集群的错误率或延迟超过阈值时,Envoy 的熔断器会断开连接,拒绝新请求。熔断触发后,即使后端恢复,也需要等待重置时间。
  • 端点发现延迟:通过 EDS(端点发现服务)获取的后端列表更新不及时,导致 Envoy 继续向已下线的实例发送流量。
  • 异常端点风暴:短时间内大量端点被标记为不健康,导致集群可用容量骤降,引发级联故障。
# 熔断配置示例(Envoy 集群配置片段)
circuit_breakers:
  thresholds:
    - priority: DEFAULT
      max_connections: 1000
      max_pending_requests: 100
      max_requests: 2000
      max_retries: 10
排查路径:当出现大量 503/504 时,首先检查 /clusters 管理端点,查看集群的健康状态和熔断计数器。如果 upstream_rq_pending_overflow 或 upstream_rq_retry_overflow 持续增长,说明熔断器已触发。

2.4 资源耗尽

资源耗尽故障是 Envoy 节点级别的灾难性故障,通常由内存泄漏、连接泄漏或文件描述符耗尽引起。这类故障的恢复时间往往较长,且容易导致整个节点上的所有代理实例同时失效。

资源类型 耗尽表现 常见根因 监控指标
内存 OOM Kill、GC 频繁、响应延迟飙升 连接泄漏、大请求体缓存、统计指标爆炸 envoy_server_memory_heap_size、envoy_server_memory_allocated
连接数 新连接被拒绝、连接超时 客户端连接未关闭、上游连接池泄漏 envoy_tcp_downstream_cx_total、envoy_tcp_upstream_cx_total
文件描述符 无法建立新连接、日志写入失败 连接数超限、日志文件句柄未释放 系统级 /proc/<pid>/fd 计数
线程/协程 请求处理停滞、worker 线程阻塞 死锁、阻塞式调用、worker 数量配置不当 envoy_server_worker_threads、线程状态 dump
回滚策略:资源耗尽故障通常无法通过配置回滚解决,因为问题出在 Envoy 进程本身。此时应优先执行进程级回滚(重启旧版本二进制),而非配置回滚。在回滚护栏中,资源耗尽应触发 P0 级自动重启或流量摘除。

2.5 网络分区

网络分区故障是指 Envoy 与控制平面(xDS 服务器)或上游集群之间的网络连通性中断。这类故障在微服务架构中尤为常见,因为网络拓扑复杂、依赖链路长。

  • xDS 断连:Envoy 无法从控制平面获取配置更新,导致配置冻结在最后成功接收的状态。如果断连期间需要配置变更,Envoy 将无法响应。
  • 上游网络不可达:Envoy 与后端集群之间的网络链路中断,导致所有请求失败。此时即使后端实例健康,Envoy 也无法转发流量。
  • DNS 解析失败:Envoy 使用 STRICT_DNS 或 LOGICAL_DNS 集群类型时,DNS 解析失败会导致端点列表为空。
  • 双向 TLS 协商失败:网络可达但证书验证失败,属于网络分区的一种特殊形式。
# 网络分区时的典型日志模式
[2025-01-15 10:23:45.678][7][warning][upstream] [source/common/upstream/cluster_manager_impl.cc:123]
  "cluster 'backend-cluster' has 0 healthy endpoints out of 5 in zone 'us-east-1a'"
[2025-01-15 10:23:45.679][7][warning][config] [source/common/config/grpc_subscription_impl.cc:456]
  "gRPC config stream to xds-server:18000 disconnected: network error"
可观测性信号:网络分区时,Envoy 的 /clusters 端点会显示大量端点为 unhealthy 状态,且 membership_changed 计数器停止更新。同时,xDS 相关的 config_update_failure 指标会持续增长。

2.6 证书过期

证书过期是 TLS 通信中最常见的故障之一。Envoy 作为边缘代理或服务网格的数据平面,通常需要管理大量 TLS 证书。证书过期会导致 TLS 握手失败,客户端无法建立安全连接。

  • 服务器证书过期:Envoy 作为服务端时,向客户端提供的证书已过期,客户端拒绝连接。
  • 客户端证书过期:Envoy 作为客户端(向上游发起 TLS 连接)时,使用的客户端证书已过期,上游拒绝连接。
  • CA 证书过期:用于验证对端证书的 CA 证书过期,导致所有证书验证失败。
  • OCSP 响应失败:证书本身未过期,但在线证书状态协议(OCSP)响应失败,导致证书被吊销或无法验证。
# 证书过期时的 TLS 握手错误日志
[2025-01-15 11:00:00.123][12][error][connection] [source/extensions/transport_sockets/tls/ssl_socket.cc:234]
  "TLS error: 337047686:SSL routines:tls_process_server_certificate:certificate verify failed"
回滚护栏设计:证书过期故障的回滚策略是回滚到上一版本的证书配置。在回滚护栏中,应监控 ssl.certificate_expiry_seconds 指标,当证书剩余有效期低于阈值(如 7 天)时触发告警,低于 24 小时时自动回滚到备用证书。

2.7 热重启失败

热重启是 Envoy 实现无中断升级的核心机制。热重启失败会导致新旧进程同时运行、流量中断或配置丢失。这类故障在版本升级和配置变更时尤为危险。

  • 共享内存损坏:热重启依赖共享内存传递监听器套接字和连接状态。如果共享内存被损坏或版本不兼容,新进程无法接管旧进程的监听器。
  • 旧进程未退出:热重启后,旧进程应在一段时间后自动退出。如果旧进程挂起或未收到退出信号,会导致端口冲突和资源泄漏。
  • 新进程未就绪:新进程启动后,需要完成配置加载和监听器初始化。如果初始化失败,新进程无法提供服务,而旧进程已经停止。
  • 版本不兼容:新旧版本的 Envoy 二进制对共享内存结构的定义不一致,导致热重启失败。
# 热重启失败日志示例
[2025-01-15 12:00:00.000][1][critical][main] [source/server/hot_restart_impl.cc:456]
  "hot restart parent process did not exit within 10 seconds, forcing shutdown"
[2025-01-15 12:00:00.001][1][critical][main] [source/server/listener_manager_impl.cc:789]
  "failed to bind to 0.0.0.0:8080: address already in use"
最佳实践:在回滚护栏中,热重启失败应触发立即回滚到旧版本二进制。建议在升级前保留旧版本的二进制文件和共享内存文件,以便快速回滚。同时,设置热重启超时监控,超过 30 秒未完成则视为失败。

2.8 故障模式关系图

下图展示了六大故障模式之间的关联关系。配置错误和证书过期属于配置层面的故障,上游集群故障和网络分区属于网络层面的故障,资源耗尽和热重启失败属于进程层面的故障。不同层面的故障可能相互触发,形成级联效应。

Envoy 故障模式分类与关联关系 配置层面 配置错误 语法错误 / 逻辑冲突 / 版本兼容 证书过期 服务器/客户端/CA 证书过期 网络层面 上游集群故障 实例宕机 / 熔断 / 端点发现延迟 网络分区 xDS 断连 / DNS 失败 / 链路中断 进程层面 资源耗尽 内存 / 连接 / 文件描述符耗尽 热重启失败 共享内存损坏 / 进程未退出 错误路由导致流量黑洞 连接池配置不当导致泄漏 TLS 握手失败 重试风暴导致连接数暴涨 端点发现失败 说明: 箭头表示故障传播方向。配置错误和证书过期可能触发网络层面和进程层面的故障,形成级联效应。 回滚护栏应优先阻断配置层面的故障传播,避免级联故障发生。

2.9 故障模式与回滚策略映射

基于上述故障分类,下表总结了每种故障模式对应的回滚策略和关键决策点。回滚护栏需要根据故障类型选择不同的回滚手段:配置回滚、二进制回滚、流量回滚或证书回滚。

故障模式 回滚手段 回滚对象 关键决策点 恢复时间目标
配置错误 配置回滚 xDS 配置版本 NACK 事件触发自动回滚 < 30 秒
上游集群故障 流量回滚 路由权重 / 集群选择 错误率超过阈值持续 30 秒 < 60 秒
资源耗尽 二进制回滚 Envoy 进程版本 OOM 或连接数超限 < 120 秒
网络分区 流量回滚 端点选择 / 集群优先级 健康端点比例低于 50% < 60 秒
证书过期 证书回滚 证书文件 / SDS 配置 证书剩余有效期低于 24 小时 < 30 秒
热重启失败 二进制回滚 Envoy 二进制版本 热重启超时超过 30 秒 < 120 秒
关键总结:Envoy 的六大故障模式并非孤立存在,它们之间存在明确的传播路径。配置错误和证书过期是配置层面的故障,最容易通过回滚护栏阻断;资源耗尽和热重启失败是进程层面的故障,恢复成本最高,应优先预防。在构建回滚护栏时,需要为每种故障模式定义独立的检测指标、触发阈值和回滚动作,同时建立跨故障模式的级联阻断机制。