3. Envoy xDS 协议:控制面与数据面交互、CDS/EDS/LDS/RDS/SDS 协议详解

xDS(Discovery Service)是 Envoy 与控制面(Control Plane)之间通信的核心协议族。它实现了数据面(Data Plane)的动态配置下发,使得 Envoy 可以在不重启进程的情况下,实时更新监听器、路由、集群和端点等关键配置。本章将深入解析 xDS 的交互模型及五大核心发现服务。

3.1 控制面与数据面交互模型

Envoy 采用“拉取(Pull)”与“推送(Push)”相结合的异步交互模式。控制面作为 gRPC 服务端,Envoy 作为客户端发起流式订阅请求。Envoy 通过 type_url 标识所需资源类型,控制面根据订阅返回对应的 DiscoveryResponse。

核心交互流程:
  1. Envoy 启动:向控制面发起 xDS 流式 gRPC 连接。
  2. 订阅请求:Envoy 发送 DiscoveryRequest,包含节点标识、资源类型、资源名称列表及版本信息。
  3. 控制面响应:返回 DiscoveryResponse,包含资源对象(如 Listener、Cluster 等)及新版本号。
  4. ACK/NACK:Envoy 应用配置后,发送 ACK(确认)或 NACK(拒绝,携带错误信息)更新版本状态。
  5. 增量更新:支持 ADS(Aggregated Discovery Service)聚合所有资源类型在单一 gRPC 流中传输,减少连接数。
Envoy xDS 控制面与数据面交互流程 控制面 (xDS Server) Envoy (xDS Client) DiscoveryRequest (订阅) DiscoveryResponse (配置下发) ACK / NACK (版本确认) 关键特性: • 支持全量(SotW)与增量(Delta)两种订阅模式。 • ADS 聚合所有 xDS 类型在单一 gRPC 流中,保证配置一致性。 • NACK 机制防止错误配置扩散,Envoy 保留最后有效配置继续运行。

3.2 五大核心发现服务详解

xDS 协议族包含多个子协议,每个协议负责管理 Envoy 配置的特定维度。下表列出了最核心的五种发现服务及其职责:

协议缩写 全称 管理资源 核心作用
CDS Cluster Discovery Service Cluster(集群) 定义上游服务集群的连接池、负载均衡策略、健康检查、TLS 上下文等。
EDS Endpoint Discovery Service ClusterLoadAssignment(端点) 动态管理集群中的具体端点(IP:Port),支持权重、优先级、区域感知路由。
LDS Listener Discovery Service Listener(监听器) 定义 Envoy 监听的端口、协议(HTTP/TCP)、过滤器链及网络配置。
RDS Route Discovery Service RouteConfiguration(路由) 定义虚拟主机、路由规则、匹配条件(Header/Path/Query)、集群转发目标。
SDS Secret Discovery Service Secret(证书/密钥) 动态下发 TLS 证书、私钥、验证 CA,实现证书轮换无需重启。

3.3 CDS 与 EDS:集群与端点管理

CDS 负责定义集群的“行为”属性,而 EDS 负责定义集群的“成员”属性。两者通常配合使用,实现精细化的流量管理。

安全实践提示: 在 CDS 中启用 transport_socket 配置上游 TLS,并在 SDS 中动态下发信任 CA,可确保 Envoy 到上游的通信加密。同时,EDS 支持通过 health_status 标记端点,避免将流量路由到不健康的实例。
# CDS 配置示例(YAML 片段)
clusters:
- name: service_backend
  type: EDS  # 使用 EDS 动态发现端点
  eds_cluster_config:
    eds_config:
      resource_api_version: V3
      api_config_source:
        api_type: GRPC
        transport_api_version: V3
        grpc_services:
        - envoy_grpc:
            cluster_name: xds_cluster
  connect_timeout: 0.25s
  lb_policy: ROUND_ROBIN
  transport_socket:
    name: envoy.transport_sockets.tls
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
      common_tls_context:
        tls_certificate_sds_secret_configs:
        - name: upstream_cert
          sds_config:
            resource_api_version: V3
            api_config_source:
              api_type: GRPC
              grpc_services:
              - envoy_grpc:
                  cluster_name: xds_cluster

