Envoy retry_policy不生效求助:请求路由正常但重试失败
Envoy重试策略不生效问题排查
环境配置
static_resources: listeners: - name: listener_0 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 stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: local_service domains: [ "*" ] routes: - match: prefix: "/" route: cluster: backend_service retry_policy: retry_on: 5xx num_retries: 3 per_try_timeout: 10s 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: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN load_assignment: cluster_name: backend_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: service-front port_value: 5000
问题现象
service-front暴露的worker pod被调用时固定返回500响应,但通过curl调用Envoy服务时,直接返回500,配置的3次重试完全未触发。
已尝试的方案
- 在路由的
retry_policy中配置重试规则(即上述yaml中的配置) - 在虚拟主机(virtual_host)层级配置
retry_policy - 在请求中携带
x-envoy-retry-on请求头
以上方案均未生效,开启Envoy调试日志后也无任何重试相关输出。
问题分析与解决办法
1. 后端集群仅单个端点
Envoy默认不会对同一后端端点进行重试(避免重复请求故障实例),如果你的backend_service只有一个端点,需要显式允许重试同一主机:
修改集群配置,添加retry_host_predicates:
clusters: - name: backend_service connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN retry_host_predicates: - name: envoy.retry_host_predicates.previous_hosts typed_config: "@type": type.googleapis.com/envoy.extensions.retry_host_predicates.previous_hosts.v3.PreviousHostsPredicate allow_list_previous_hosts: true load_assignment: cluster_name: backend_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: service-front port_value: 5000
2. 请求方法为非幂等类型
如果你的请求是POST、PUT等非幂等方法,Envoy默认不会重试。需要在重试策略中明确允许对应方法:
retry_policy: retry_on: 5xx num_retries: 3 per_try_timeout: 10s allowed_methods: POST, PUT # 或用"*"允许所有方法
3. 响应状态码不符合重试条件
确认后端返回的是标准HTTP 5xx状态码,可通过curl -v查看响应详情,排除自定义响应导致Envoy无法识别的情况。
4. 简化Router过滤器配置
尝试去掉Router过滤器的冗余typed_config(若Envoy版本支持默认配置):
http_filters: - name: envoy.filters.http.router
内容的提问来源于stack exchange,提问作者tharinduwijewardane
相关产品推荐
相关产品推荐

