2. Envoy 架构基础:核心组件、线程模型与配置热加载
Envoy 是 Istio 服务网格的数据面核心,其架构设计围绕高性能、可扩展和动态配置展开。理解 Envoy 的四大核心组件(Listener、Cluster、Endpoint、Filter)、线程模型以及配置热加载机制,是进行故障注入与隔离验证的理论基础。
2.1 核心组件与数据流
Envoy 采用四层(L4)与七层(L7)代理混合架构,其核心组件构成了一条完整的请求处理流水线。下图展示了请求从进入 Envoy 到被转发至上游服务的完整路径。
2.1.1 组件职责对比
| 组件 | 职责 | 关键属性 | 故障域隔离中的作用 |
|---|---|---|---|
| Listener | 监听端口,接收入站连接 | 地址、端口、协议、TLS 配置 | 定义故障注入的入口边界 |
| Filter | 处理请求/响应的可插拔逻辑链 | 类型(L3/L4/L7)、阶段、配置 | 故障注入 Filter 在此处生效 |
| Cluster | 定义上游服务集群及其负载均衡策略 | 发现类型、端点、健康检查、熔断 | 隔离故障集群,切换流量 |
| Endpoint | 上游服务的具体实例(IP:Port) | 地址、权重、健康状态、元数据 | 细粒度故障实例摘除 |
2.2 线程模型:主线程 + Worker 线程
Envoy 采用 单进程多线程 架构,核心设计原则是 无共享(shared-nothing)。主线程负责配置管理和协调,Worker 线程负责实际的 I/O 和请求处理。
实践要点:在故障注入演练中,Worker 线程的独立性意味着故障注入 Filter 只影响当前 Worker 处理的连接。如果需要对整个 Envoy 实例施加影响,必须确保故障注入配置在所有 Worker 上生效(通过全局配置或 xDS 广播)。
2.3 配置热加载与 xDS 协议
Envoy 支持两种配置更新方式:热重启(Hot Restart) 和 动态 xDS(Discovery Service)。在 Istio 环境中,xDS 是主要方式。
2.3.1 配置更新方式对比
| 特性 | 热重启 | 动态 xDS |
|---|---|---|
| 更新粒度 | 全量配置 | 按资源类型(LDS/RDS/CDS/EDS) |
| 连接中断 | 短暂中断(毫秒级) | 零中断(连接迁移) |
| 适用场景 | 初始部署、版本升级 | 运行时流量管理、故障注入 |
| 配置来源 | 本地文件 | 控制面(Pilot/istiod) |
| 故障注入支持 | 需重启进程 | 实时生效,无需重启 |
2.3.2 xDS 资源类型与故障注入关系
- LDS (Listener Discovery Service):动态下发 Listener 配置,包括 Filter 链。故障注入 Filter 的插入和移除通过 LDS 实时更新。
- RDS (Route Discovery Service):动态下发路由规则。故障注入的百分比、延迟时长、错误码等参数在 VirtualHost 或 Route 级别配置。
- CDS (Cluster Discovery Service):动态下发 Cluster 配置。用于故障域隔离时切换上游集群。
- EDS (Endpoint Discovery Service):动态下发 Endpoint 列表。用于摘除故障实例或调整权重。
故障注入配置示例(通过 RDS 注入延迟):
{
"name": "envoy.filters.http.fault",
"typed_config": {
"@type": "type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault",
"delay": {
"fixed_delay": "5s",
"percentage": {
"numerator": 50,
"denominator": "HUNDRED"
}
}
}
}
该配置通过 RDS 动态下发后,Envoy 的 Worker 线程会在下一个请求处理周期内立即生效,无需重启。
2.4 架构总结与演练映射
Envoy 的组件化设计使得故障注入和隔离验证可以精确控制在以下维度:
- 入口维度:通过 Listener 和 Filter 链,在请求进入时注入故障。
- 路由维度:通过 RDS 动态调整路由规则,将流量导向故障集群或正常集群。
- 上游维度:通过 CDS/EDS 动态摘除故障 Endpoint,实现实例级隔离。
- 线程维度:Worker 线程的独立性保证了故障注入不会影响其他 Worker 的正常连接。
注意:在配置热加载过程中,如果故障注入配置错误(如百分比超过 100 或延迟时间过长),可能导致 Envoy 配置拒绝或 Worker 线程阻塞。建议在演练前使用
envoy --mode validate 验证配置合法性。