3. Envoy 代理核心原理:LDS / RDS / CDS / EDS 发现服务与 xDS 协议详解
Envoy 是 Service Mesh 数据面的核心代理,其配置管理完全基于一套动态发现协议——xDS。xDS 并非单一协议,而是一组发现服务(Discovery Service)的统称,包括 LDS、RDS、CDS、EDS 等。理解这些发现服务的职责与交互流程,是掌握 Envoy 配置热更新、实现回滚护栏的前提。
3.1 xDS 协议概述
xDS 协议采用 gRPC 流式通信或 REST-JSON 轮询,由控制面(如 Istio Pilot)向数据面 Envoy 推送配置。每个 Envoy 实例通过 xDS 获取监听器、路由、集群、端点等配置,实现无需重启的热加载。
| 发现服务 | 全称 | 配置对象 | 典型更新频率 |
|---|---|---|---|
| LDS | Listener Discovery Service | 监听器(Listener) | 低(端口/协议变更时) |
| RDS | Route Discovery Service | 路由规则(Route) | 中(流量策略调整时) |
| CDS | Cluster Discovery Service | 集群(Cluster) | 低(服务发现范围变化时) |
| EDS | Endpoint Discovery Service | 端点(Endpoint) | 高(Pod 扩缩容时) |
3.2 四大发现服务详解
3.2.1 LDS — 监听器发现服务
LDS 负责告诉 Envoy 在哪些 IP:Port 上监听入站流量,以及如何处理这些流量(如 TLS 终止、代理协议解析)。每个监听器可以绑定一个或多个过滤器链(Filter Chain),流量根据 SNI 或端口匹配进入不同链。
- 典型场景: 新增 HTTP 端口、启用/禁用 TLS、调整监听器级别超时。
- 回滚关注点: 监听器配置错误会导致端口无法绑定,Envoy 会保留旧监听器直到新配置验证通过。
3.2.2 RDS — 路由发现服务
RDS 定义监听器接收到的请求如何路由到上游集群。路由规则包括域名匹配、路径前缀、请求头改写、流量拆分、故障注入等。
- 典型场景: 灰度发布时调整权重、A/B 测试路由、超时/重试策略修改。
- 回滚关注点: 路由规则错误可能导致流量误匹配或 404,RDS 版本号可用于快速回退。
3.2.3 CDS — 集群发现服务
CDS 定义 Envoy 连接的上游服务集群。每个集群包含连接池大小、健康检查策略、负载均衡算法(轮询、最少请求、一致性哈希等)、断路器阈值等。
- 典型场景: 新增/下线服务、调整负载均衡策略、修改健康检查间隔。
- 回滚关注点: 集群配置错误(如断路器阈值过小)可能导致大量请求被拒绝,需保留历史集群配置快照。
3.2.4 EDS — 端点发现服务
EDS 提供集群中可用的后端实例列表(IP:Port + 元数据)。它是 xDS 中更新最频繁的服务,直接反映 Pod 的扩缩容状态。
- 典型场景: 滚动更新时端点动态加入/移除、根据地域或版本标签进行优先级路由。
- 回滚关注点: EDS 推送延迟或错误端点会导致流量丢失,需配合健康检查实现“端点级回滚”。
3.3 xDS 配置推送流程
下图展示了控制面通过 xDS 协议向 Envoy 推送配置的完整链路,以及各发现服务之间的依赖关系。
3.4 xDS 协议版本与增量更新
Envoy 支持两种 xDS 更新模式:
- SotW(State of the World): 全量推送,每次更新都发送完整配置。简单但带宽开销大,适合配置变化不频繁的场景。
- Delta xDS: 增量推送,只发送变更部分。大幅减少网络传输和 Envoy 解析开销,是生产环境推荐模式。
| 特性 | SotW 全量推送 | Delta 增量推送 |
|---|---|---|
| 推送内容 | 完整配置 | 仅变更资源 |
| 网络开销 | 高(随资源数线性增长) | 低(仅传输 diff) |
| Envoy 处理开销 | 高(全量解析) | 低(局部更新) |
| 回滚复杂度 | 低(直接替换全量) | 中(需维护增量序列) |
| 推荐场景 | 小规模集群、配置稳定 | 大规模集群、频繁变更 |
3.5 xDS 配置示例(LDS + RDS)
以下是一个简化的 LDS 和 RDS 配置片段,展示 Envoy 如何通过 xDS 接收动态配置:
# LDS 配置:监听 8080 端口,绑定 HTTP 连接管理器
listeners:
- name: listener_8080
address:
socket_address:
address: 0.0.0.0
port_value: 8080
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config_name: route_config_8080 # 引用 RDS 路由名称
http_filters:
- name: envoy.filters.http.router
# RDS 配置:路由规则,将请求转发到 backend 集群
route_configs:
- name: route_config_8080
virtual_hosts:
- name: backend_service
domains: ["*"]
routes:
- match:
prefix: "/api"
route:
cluster: backend_cluster
timeout: 5s
3.6 xDS 与回滚护栏的关联
Envoy 的 xDS 机制为回滚护栏提供了天然的技术支撑:
- 版本化配置: 每个 xDS 响应都携带版本号,Envoy 在 ACK/NACK 中回传当前版本,控制面可据此判断配置是否生效。
- 优雅切换: Envoy 不会立即销毁旧配置,而是等待活跃请求完成(drain 阶段),回滚时只需重新推送旧版本配置即可。
- 健康检查联动: 结合 EDS 的健康状态,回滚时可以优先将流量切回健康的旧端点,避免回滚过程中引入新的故障。
下图展示了回滚场景下 xDS 版本切换的时序:
3.7 生产环境最佳实践
- 启用 ACK/NACK 监控: 监控 Envoy 对 xDS 响应的 ACK(接受)和 NACK(拒绝)比率,NACK 激增是配置错误的早期信号。
- 配置版本持久化: 将每次推送的 xDS 配置版本号持久化到外部存储(如 etcd),便于回滚时快速定位目标版本。
- 渐进式推送: 先向少量 Envoy 实例推送新配置,观察稳定后再全量推送,降低回滚影响面。
- 结合 EDS 健康状态: 回滚时优先选择健康端点比例最高的集群版本,避免回滚到端点大面积不健康的旧版本。