3. Envoy 配置入门:静态配置与动态配置(xDS)、Listener 与 Cluster 基础配置、HTTP 连接管理器(HCM)配置
Envoy 的配置体系是理解其行为与排障能力的基础。本章将系统讲解 Envoy 的两种配置模式——静态配置与动态配置(xDS),并深入剖析核心组件 Listener、Cluster 以及 HTTP 连接管理器(HCM)的基础配置方法。掌握这些内容后,你将能够独立搭建一个具备基本路由与代理能力的 Envoy 实例,并为后续缓存命中故障排查打下坚实的配置基础。
3.1 静态配置 vs 动态配置(xDS)
Envoy 支持两种配置加载方式:静态配置和动态配置。静态配置在启动时通过一个 YAML 或 JSON 文件一次性加载,所有代理规则在进程生命周期内固定不变;动态配置则通过 xDS(Discovery Service)协议从外部控制平面实时获取配置更新,实现零重启热更新。
| 特性 | 静态配置 | 动态配置(xDS) |
|---|---|---|
| 配置来源 | 本地文件(bootstrap.yaml) | 远程控制平面(如 Istio Pilot、Go Control Plane) |
| 更新方式 | 需重启 Envoy 进程 | 热更新,无需重启 |
| 适用场景 | 测试环境、边缘节点、固定路由 | 生产环境、服务网格、频繁变更 |
| 配置复杂度 | 低,单文件管理 | 高,需部署控制平面 |
| 排障难度 | 低,配置可完整导出 | 中,需结合 xDS 日志与快照 |
config_dump 管理端点(/config_dump)获取当前生效的 xDS 资源快照,对比预期配置与实际配置的差异。
3.2 Listener 与 Cluster 基础配置
Listener 和 Cluster 是 Envoy 代理架构中最核心的两个抽象概念。Listener 负责监听入站流量,Cluster 负责定义上游服务端点。理解它们的配置结构是进行任何流量管理的前提。
3.2.1 Listener 配置
Listener 定义了 Envoy 在哪个 IP 地址和端口上接收来自下游的请求。一个 Envoy 实例可以配置多个 Listener,每个 Listener 可以绑定不同的协议(TCP、UDP)和过滤器链。
static_resources:
listeners:
- name: listener_http
address:
socket_address:
address: 0.0.0.0
port_value: 10000
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
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: service_cluster
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
address 字段必须与容器网络命名空间内的实际 IP 和端口匹配。在 Kubernetes 环境中,通常绑定 0.0.0.0 以监听所有网络接口。端口号应避免与主机上其他进程冲突。
3.2.2 Cluster 配置
Cluster 定义了 Envoy 将请求转发到的上游服务集合。每个 Cluster 可以包含一个或多个端点(endpoint),并支持负载均衡策略、健康检查、连接池等高级特性。
static_resources:
clusters:
- name: service_cluster
connect_timeout: 0.25s
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: service-backend.default.svc.cluster.local
port_value: 8080
health_checks:
- timeout: 1s
interval: 10s
unhealthy_threshold: 3
healthy_threshold: 2
http_health_check:
path: "/health"
| Cluster 字段 | 说明 | 常见取值 |
|---|---|---|
type |
端点发现方式 | STRICT_DNS、LOGICAL_DNS、STATIC、EDS |
lb_policy |
负载均衡算法 | ROUND_ROBIN、LEAST_REQUEST、RING_HASH、MAGLEV |
connect_timeout |
与上游建立连接的超时时间 | 0.25s、1s |
health_checks |
主动健康检查配置 | HTTP、TCP、gRPC 检查 |
type 配置错误是导致缓存命中失败或请求超时的常见原因。例如,在 Kubernetes 中使用 STRICT_DNS 时,DNS 解析结果必须与 Service 的 Endpoints 一致;若使用 STATIC 类型,则需确保端点 IP 在容器生命周期内不会变化。
3.3 HTTP 连接管理器(HCM)配置
HTTP 连接管理器(HCM)是 Envoy 中最核心的网络过滤器,负责处理 HTTP/1.1、HTTP/2 以及 HTTP/3 协议的解析、路由和过滤。HCM 配置在 Listener 的 filter_chains 中,是连接下游请求与上游 Cluster 的桥梁。
3.3.1 HCM 核心配置结构
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/api"
route:
cluster: api_cluster
- match:
prefix: "/static"
route:
cluster: static_cluster
timeout: 30s
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
3.3.2 HCM 关键参数说明
| 参数 | 作用 | 缓存排障关联 |
|---|---|---|
codec_type |
协议编解码类型(AUTO/HTTP1/HTTP2) | HTTP/2 多路复用可能影响缓存键生成 |
route_config |
路由表定义,决定请求转发目标 | 路由规则错误会导致缓存 miss 或请求到错误 Cluster |
http_filters |
HTTP 过滤器链,顺序执行 | 缓存过滤器(如本地缓存、外部缓存)必须位于 Router 之前 |
stat_prefix |
统计指标前缀 | 用于区分不同 Listener 的缓存命中统计 |
request_timeout |
完整请求超时时间 | 超时过短可能导致缓存未填充完成即被中断 |
http_filters 的顺序至关重要。如果缓存过滤器(如 envoy.filters.http.cache)被放置在 envoy.filters.http.router 之后,缓存逻辑将永远不会生效,因为 Router 过滤器会直接将请求转发到上游,不再经过后续过滤器。正确的顺序应为:缓存过滤器 → 其他过滤器 → Router 过滤器
3.4 静态配置与动态配置的架构对比
下图展示了静态配置与动态配置(xDS)在 Envoy 中的整体架构差异。静态配置中所有资源定义在本地 bootstrap 文件中;动态配置中 Envoy 通过 gRPC 流从控制平面订阅 LDS、RDS、CDS、EDS 等资源更新。
3.5 本章小结
本章涵盖了 Envoy 配置的三大基础模块:
- 静态配置 vs 动态配置(xDS):理解两种模式的适用场景与排障差异,掌握
config_dump的使用方法。 - Listener 与 Cluster 基础配置:Listener 定义入站流量入口,Cluster 定义上游服务端点,两者共同构成 Envoy 代理的核心骨架。
- HTTP 连接管理器(HCM)配置:HCM 是 HTTP 流量的处理中枢,其过滤器顺序直接影响缓存逻辑是否生效。