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 持有配置的快照副本,避免锁竞争。
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 接口。
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 即可在毫秒级内将流量从故障端点移出,整个过程对客户端完全透明。