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 等协议升级配置 长连接场景下的隔离策略
关键原则: HCM 的 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" }
隔离实践: 在 IDP 中,为每个故障域(如“部署域”、“监控域”、“存储域”)分配独立的虚拟主机,可以在域名层面实现第一层故障隔离,防止跨域流量干扰。

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 过滤器链与路由表如何协同工作,实现故障注入的精准投放:

HCM 过滤器链与路由故障注入流程 HTTP 请求入站 envoy.filters.http.fault 故障注入:延迟/中断/HTTP错误 envoy.filters.http.router 路由表匹配:虚拟主机 → 路由规则 匹配成功 转发至上游集群 匹配失败 返回 404 / 默认路由 故障注入隔离要点 1. 故障注入过滤器在路由之前执行,确保故障规则优先于路由决策 2. 通过路由匹配条件(头部/路径/参数)精确控制故障注入的目标范围

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 的路由匹配遵循“首次匹配”原则。在配置故障域隔离时,必须注意路由顺序:

  1. 精确路径匹配 优先级最高,常用于健康检查、指标端点等需要绕过故障注入的路径。
  2. 前缀匹配 次之,用于划分 API 功能域。
  3. 正则匹配 最后,用于复杂模式匹配。
故障域隔离最佳实践: 将 /healthz、/readyz 等探活路径放在路由表最前面,并确保这些路径的 typed_per_filter_config 中禁用故障注入,避免故障演练导致控制面误判。

通过合理配置 HCM 的虚拟主机、路由匹配规则和过滤器覆盖机制,平台工程师可以在 Envoy 层面构建出层次分明、边界清晰的故障域隔离体系,为后续的故障注入演练奠定坚实的基础。