4. Envoy HTTP 连接管理:HCM 配置、路由匹配规则与虚拟主机
Envoy 的 HTTP 连接管理器(HTTP Connection Manager,HCM)是处理七层流量的核心过滤器。它负责解析 HTTP 协议、管理连接生命周期、执行路由决策,并将流量分发至上游集群。在平台工程 IDP 的故障域隔离演练中,HCM 是注入故障和验证隔离策略的关键控制点。
4.1 HCM 配置结构
HCM 作为 Envoy 网络过滤器链中的一员,其配置嵌入在 listener.filter_chains.filters 中。一个典型的 HCM 配置包含以下核心部分:
| 配置字段 | 作用 | 故障域隔离相关 |
|---|---|---|
stat_prefix |
定义统计指标前缀 | 用于区分不同 HCM 的监控数据 |
route_config |
静态路由配置(或 RDS) | 定义流量分发规则与故障注入挂载点 |
http_filters |
HTTP 过滤器链 | 故障注入过滤器在此链中生效 |
codec_type |
编解码类型(AUTO/HTTP1/HTTP2) | 影响连接复用与隔离粒度 |
upgrade_configs |
WebSocket 等协议升级配置 | 长连接场景下的隔离策略 |
http_filters 链中,故障注入过滤器(envoy.filters.http.fault)必须放置在路由过滤器(envoy.filters.http.router)之前,否则故障注入将不会生效。
4.2 虚拟主机与路由表
路由配置(RouteConfiguration)是 HCM 的流量调度大脑。它通过虚拟主机(VirtualHost)和路由条目(Route)实现多域名、多路径的精细控制。
4.2.1 虚拟主机(VirtualHost)
虚拟主机用于根据请求的 Host 头部进行域名级别的流量隔离。每个虚拟主机包含一组路由规则。
virtual_hosts:
- name: "idp_service_vhost"
domains: ["*.idp.internal", "idp.internal"]
routes:
- match: { prefix: "/api/v1/deploy" }
route: { cluster: "deploy_service_cluster" }
- match: { prefix: "/api/v1/rollback" }
route: { cluster: "rollback_service_cluster" }
- name: "monitoring_vhost"
domains: ["monitor.idp.internal"]
routes:
- match: { prefix: "/metrics" }
route: { cluster: "prometheus_cluster" }
4.2.2 路由匹配规则
Envoy 支持多种路由匹配条件,用于精确控制流量走向。在故障注入演练中,这些匹配规则决定了故障影响的范围。
| 匹配类型 | 配置示例 | 适用场景 |
|---|---|---|
| 前缀匹配 | prefix: "/api/v2/" |
按 API 版本隔离 |
| 路径精确匹配 | path: "/healthz" |
健康检查路径绕过故障注入 |
| 正则匹配 | safe_regex: { regex: "/(canary|staging)/.*" } |
金丝雀发布流量隔离 |
| 头部匹配 | headers: [{ name: "x-fault-domain", exact_match: "storage" }] |
基于自定义头部的故障域路由 |
| 查询参数匹配 | query_parameters: [{ name: "debug", present: true }] |
调试流量隔离 |
4.3 HCM 与路由的故障注入关系
下图展示了 HCM 内部 HTTP 过滤器链与路由表如何协同工作,实现故障注入的精准投放:
4.4 路由权重与故障域隔离
Envoy 支持在路由条目中配置权重(weighted_clusters),实现流量按比例分发。在故障域隔离演练中,这一特性可用于灰度故障注入:
routes:
- match: { prefix: "/api/v1/workflow" }
route:
weighted_clusters:
total_weight: 100
clusters:
- name: "stable_cluster"
weight: 90
- name: "canary_cluster"
weight: 10
weighted_clusters 上叠加故障注入过滤器时,故障规则会作用于所有上游集群。若需要针对特定集群注入故障,应使用 request_headers_to_add 或虚拟主机级别的过滤器覆盖。
4.5 虚拟主机级别的故障注入覆盖
Envoy 允许在虚拟主机或路由级别通过 typed_per_filter_config 覆盖全局过滤器配置。这是实现精细化故障域隔离的关键技术:
virtual_hosts:
- name: "canary_vhost"
domains: ["canary.idp.internal"]
typed_per_filter_config:
envoy.filters.http.fault:
"@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault
abort:
http_status: 503
percentage:
numerator: 50
denominator: HUNDRED
routes:
- match: { prefix: "/" }
route: { cluster: "canary_cluster" }
上述配置仅对 canary.idp.internal 域名的请求注入 50% 的 503 故障,而其他虚拟主机不受影响。这种机制使得平台工程师可以在不修改全局配置的前提下,针对特定故障域(如金丝雀环境)进行隔离验证。
4.6 路由匹配优先级与故障域边界
Envoy 的路由匹配遵循“首次匹配”原则。在配置故障域隔离时,必须注意路由顺序:
- 精确路径匹配 优先级最高,常用于健康检查、指标端点等需要绕过故障注入的路径。
- 前缀匹配 次之,用于划分 API 功能域。
- 正则匹配 最后,用于复杂模式匹配。
/healthz、/readyz 等探活路径放在路由表最前面,并确保这些路径的 typed_per_filter_config 中禁用故障注入,避免故障演练导致控制面误判。
通过合理配置 HCM 的虚拟主机、路由匹配规则和过滤器覆盖机制,平台工程师可以在 Envoy 层面构建出层次分明、边界清晰的故障域隔离体系,为后续的故障注入演练奠定坚实的基础。