You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:50:23