Envoy中如何针对特定请求头值实现可用区感知路由?
Envoy按请求头控制跨可用区路由配置方案
实现逻辑很简单,靠Envoy原生的请求头匹配+路由级负载均衡策略就能搞定,不需要拆分多个上游集群,直接在路由层做策略分流即可。
前置准备
先把基础配置补全,否则可用区路由不生效:
- 每个Envoy实例启动时必须正确标注自身所在可用区,可以在bootstrap配置的
node.locality.zone字段填写可用区标识,也可以直接加启动参数--service-zone=你的可用区标识 - 所有上游服务端点注册时(不管是EDS还是静态配置),必须在
locality.zone字段标注节点所属可用区,保证负载均衡模块能识别节点的位置属性
完整配置示例
核心是在虚拟主机下配两条头匹配规则,分别对应两种路由策略:
static_resources: listeners: - name: listener_0 address: socket_address: { address: 0.0.0.0, port_value: 80 } 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 codec_type: AUTO stat_prefix: ingress_http route_config: name: backend_route virtual_hosts: - name: backend_vhost domains: ["*"] routes: # 匹配header_value=1:允许跨可用区路由 - match: prefix: "/" headers: - name: header_value exact_match: "1" route: cluster: backend_service # 开默认可用区感知路由:优先走本地可用区,本地节点不够时自动跨区兜底 zone_aware_routing: enabled: true # 匹配header_value=2:仅路由本地可用区 - match: prefix: "/" headers: - name: header_value exact_match: "2" route: cluster: backend_service # 元数据强匹配本地可用区节点,完全禁止跨区转发 metadata_match: filter_metadata: envoy.lb: zone: "%LOCAL_ZONE%" http_filters: - name: envoy.filters.http.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: backend_service connect_timeout: 1s type: EDS lb_policy: LEAST_REQUEST # 集群级开启可用区感知路由基础能力 common_lb_config: zone_aware_lb_config: routing_enabled: value: 100 eds_cluster_config: eds_config: path: ./eds.yaml
策略说明
- 携带
header_value=1的请求:走Envoy默认的可用区感知逻辑,优先转发到同可用区上游节点,当同可用区健康节点占比低于阈值时,自动转发到其他可用区节点兜底,保证服务可用性 - 携带
header_value=2的请求:路由层通过元数据强匹配规则,只筛选和当前Envoy同可用区的上游节点,完全不会转发到其他可用区;如果本地可用区没有健康节点,直接返回503,不会触发跨区调用
验证方法
- 发请求带
header_value: 1,手动把本地可用区的上游节点全部设为不健康,可以观察到请求正常转发到其他可用区节点 - 发请求带
header_value: 2,保持其他可用区节点全健康、本地可用区节点全不健康的状态,请求会直接返回503,没有跨可用区调用产生
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

