3. Envoy 基础架构:Listener、Cluster、Endpoint、Route 配置详解
Envoy 作为高性能数据平面代理,其核心配置模型围绕四个基本构件展开:Listener(监听器)、Cluster(集群)、Endpoint(端点)和 Route(路由)。理解这四者的关系与配置方式是掌握 Envoy 流量管理的基础,也是后续实现 GitOps 自动化回滚与恢复的前提。
3.1 核心架构概览
Envoy 的流量处理流程可以概括为:Listener 接收请求 → Route 匹配路由 → Cluster 选择上游集群 → Endpoint 转发到具体实例。下图展示了这一核心数据流。
3.2 Listener(监听器)
Listener 是 Envoy 流量的入口点。它定义了 Envoy 进程在哪个 IP 地址和端口上监听入站连接。每个 Listener 可以绑定多个 Filter Chain(过滤器链),用于处理不同协议或 TLS 配置的流量。
3.2.1 核心配置字段
| 字段 | 类型 | 说明 | 示例值 |
|---|---|---|---|
| name | string | 监听器名称,用于标识和日志 | http_listener |
| address | SocketAddress | 监听的 IP 和端口 | 0.0.0.0:8080 |
| filter_chains | list | 过滤器链列表,处理入站流量 | 包含 HTTP 连接管理器 |
| listener_filters | list | 在 filter_chains 之前执行的过滤器 | OriginalDst、TLS Inspector |
| traffic_direction | enum | 流量方向:INBOUND / OUTBOUND | INBOUND |
3.2.2 典型配置示例
static_resources:
listeners:
- name: http_listener
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_backend
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
GitOps 实践提示: Listener 配置通常较为稳定,变更频率低。在 GitOps 工作流中,建议将 Listener 配置与 Route/Cluster 配置分离存储,减少不必要的同步窗口触发。
3.3 Route(路由)
Route 配置定义了如何将进入 Listener 的请求匹配并转发到特定的 Cluster。Envoy 支持丰富的匹配条件,包括路径前缀、精确路径、正则表达式、HTTP Header、Query 参数等。
3.3.1 路由匹配与动作
每个 Route 条目包含两个核心部分:match(匹配条件)和 route(转发动作)。
| 匹配类型 | 配置字段 | 说明 | 示例 |
|---|---|---|---|
| 路径前缀 | prefix |
匹配 URL 路径前缀 | /api/ |
| 精确路径 | path |
完全匹配 URL 路径 | /healthz |
| 正则路径 | safe_regex |
使用 RE2 正则匹配路径 | ^/v[1-2]/.* |
| Header 匹配 | headers |
匹配 HTTP Header 键值对 | env: canary |
| Query 参数 | query_parameters |
匹配 URL Query 参数 | version=v2 |
3.3.2 路由配置示例
route_config:
name: local_route
virtual_hosts:
- name: backend_services
domains: ["*"]
routes:
- match:
prefix: "/api/v1/"
route:
cluster: service_v1
timeout: 5s
- match:
prefix: "/api/v2/"
route:
cluster: service_v2
timeout: 10s
- match:
prefix: "/static/"
route:
cluster: static_assets
prefix_rewrite: "/assets/"
- match:
prefix: "/"
route:
cluster: default_service
回滚关键点: 路由配置的变更(如修改
cluster 指向、调整超时时间)可能直接影响线上流量。在 GitOps 同步窗口中,建议对 Route 变更设置 人工审批 或 渐进式发布 策略,避免因错误路由导致全局故障。
3.4 Cluster(集群)
Cluster 定义了一组提供相同逻辑服务的上游主机集合。Envoy 通过 Cluster 管理负载均衡、健康检查、连接池、断路器等关键功能。
3.4.1 Cluster 核心配置
| 配置项 | 说明 | 常见值 |
|---|---|---|
| name | 集群名称,被 Route 引用 | service_backend |
| type | 服务发现类型 | STRICT_DNS / STATIC / EDS |
| lb_policy | 负载均衡策略 | ROUND_ROBIN / LEAST_REQUEST / RING_HASH |
| connect_timeout | 与上游建立连接的超时时间 | 0.5s |
| circuit_breakers | 断路器配置,防止级联故障 | 最大连接数、最大请求数 |
| health_checks | 主动健康检查配置 | HTTP / TCP 检查 |
3.4.2 典型 Cluster 配置
clusters:
- name: service_backend
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: LEAST_REQUEST
connect_timeout: 0.5s
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_pending_requests: 500
max_requests: 2000
max_retries: 3
health_checks:
timeout: 1s
interval: 5s
unhealthy_threshold: 3
healthy_threshold: 2
http_health_check:
path: "/healthz"
load_assignment:
cluster_name: service_backend
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: service-backend.default.svc.cluster.local
port_value: 3000
3.5 Endpoint(端点)
Endpoint 是 Cluster 中具体的后端实例,包含 IP 地址和端口。Envoy 支持多种方式获取 Endpoint 信息:
- 静态配置(STATIC): 在配置文件中直接列出所有 Endpoint 地址。
- DNS 解析(STRICT_DNS / LOGICAL_DNS): 通过 DNS 查询动态获取 Endpoint 列表。
- EDS(Endpoint Discovery Service): 通过 xDS 协议从控制平面动态获取 Endpoint,是 Istio 等 Service Mesh 的默认方式。
3.5.1 Endpoint 配置对比
| 发现方式 | 适用场景 | 动态性 | GitOps 管理复杂度 |
|---|---|---|---|
| STATIC | 测试环境、固定后端 | 低 | 低(直接写入 YAML) |
| STRICT_DNS | Kubernetes Service、固定域名 | 中 | 中(需管理 DNS 记录) |
| EDS | 大规模动态微服务、Service Mesh | 高 | 高(需控制平面配合) |
3.5.2 静态 Endpoint 配置示例
clusters:
- name: static_backend
type: STATIC
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: static_backend
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 10.0.1.10
port_value: 3000
- endpoint:
address:
socket_address:
address: 10.0.1.11
port_value: 3000
- endpoint:
address:
socket_address:
address: 10.0.1.12
port_value: 3000
3.6 四者协同关系总结
下图展示了 Listener、Route、Cluster、Endpoint 在 Envoy 配置中的层级关系与数据流向,帮助理解 GitOps 变更影响范围。
GitOps 自动化回滚要点:
- Listener 变更: 影响面最大(端口、协议变更),建议设置较长的同步窗口和人工审批。
- Route 变更: 流量调度核心,建议使用 权重路由 或 影子流量 验证后再全量切换。
- Cluster 变更: 负载均衡策略、超时、断路器参数调整需谨慎,错误配置可能导致服务雪崩。
- Endpoint 变更: 在 GitOps 中通常由 Operator 自动管理,回滚时需确保 Endpoint 列表与 Cluster 配置一致。