3. Envoy xDS 协议基础:CDS、EDS、LDS、RDS、SDS 的作用与更新流程
xDS 是 Envoy 动态配置获取协议的总称,其中的 “x” 代表多种资源类型。在 Istio 架构中,Pilot(作为 xDS 服务端)通过 gRPC 流式推送配置变更给所有 Envoy 代理。理解 xDS 的每种资源类型及其更新流程,是定位配置下发延迟的基石。
3.1 五大核心 xDS 资源概览
Envoy 的配置模型被拆分为五种独立的资源类型,各自负责不同的配置维度。下表总结了它们的全称、职责与更新触发条件:
| 资源类型 | 全称 | 核心职责 | 典型更新触发 |
|---|---|---|---|
| CDS | Cluster Discovery Service | 定义上游集群(Cluster),包括连接池、负载均衡策略、健康检查、TLS 上下文等 | DestinationRule 变更、ServiceEntry 新增/删除 |
| EDS | Endpoint Discovery Service | 提供集群中可用的端点(Endpoint/IP:Port)列表及状态 | Pod 扩缩容、端点健康状态变化 |
| LDS | Listener Discovery Service | 定义 Envoy 监听的端口、协议、过滤器链(Filter Chain) | Gateway/VirtualService 变更、Sidecar 注入配置变化 |
| RDS | Route Discovery Service | 定义虚拟主机(VirtualHost)的路由规则,包括匹配条件、目标集群、重定向/重写 | VirtualService 路由规则变更 |
| SDS | Secret Discovery Service | 分发 TLS 证书、私钥和验证上下文 | 证书轮换、mTLS 策略变更 |
关键认知: 在 Istio 中,LDS 和 RDS 通常成对出现。LDS 负责“在哪里监听”,RDS 负责“流量进来后怎么转发”。CDS 和 EDS 则构成另一对:CDS 定义“集群长什么样”,EDS 提供“集群里有哪些实例”。
3.2 xDS 资源依赖关系与更新顺序
Envoy 在启动和运行时,会按照严格的依赖顺序请求 xDS 资源。错误的更新顺序可能导致流量中断或配置不生效。下图展示了五种资源之间的依赖链:
更新顺序规则:
- LDS 必须最先下发:Envoy 需要先知道监听哪个端口、挂载哪些过滤器链,才能处理后续的路由和集群配置。
- RDS 紧随 LDS:每个监听器可以引用一个 RDS 路由配置名称,Envoy 在收到 LDS 后会立即请求对应的 RDS。
- CDS 在路由之后:路由规则中指定的目标集群(cluster_name)必须在 CDS 中定义。
- EDS 最后填充:CDS 中定义的集群通过 EDS 获取实时端点列表。
- SDS 独立并行:SDS 不依赖其他资源,但 LDS 和 CDS 中的 TLS 配置会引用 SDS 资源名称。
3.3 增量 xDS 与全量 xDS 更新流程
Envoy 支持两种 xDS 更新模式:SotW(State of the World,全量) 和 Delta(增量)。Istio 1.8+ 默认使用增量 xDS 以减少带宽和计算开销。
| 特性 | SotW(全量) | Delta(增量) |
|---|---|---|
| 推送内容 | 每次推送该类型下所有资源 | 仅推送新增/修改/删除的资源 |
| Envoy 处理方式 | 完全替换本地缓存 | 合并增量变更到本地缓存 |
| 网络开销 | 高(尤其大规模集群) | 低 |
| CPU 开销(Pilot 端) | 每次全量序列化 | 仅计算 diff |
| 适用场景 | 初始连接、重连恢复 | 运行时持续更新 |
3.4 典型更新流程时序(以路由变更为例)
当用户修改 VirtualService 后,Istio 触发一次完整的配置下发。下图展示了从变更发生到 Envoy 应用新路由的时序:
3.5 延迟故障的关键检查点
基于 xDS 协议特性,在定位配置下发延迟时,应优先检查以下环节:
- Pilot 端计算延迟:Pilot 从 Watch 到生成 xDS 响应的时间。常见原因包括大规模集群的全量计算、资源 diff 算法效率低。
- gRPC 流推送延迟:Pilot 与 Envoy 之间的 gRPC 流是否因背压(Backpressure)或连接复用问题导致推送阻塞。
- Envoy 端处理延迟:Envoy 反序列化 xDS 资源、校验依赖关系、应用新配置的时间。大量 Listener/Cluster 会显著增加处理耗时。
- 依赖等待延迟:如果 LDS 引用了 RDS,但 RDS 尚未到达,Envoy 会保持旧路由直到 RDS 就绪。同理,CDS 未就绪时 EDS 更新会被暂存。
- 增量 vs 全量切换:Envoy 重连后强制使用全量同步,此时推送数据量剧增,容易引发瞬时延迟。
常见误区: 不要认为“只改了一个路由规则,就只推送 RDS”。实际上,如果路由规则引用了新的集群,Pilot 会同时推送 CDS 和 EDS。Envoy 必须等待所有依赖资源就绪后才会应用新配置。这种“级联等待”是配置下发延迟的常见根因。