2. Envoy流量拓扑基础
Envoy 作为服务网格的数据面核心,其流量处理能力建立在四个基础配置模型之上:Listener(监听器)、Route(路由)、Cluster(集群)和 Endpoint(端点)。理解这四个模型及其静态/动态资源管理方式,是掌握 Envoy 流量拓扑的基石。
2.1 四大核心配置模型
Envoy 的流量处理流水线遵循“监听 → 路由 → 转发”的线性路径。每个模型承担明确的职责:
| 模型 | 职责 | 类比 |
|---|---|---|
| Listener | 定义 Envoy 在哪个 IP:Port 上监听入站流量,以及使用何种协议(HTTP、TCP、TLS 等) | 机场的登机口 |
| Route | 根据请求属性(Host、Path、Header 等)匹配并决定将流量转发到哪个 Cluster | 登机口的航班指示牌 |
| Cluster | 定义一组提供相同服务的上游主机集合,以及负载均衡策略、连接池、健康检查等 | 航班的机组人员团队 |
| Endpoint | Cluster 中具体的上游主机实例(IP:Port),是流量的最终目的地 | 机组中的每位成员 |
关键理解: 流量从 Listener 进入,经过 Route 匹配,被转发到 Cluster,最终到达具体的 Endpoint。这四个模型构成了 Envoy 流量拓扑的完整闭环。
2.2 配置模型关系与流量路径
下图展示了 Envoy 内部四个模型之间的层级关系与流量流转路径:
2.3 静态资源 vs 动态资源
Envoy 支持两种资源配置方式:静态资源(Static)和动态资源(Dynamic)。静态资源在 Envoy 启动时通过配置文件一次性加载,之后不可变更;动态资源则通过 xDS 协议从控制面(如 Istiod)实时获取,支持热更新。
| 对比维度 | 静态资源 | 动态资源 |
|---|---|---|
| 配置来源 | 本地 YAML/JSON 配置文件 | 控制面 xDS 服务(CDS、EDS、LDS、RDS) |
| 更新方式 | 需重启 Envoy 进程 | 热更新,无需重启 |
| 适用场景 | 固定基础设施、边缘代理 | 服务网格、动态微服务环境 |
| 配置复杂度 | 低,所有配置写在一个文件 | 高,需配合控制面协调 |
| 可观测性 | 静态,变更需人工审计 | 动态,变更可追踪、可回滚 |
最佳实践: 在生产服务网格中,推荐使用动态资源。Istio 通过 Pilot 组件向 Envoy 推送 LDS、RDS、CDS、EDS 更新,实现服务发现、流量路由、故障注入等策略的秒级生效。
2.4 静态资源配置示例
以下是一个完整的静态资源配置片段,展示了 Listener、Route、Cluster 和 Endpoint 的声明方式:
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: "/api" }
route: { cluster: service_api }
http_filters:
- name: envoy.filters.http.router
clusters:
- name: service_api
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_api
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: 10.0.1.10, port_value: 9090 }
- endpoint:
address:
socket_address: { address: 10.0.1.11, port_value: 9090 }
2.5 动态资源与 xDS 协议
动态资源通过以下 xDS API 实现:
- LDS(Listener Discovery Service):动态下发 Listener 配置,包括端口、过滤器链、TLS 证书等。
- RDS(Route Discovery Service):动态下发 Route 配置,支持按域名、路径、Header 等条件分流。
- CDS(Cluster Discovery Service):动态下发 Cluster 配置,包括连接池大小、超时时间、健康检查参数等。
- EDS(Endpoint Discovery Service):动态下发 Endpoint 列表,实现服务实例的自动发现与摘除。
注意: 动态资源虽然灵活,但需要控制面具备高可用能力。如果控制面故障,Envoy 会继续使用最后一次成功获取的配置,不会自动回退到静态配置。建议在 bootstrap 配置中同时设置静态 fallback 资源。
2.6 动态资源配置示例(bootstrap + xDS)
以下 bootstrap 配置声明 Envoy 通过 xDS 从控制面获取动态资源:
dynamic_resources:
lds_config:
api_config_source:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
cds_config:
api_config_source:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
static_resources:
clusters:
- name: xds_cluster
type: STRICT_DNS
lb_policy: ROUND_ROBIN
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
load_assignment:
cluster_name: xds_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: istiod.istio-system.svc.cluster.local, port_value: 15012 }
2.7 静态与动态的混合使用策略
在实际部署中,静态和动态资源并非互斥,而是可以混合使用:
| 资源类型 | 推荐方式 | 原因 |
|---|---|---|
| xDS 控制面连接 | 静态 | 控制面地址固定,避免循环依赖 |
| 管理端口(Admin) | 静态 | 运维入口需稳定可靠 |
| 业务 Listener | 动态(LDS) | 支持端口、协议、TLS 策略热更新 |
| 路由规则 | 动态(RDS) | 灰度发布、流量镜像、故障注入等场景 |
| 上游集群 | 动态(CDS) | 服务扩缩容、集群参数调整 |
| 端点列表 | 动态(EDS) | 服务实例自动发现与健康检查 |
核心结论: Listener、Route、Cluster、Endpoint 是 Envoy 流量拓扑的四大支柱。静态资源适合固定不变的底座配置,动态资源(xDS)则赋予服务网格弹性与实时控制能力。在 Istio 环境中,这四个模型完全由控制面动态管理,SRE 无需手动修改 Envoy 配置文件。