1. 故障域隔离概述
1.1 什么是故障域
故障域(Failure Domain)是指在分布式系统中,当一个组件发生故障时,受其影响的范围边界。在云原生架构中,故障域定义了“一个故障点最多能影响多少服务”的物理或逻辑边界。常见的故障域包括:
- 物理故障域:单台机器、单个机架、单个可用区(AZ)、单个地域(Region)。
- 逻辑故障域:单个进程、单个线程池、单个连接池、单个租户的数据平面。
- 网络故障域:单个 TCP 连接、单个 HTTP/2 流(Stream)、单个虚拟网络接口。
故障域隔离的核心思想是:将一个系统划分为多个互不依赖的独立单元,使得一个单元内的故障不会级联扩散到其他单元。在多租户场景下,每个租户的流量、连接、资源都应被限制在各自的故障域内。
关键概念:故障域 ≠ 可用区。可用区是云厂商提供的物理隔离边界,而故障域是架构设计时人为划定的逻辑隔离边界。Envoy 可以在两者之间建立精细的流控策略。
1.2 为什么需要故障域隔离
在微服务架构中,尤其是多租户环境下,缺乏故障域隔离会引发以下典型问题:
| 问题场景 | 表现 | 后果 |
|---|---|---|
| 租户间资源争抢 | 一个租户的突发流量耗尽连接池 | 其他租户请求被拒绝或超时 |
| HTTP/2 队头阻塞 | 慢请求阻塞同一连接上的其他流 | 所有租户的延迟集体升高 |
| 级联故障 | 上游服务雪崩,下游重试风暴 | 整个集群不可用 |
| 安全边界模糊 | 恶意租户利用共享连接攻击 | 数据泄露或服务被滥用 |
故障域隔离带来的核心收益包括:
- 爆炸半径控制:将故障影响限制在最小单元内,避免“一个坏邻居拖垮所有人”。
- 资源公平性:通过流控和配额机制,确保每个租户获得预期的服务质量(SLO)。
- 可观测性边界:每个故障域可以独立采集指标、日志和追踪,便于快速定位问题。
- 渐进式发布:可以在单个故障域内灰度新版本,降低全量发布风险。
实践建议:在 Kubernetes 环境中,建议将每个租户的 Pod 调度到不同的故障域(如不同节点、不同可用区),并结合 Envoy 的 locality-aware 路由实现物理隔离。
1.3 Envoy 在故障隔离中的角色
Envoy 作为云原生时代的通用数据平面,在故障域隔离中扮演着边界网关和流控执行器的双重角色。它位于服务网格的数据平面,所有南北向和东西向流量都经过 Envoy,因此天然适合实施故障隔离策略。
Envoy 提供的故障隔离能力包括以下维度:
| 隔离维度 | Envoy 机制 | 适用场景 |
|---|---|---|
| 连接级隔离 | HTTP/2 连接池管理、每个上游集群独立连接池 | 防止一个租户的连接耗尽全局连接池 |
| 流级隔离 | HTTP/2 流控(Stream Flow Control)、优先级调度 | 避免慢请求阻塞其他流的处理 |
| 路由级隔离 | 虚拟主机(Virtual Host)、路由匹配、权重分发 | 按租户、版本、环境分流到不同集群 |
| 熔断级隔离 | 熔断器(Circuit Breaker)、异常检测(Outlier Detection) | 自动隔离故障上游实例 |
| 配额级隔离 | 全局速率限制(Rate Limit)、本地速率限制 | 限制每个租户的请求速率 |
下图展示了 Envoy 在多租户场景下的故障域隔离架构:
Envoy 的故障隔离能力通过 xDS 控制平面动态下发配置,无需重启进程。这使得运维人员可以在运行时调整隔离策略,适应不断变化的流量模式。
注意:Envoy 的故障域隔离并非“开箱即用”。需要结合控制平面(如 Istio)的配置管理,以及合理的资源配额规划,才能达到预期的隔离效果。错误的配置(如过大的连接池上限)反而可能放大故障域。
1.4 故障域隔离的层次模型
在实际部署中,故障域隔离通常分为三个层次,Envoy 在每个层次都有对应的实现:
| 层次 | 隔离粒度 | Envoy 实现 | 典型配置 |
|---|---|---|---|
| L1:物理层 | 节点 / 可用区 / 地域 | Locality-weighted LB、区域感知路由 | locality_lb_endpoint_weight |
| L2:连接层 | TCP 连接 / HTTP/2 连接 | 连接池管理、最大连接数限制 | max_connections、max_pending_requests |
| L3:应用层 | HTTP 流 / 请求 / 租户 | 流控、速率限制、熔断、RBAC | http_filters、rate_limit、circuit_breakers |
这三个层次相互配合,形成纵深防御体系。物理层确保基础设施级隔离,连接层防止资源耗尽,应用层实现精细化的业务隔离。Envoy 的独特优势在于:它在一个进程中同时实现了这三个层次的隔离策略,避免了多代理串联带来的性能损耗。