3.4 LDS 与 RDS:监听器与路由管理

LDS 定义 Envoy 如何接收流量,RDS 定义流量进入后如何转发。LDS 中的 HTTP 连接管理器(HCM)过滤器会引用 RDS 提供的路由配置。

  • LDS 关键字段:address(监听地址)、filter_chains(过滤器链,包含 TLS 和网络过滤器)、listener_filters(如原始目的地过滤器)。
  • RDS 关键字段:virtual_hosts(虚拟主机,包含域名匹配)、routes(路由规则,包含匹配条件与转发动作)、direct_response(直接响应,用于健康检查或固定响应)。
安全风险: 如果 LDS 未正确配置 filter_chain_match(如 SNI 匹配),可能导致 TLS 证书被错误路由。RDS 中应避免使用过于宽泛的路由匹配(如 prefix: "/" 未加限制),防止路径遍历攻击。

3.5 SDS:动态证书管理

SDS 是 Envoy 实现 mTLS 和证书轮换的关键组件。它允许控制面动态下发 TlsCertificate(服务端/客户端证书)、CertificateValidationContext(CA 证书)和 GenericSecret(通用密钥)。

SDS 资源类型 用途 典型更新场景
TlsCertificate 包含证书链和私钥,用于 Envoy 对外展示身份。 证书到期前自动轮换,控制面推送新证书。
CertificateValidationContext 定义信任的 CA 列表、证书吊销列表(CRL)及验证规则。 CA 变更或新增信任根时动态更新。
GenericSecret 存储任意敏感数据(如 ),通过 SDS 安全下发。 密钥定期轮换或应用配置更新。
xDS 协议依赖关系与配置生效链路 LDS (监听器) RDS (路由) CDS (集群) EDS (端点) SDS (证书) 引用 引用 依赖 可选依赖 说明:LDS 引用 RDS 定义路由规则;RDS 引用 CDS 定义目标集群;CDS 依赖 EDS 获取端点列表;SDS 可被 LDS(TLS 上下文)和 CDS(上游 TLS)引用。

3.6 增量 xDS 与资源版本控制

Envoy 支持两种订阅模式:

  • 全量(State of the World, SotW):控制面每次响应都包含所有资源对象,Envoy 替换本地全部配置。适用于资源量小或初始同步场景。
  • 增量(Delta):控制面仅发送变更的资源(新增、更新、删除),Envoy 进行局部更新。大幅减少网络开销和 CPU 消耗,适用于大规模集群。

版本控制通过 version_info 和 response_nonce 实现。Envoy 在 DiscoveryRequest 中携带当前版本号,控制面返回新版本号。若 Envoy 应用失败,NACK 会携带错误信息,控制面可据此回滚或重试。

版本控制最佳实践:
  • 控制面应使用单调递增的版本号(如时间戳或 Git Commit Hash),避免版本回退导致配置混乱。
  • Envoy 的 --bootstrap-version 参数可指定初始版本,用于控制面校验。
  • 监控 NACK 频率和错误类型,快速定位配置错误或控制面 Bug。

3.7 安全基线核验要点

从 CIS Envoy 基准和云原生安全角度,xDS 配置需关注以下核验项:

核验项 检查内容 风险等级
xDS 传输加密 控制面与 Envoy 之间的 gRPC 连接是否启用 TLS。 高
SDS 证书轮换 证书是否设置有效期,SDS 是否支持自动轮换。 高
NACK 监控 是否配置告警机制,当 Envoy 频繁 NACK 时及时响应。 中
最小权限订阅 Envoy 是否只订阅其所需的资源名称,避免订阅全量资源。 中
控制面认证 Envoy 是否使用 或 mTLS 向控制面证明身份。 高