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。
- Envoy 启动:向控制面发起 xDS 流式 gRPC 连接。
- 订阅请求:Envoy 发送
DiscoveryRequest,包含节点标识、资源类型、资源名称列表及版本信息。 - 控制面响应:返回
DiscoveryResponse,包含资源对象(如 Listener、Cluster 等)及新版本号。 - ACK/NACK:Envoy 应用配置后,发送 ACK(确认)或 NACK(拒绝,携带错误信息)更新版本状态。
- 增量更新:支持 ADS(Aggregated Discovery Service)聚合所有资源类型在单一 gRPC 流中传输,减少连接数。
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 负责定义集群的“成员”属性。两者通常配合使用,实现精细化的流量管理。
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(直接响应,用于健康检查或固定响应)。
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 安全下发。 | 密钥定期轮换或应用配置更新。 |
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 向控制面证明身份。 | 高 |