2. Envoy 基础回顾:Envoy 架构、xDS 协议、静态配置与动态配置的区别

在深入集群升级治理与节点池巡检之前,必须重新夯实 Envoy 的核心基础。Envoy 并非简单的反向代理,而是一个自包含、高性能的 L3/L4/L7 网络架构,其核心设计哲学是“平台无关”与“动态可编程”。本节将聚焦三大基石:代理架构、xDS 控制面协议以及静态与动态配置的本质差异。

2.1 Envoy 代理架构:Worker 与 Listener 模型

Envoy 采用单进程-多工作线程(Worker Thread)架构,避免了多进程模型下的连接震荡。每个 Worker 线程独立运行事件循环,通过 Listener 接受新连接,并通过 Filter Chain 处理流量。

架构要点:
  • Listener(监听器):绑定端口,接受入站连接。支持热重启期间优雅迁移。
  • Filter Chain(过滤器链):L3/L4 网络过滤器(如 TCP Proxy)与 L7 HTTP 过滤器(如 Router、RBAC)串联处理。
  • Cluster(集群):上游服务端点集合,负责负载均衡、健康检查与熔断。
  • Thread Local(线程本地存储):每个 Worker 持有配置的快照副本,避免锁竞争。
Envoy 单进程 Worker 架构 Envoy 主进程 (Main Thread) Listener 1 0.0.0.0:8080 Listener 2 0.0.0.0:8443 Worker 线程池 (Thread Pool) Worker 0 Worker 1 Worker 2 Worker N Cluster 管理 (负载均衡 / 健康检查 / 熔断) 端点 A | 端点 B | 端点 C (动态发现)

2.2 xDS 协议:控制面与数据面的通信桥梁

xDS 是 Envoy 动态配置的核心协议族,本质是基于 gRPC 流式订阅的配置分发协议。控制面(如 Istio Pilot、自定义 xDS Server)通过 xDS 将配置推送到 Envoy 数据面,实现配置的热加载。

xDS 类型 全称 核心作用 热加载场景
LDS Listener Discovery Service 动态下发监听器(端口、协议、过滤器链) 新增/修改监听端口,无需重启
RDS Route Discovery Service 动态下发 HTTP 路由规则(域名、路径、权重) 灰度发布、流量切换
CDS Cluster Discovery Service 动态下发集群定义(连接超时、负载均衡策略) 新增/下线上游服务集群
EDS Endpoint Discovery Service 动态下发集群端点(IP:Port、健康状态) 节点池扩缩容、故障剔除
SDS Secret Discovery Service 动态下发 TLS 证书与私钥 证书轮换,零停机
关键理解: xDS 采用 最终一致性 模型。Envoy 通过 Watch 机制订阅资源,控制面推送 Delta 增量更新,避免全量下发带来的网络与 CPU 开销。在节点池巡检中,EDS 是最频繁使用的 xDS 接口。
xDS 协议交互:控制面 → 数据面 xDS 控制面 Istio Pilot / 自研 Server 聚合配置 + 生成 xDS 资源 gRPC Stream Envoy 数据面 (Sidecar / Gateway) LDS Watch RDS Watch CDS Watch EDS Watch 配置热加载 → 更新 Worker 线程本地快照 上游端点 (EDS 动态发现) Pod A (10.0.1.5:80) | Pod B (10.0.1.6:80) | Pod C (10.0.1.7:80)

2.3 静态配置 vs 动态配置:核心差异

理解静态与动态配置的区别,是掌握 Envoy 热加载的前提。静态配置在启动时一次性加载,任何变更都需要重启进程;动态配置通过 xDS 协议在运行时增量更新,实现零停机。

对比维度 静态配置 (Static) 动态配置 (Dynamic / xDS)
配置来源 本地 YAML / JSON 文件 远程 xDS 控制面(gRPC 流)
更新方式 修改文件 → 重启 Envoy 进程 控制面推送 → 运行时热加载
生效延迟 秒级(重启时间) 毫秒级(流式推送)
配置粒度 全量配置 增量 / Delta 更新
运维风险 重启导致连接中断、流量抖动 无中断,支持优雅排空
适用场景 开发环境、固定配置 生产环境、集群升级、节点池巡检
避坑指南: 静态配置并非完全不可用,但在集群升级治理中,如果依赖静态配置,每次节点池扩缩容或端点变更都需要手动修改配置文件并重启所有 Envoy 实例,这在大规模集群中是不可接受的。动态配置是 Envoy 在云原生场景下发挥价值的基础。

2.4 静态配置示例 vs 动态配置示例

以下对比展示同一个“路由到上游集群”的配置,在静态与动态模式下的写法差异。

静态配置(片段):

static_resources:
  listeners:
  - name: listener_http
    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: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: service_backend }
          http_filters: [ { name: envoy.filters.http.router } ]
  clusters:
  - name: service_backend
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 10.0.1.5, port_value: 80 }
        - endpoint:
            address:
              socket_address: { address: 10.0.1.6, port_value: 80 }

动态配置(xDS 资源片段 - EDS):

# 控制面下发的 EDS 资源 (ClusterLoadAssignment)
cluster_name: "service_backend"
endpoints:
- lb_endpoints:
  - endpoint:
      address:
        socket_address: { address: "10.0.1.5", port_value: 80 }
    health_status: HEALTHY
  - endpoint:
      address:
        socket_address: { address: "10.0.1.6", port_value: 80 }
    health_status: HEALTHY
  - endpoint:
      address:
        socket_address: { address: "10.0.1.7", port_value: 80 }
    health_status: HEALTHY   # 新增节点,无需重启
核心结论: 动态配置将端点列表从静态文件中剥离,交由控制面实时管理。在节点池巡检中,当检测到异常节点时,控制面只需更新 EDS 资源,Envoy 即可在毫秒级内将流量从故障端点移出,整个过程对客户端完全透明。