1. Envoy 架构概述:数据平面与控制平面分离原理、xDS 协议基础、核心资源模型

1.1 数据平面与控制平面分离架构

Envoy 采用典型的数据平面(Data Plane)与控制平面(Control Plane)分离架构。这种设计将流量转发与策略下发解耦,是 Envoy 实现动态配置、热更新和故障隔离的架构基础。

架构核心原则: 数据平面只负责高效转发流量,不存储全局状态;控制平面负责计算、校验和分发配置,不参与数据路径。两者通过标准 xDS 协议通信。

下表对比了数据平面与控制平面的职责与特性:

维度 数据平面(Envoy Sidecar / Gateway) 控制平面(如 Istiod / xDS Server)
核心职责 监听端口、解析请求、负载均衡、TLS 终止、流量镜像、健康检查 聚合服务注册信息、生成路由规则、下发证书、管理限流配额
状态特征 无状态或仅缓存本地配置,重启后从控制平面重新拉取 有状态,维护全量服务拓扑与配置版本
故障影响 单个 Envoy 故障仅影响本地流量,不扩散 控制平面故障不影响已下发的数据平面运行,但无法更新配置
性能要求 高吞吐、低延迟,通常运行在数据路径上 低延迟可接受,重点在于一致性和可用性
配置来源 通过 xDS 订阅从控制平面拉取 从 Kubernetes API、文件、GitOps 等上游获取
SRE 视角: 在故障排查中,分离架构意味着数据平面问题(如连接超时)与控制平面问题(如路由未下发)需要不同的诊断路径。回滚护栏应优先保护数据平面的稳定运行,避免控制平面异常配置直接冲击流量。

下图展示了 Envoy 数据平面与控制平面的分离关系及 xDS 通信路径:

Envoy 数据平面与控制平面分离架构 Envoy 数据平面与控制平面分离架构 控制平面(Control Plane) xDS Server 服务注册中心 配置校验引擎 数据平面(Data Plane) Envoy Sidecar A 监听 :8080 Envoy Sidecar B 监听 :8081 Envoy Gateway 监听 :443 xDS 协议(LDS / RDS / CDS / EDS)

1.2 xDS 协议基础

xDS(Discovery Service)是 Envoy 与控制平面之间的一组标准 gRPC/REST 协议,用于动态发现配置。每个 xDS 对应一类核心资源,Envoy 通过订阅这些资源实现零停机配置更新。

下表列出了主要的 xDS 协议及其对应的资源类型:

协议缩写 全称 资源类型 典型更新场景
LDS Listener Discovery Service Listener 新增/修改监听端口、TLS 证书更换
RDS Route Discovery Service RouteConfiguration 灰度发布路由、Header 匹配规则变更
CDS Cluster Discovery Service Cluster 新增上游服务、修改连接池大小
EDS Endpoint Discovery Service ClusterLoadAssignment Pod 扩缩容、端点健康状态变化
SDS Secret Discovery Service Secret TLS 证书轮换、私钥更新
HDS Health Discovery Service HealthCheckSpecifier 自定义健康检查策略
安全评估要点: xDS 协议是控制平面下发配置的唯一通道。在回滚场景中,必须确保 xDS 通道的 TLS 加密和身份认证,防止恶意控制平面下发篡改后的配置。同时,Envoy 应配置 xDS 配置版本校验,避免回滚到旧版时出现配置兼容性问题。

xDS 协议的工作流程遵循“订阅-推送-确认”模式:

  1. 订阅(Subscribe): Envoy 启动时向控制平面发起 xDS 流式订阅请求,携带节点标识和资源类型。
  2. 推送(Push): 控制平面在配置变更时,将全量或增量资源版本推送给 Envoy。
  3. 确认(ACK/NACK): Envoy 应用配置后返回 ACK;若校验失败则返回 NACK,并保持旧配置运行。

以下是一个 Envoy 通过 LDS 订阅 Listener 配置的简化示例:

# Envoy 启动时向控制平面发送的 LDS 订阅请求(简化)
node:
  id: "sidecar~10.0.1.5~myapp-abc123~default"
  cluster: "my-cluster"
  metadata:
    role: "sidecar"
    version: "1.28.0"

# 控制平面推送的 Listener 配置(简化)
resources:
  - "@type": "type.googleapis.com/envoy.config.listener.v3.Listener"
    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"
              http_filters:
                - name: "envoy.filters.http.router"

1.3 核心资源模型:Listener / Cluster / Endpoint / Route

Envoy 的配置模型围绕四个核心资源构建,它们共同定义了流量从入站到出站的完整路径。理解这些资源是进行故障排查和回滚设计的前提。

资源依赖链: Listener → FilterChain → Route → Cluster → Endpoint。流量从 Listener 进入,经过路由匹配后转发到 Cluster 中的具体 Endpoint。

下表详细对比了四个核心资源的定义与关键属性:

资源 定义 关键属性 故障排查关注点
Listener 定义 Envoy 监听的 IP:Port 及网络过滤器链 地址、端口、TLS 上下文、过滤器链、连接限制 端口冲突、TLS 证书过期、过滤器顺序错误
Route 定义请求匹配规则(域名、路径、Header)及目标 Cluster 虚拟主机、匹配条件、路由动作、重定向/重写规则 路由未命中、权重分配错误、Header 条件冲突
Cluster 定义上游服务集群的连接策略、负载均衡算法、健康检查 连接超时、断路器阈值、负载均衡类型、TLS 上游 断路器触发、连接池耗尽、健康检查失败
Endpoint 定义 Cluster 中的具体后端实例(IP:Port + 元数据) 地址、端口、健康状态、权重、区域 端点不可达、权重为 0、区域感知路由异常

下图展示了 Listener → Route → Cluster → Endpoint 的完整流量路径及资源关系:

Envoy 核心资源模型与流量路径 Envoy 核心资源模型:流量路径 外部流量 Listener 0.0.0.0:8080 Route /api/* → cluster-a Cluster cluster-a Endpoint 列表 10.0.1.10:8080 (健康) 10.0.1.11:8080 (健康) 流量路径:Listener 接收请求 → Route 匹配路由 → Cluster 选择上游 → Endpoint 转发到具体实例

1.4 资源模型在故障排查中的意义

在安全评估驱动的回滚护栏设计中,理解资源模型有助于精准定位故障边界:

  • Listener 层故障: 通常表现为端口无法监听、TLS 握手失败。回滚时应优先检查 Listener 配置版本,避免证书或端口变更导致服务不可用。
  • Route 层故障: 表现为请求 404 或路由到错误 Cluster。回滚护栏应记录路由变更历史,支持按路由名称回退到上一版本。
  • Cluster 层故障: 表现为连接超时、断路器打开。回滚时需注意 Cluster 配置变更(如超时时间、连接池大小)是否与当前流量模式兼容。
  • Endpoint 层故障: 表现为部分请求失败、负载不均。回滚护栏应结合健康检查状态,避免将流量导向不健康的端点。
最佳实践: 在 Envoy 故障排查中,建议按照 Listener → Route → Cluster → Endpoint 的顺序逐层检查。xDS 的 NACK 日志通常能直接指示是哪一层资源校验失败,这是回滚决策的关键信号。