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 扩缩容时)
关键认知: xDS 采用“最终一致性”模型。Envoy 在收到新配置后,不会立即销毁旧连接,而是通过“优雅关闭”机制(drain)确保正在处理的请求完成后再切换。这一特性是回滚护栏能够安全生效的基础。

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 推送配置的完整链路,以及各发现服务之间的依赖关系。

xDS 配置推送流程 xDS 配置推送流程与依赖关系 控制面(Pilot) 数据面 Envoy LDS RDS CDS EDS 依赖关系:LDS → RDS → CDS → EDS,上层配置变更会触发下层重新推送

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
回滚护栏实践要点: 在回滚场景中,建议保留最近 N 个版本的 xDS 配置快照(包括 LDS/RDS/CDS/EDS)。当检测到错误率上升或健康检查失败时,控制面应优先尝试回退到上一个稳定版本的配置,而非全量重建。Delta xDS 模式下,回滚需要按逆序应用增量变更,确保一致性。

3.6 xDS 与回滚护栏的关联

Envoy 的 xDS 机制为回滚护栏提供了天然的技术支撑:

  • 版本化配置: 每个 xDS 响应都携带版本号,Envoy 在 ACK/NACK 中回传当前版本,控制面可据此判断配置是否生效。
  • 优雅切换: Envoy 不会立即销毁旧配置,而是等待活跃请求完成(drain 阶段),回滚时只需重新推送旧版本配置即可。
  • 健康检查联动: 结合 EDS 的健康状态,回滚时可以优先将流量切回健康的旧端点,避免回滚过程中引入新的故障。

下图展示了回滚场景下 xDS 版本切换的时序:

xDS 回滚版本切换时序 回滚场景 xDS 版本切换时序 v1 v2 v3 v1 稳定 升级 故障 回滚 回滚触发 回滚流程说明 1. v2 升级后,Envoy 通过 NACK 或健康检查报告错误 2. 控制面检测到故障,触发回滚策略 3. 控制面重新推送 v1 版本的完整 xDS 配置(SotW)或逆序增量(Delta)

3.7 生产环境最佳实践

  • 启用 ACK/NACK 监控: 监控 Envoy 对 xDS 响应的 ACK(接受)和 NACK(拒绝)比率,NACK 激增是配置错误的早期信号。
  • 配置版本持久化: 将每次推送的 xDS 配置版本号持久化到外部存储(如 etcd),便于回滚时快速定位目标版本。
  • 渐进式推送: 先向少量 Envoy 实例推送新配置,观察稳定后再全量推送,降低回滚影响面。
  • 结合 EDS 健康状态: 回滚时优先选择健康端点比例最高的集群版本,避免回滚到端点大面积不健康的旧版本。
核心总结: LDS/RDS/CDS/EDS 构成了 Envoy 动态配置的四大支柱。xDS 协议通过版本化、增量更新和优雅切换机制,为 Service Mesh 回滚护栏提供了细粒度的控制能力。理解每个发现服务的职责和依赖关系,是设计可靠回滚策略的第一步。