如何在Envoy中配置服务A与B的故障自动切换回退策略?
Envoy主备服务切换配置方案
针对你描述的主备服务切换需求,可通过Envoy的集群优先级配置+健康检查实现主服务A存活时转发至A,A不可用自动切到B,A恢复后切回的逻辑,同时适配两个服务的HTTPS/HTTP差异及不同端点路径。
核心配置思路
- 定义两个集群分别对应服务A和B,设置A为高优先级(primary),B为低优先级(secondary)
- 为两个集群配置对应协议的健康检查,确保Envoy能实时感知服务状态
- 通过路由规则实现请求路径的动态重写,匹配目标服务的端点
- 监听外部请求端口,将流量转发至配置好的主备集群
完整配置示例
static_resources: listeners: - name: main_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 codec_type: AUTO stat_prefix: ingress_http route_config: name: main_route virtual_hosts: - name: main_host domains: ["*"] routes: - match: { prefix: "/" } route: cluster: active_service_cluster retry_policy: retry_on: "5xx,gateway-error,connect-failure,refused-stream" num_retries: 2 # 路径重写:根据目标集群动态替换请求路径 typed_per_filter_config: envoy.filters.http.router: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router dynamic_config: path_rewrite_policy: replace_prefix: prefix: "/" replacement: "/dataservice1/A" # 默认主服务A的端点路径 override_cluster_config: - cluster_name: service_b_cluster path_rewrite_policy: replace_prefix: prefix: "/" replacement: "/dataservice2/B" # 切换到B时替换为对应端点路径 http_filters: - name: envoy.filters.http.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: # 主服务A集群(HTTPS协议) - name: service_a_cluster connect_timeout: 0.25s type: STATIC lb_policy: ROUND_ROBIN priority: 0 # 最高优先级 load_assignment: cluster_name: service_a_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: { address: 127.0.0.1, port_value: 8445 } transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext sni: "localhost" # 服务A的SNI,需与服务端证书域名匹配 health_checks: - timeout: 1s interval: 5s unhealthy_threshold: 2 healthy_threshold: 2 http_health_check: path: "/dataservice1/A/health" # 替换为服务A实际健康检查端点,无专用端点可复用业务路径 port_value: 8445 tls_config: sni: "localhost" # 备用服务B集群(HTTP协议) - name: service_b_cluster connect_timeout: 0.25s type: STATIC lb_policy: ROUND_ROBIN priority: 1 # 次优先级 load_assignment: cluster_name: service_b_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: { address: 127.0.0.1, port_value: 9446 } health_checks: - timeout: 1s interval: 5s unhealthy_threshold: 2 healthy_threshold: 2 http_health_check: path: "/dataservice2/B/health" # 替换为服务B实际健康检查端点 # 组合主备集群的逻辑集群 - name: active_service_cluster type: CLUSTER_TYPE lb_policy: ROUND_ROBIN cluster_type: name: envoy.cluster_types.priority typed_config: "@type": type.googleapis.com/envoy.extensions.cluster_types.priority.v3.PriorityClusterConfig clusters: - cluster: service_a_cluster - cluster: service_b_cluster
关键配置说明
监听器配置
- 监听
0.0.0.0:8080作为外部请求入口,可根据业务需求调整端口 - 通过
http_connection_manager处理HTTP请求,并将流量路由到组合逻辑集群active_service_cluster
- 监听
动态路径重写
- 利用
dynamic_config实现基于目标集群的路径替换:流量转发到A时自动替换为/dataservice1/A,切换到B时替换为/dataservice2/B,确保外部请求能正确映射到对应服务的业务端点
- 利用
集群优先级与健康检查
service_a_cluster设为优先级0(最高),service_b_cluster设为优先级1,Envoy会优先选择优先级最高且健康的集群- 为A配置HTTPS健康检查,为B配置HTTP健康检查,通过
interval(检查间隔)、unhealthy_threshold(判定不健康的连续失败次数)等参数控制状态感知逻辑 - 当A健康时,流量全部发往A;A连续失败达到阈值后,自动切换到B;A恢复健康后,会切回A
TLS适配
- 服务A为HTTPS,因此在
service_a_cluster中配置UpstreamTlsContext并设置SNI,确保Envoy与服务A的HTTPS通信正常
- 服务A为HTTPS,因此在
内容的提问来源于stack exchange,提问作者Manoj Dahal
相关产品推荐
相关产品推荐

