【问题标题】:Thrift Rate Limiting with EnvoyEnvoy 的节俭率限制
【发布时间】:2019-10-31 04:03:40
【问题描述】:

我正在扩展 Istio 以提供 Thrift 功能。我现在正在开发的 Istio 组件是 Pilot(Envoy 配置服务)。我使用基本的 Thrift 路由对其进行了扩展,以便它可以提供 Envoy 配置以将侦听器路由到正确的集群。我的开发环境如下所示:

现在我正在尝试添加速率限制。我正在关注the docs。我已经使用未应用的 RouteAction 修补了我的配置,因为没有速率限制过滤器。这工作正常,并像以前一样通过流量:

...
       {
        "filters": [
         {
          "name": "envoy.filters.network.thrift_proxy",
          "typed_config": {
           "@type": "type.googleapis.com/envoy.config.filter.network.thrift_proxy.v2alpha1.ThriftProxy",
           "stat_prefix": "10.97.28.169_9090",
           "transport": "HEADER",
           "protocol": "BINARY",
           "route_config": {
            "name": "outbound|9090||backend.default.svc.cluster.local",
            "routes": [
             {
              "match": {
               "method_name": ""
              },
              "route": {
               "cluster": "outbound|9090||backend.default.svc.cluster.local",
               "rate_limits": [
                {
                 "actions": [
                  {
                   "request_headers": {
                    "header_name": ":method-name",
                    "descriptor_key": "method-name"
                   }
                  }
                 ]
                }
               ]
              }
             }
            ]
           }
          }
         }
        ]
       }
      ],
      "deprecated_v1": {
       "bind_to_port": false
      },
      "listener_filters_timeout": "0.100s",
      "traffic_direction": "OUTBOUND",
      "continue_on_listener_filters_timeout": true
     },
     "last_updated": "2019-10-30T16:26:39.203Z"
    },
...

我已经构建了一个函数来创建一个 envoy.filters.thrift.rate_limit 过滤器,它使 Envoy 能够调用我设置的速率限制服务(我已经尝试了 GoogleGrpcEnvoyGrpc):

func buildThriftRatelimit(ratelimitServiceUri, domain string) *thrift_ratelimit.RateLimit {
    var thriftRateLimit  *thrift_ratelimit.RateLimit
    timeout := 2000 * time.Millisecond

    thriftRateLimit = &thrift_ratelimit.RateLimit{
        Domain: domain,
        Timeout: &timeout,
        FailureModeDeny: false,
        RateLimitService: &ratelimit.RateLimitServiceConfig{
            GrpcService: &core.GrpcService{
                TargetSpecifier: &core.GrpcService_GoogleGrpc_{
                    GoogleGrpc: &core.GrpcService_GoogleGrpc{
                        StatPrefix: ratelimitServiceUri,
                        TargetUri:  ratelimitServiceUri,
                    },
                },
            },
        },
    }

    thriftRateLimit.Validate()
    if err := thriftRateLimit.Validate(); err != nil {
        panic(err)
    }

    return thriftRateLimit
}

产生:

...
       {
        "filters": [
         {
          "name": "envoy.filters.network.thrift_proxy",
          "typed_config": {
           "@type": "type.googleapis.com/envoy.config.filter.network.thrift_proxy.v2alpha1.ThriftProxy",
           "stat_prefix": "10.97.28.169_9090",
           "transport": "HEADER",
           "protocol": "BINARY",
           "route_config": {
            "name": "outbound|9090||backend.default.svc.cluster.local",
            "routes": [
             {
              "match": {
               "method_name": ""
              },
              "route": {
               "cluster": "outbound|9090||backend.default.svc.cluster.local",
               "rate_limits": [
                {
                 "actions": [
                  {
                   "request_headers": {
                    "header_name": ":method-name",
                    "descriptor_key": "method-name"
                   }
                  }
                 ]
                }
               ]
              }
             }
            ]
           },
           "thrift_filters": [
            {
             "name": "envoy.filters.thrift.rate_limit",
             "typed_config": {
              "@type": "type.googleapis.com/envoy.config.filter.thrift.rate_limit.v2alpha1.RateLimit",
              "domain": "backend.default.svc.cluster.local",
              "timeout": "2s",
              "rate_limit_service": {
               "grpc_service": {
                "google_grpc": {
                 "target_uri": "istio-lyft-ratelimit.istio-system.svc.cluster.local:80",
                 "stat_prefix": "istio-lyft-ratelimit.istio-system.svc.cluster.local:80"
                }
               }
              }
             }
            }
           ]
          }
         }
        ]
       }
      ],
      "deprecated_v1": {
       "bind_to_port": false
      },
      "listener_filters_timeout": "0.100s",
      "traffic_direction": "OUTBOUND",
      "continue_on_listener_filters_timeout": true
     },
     "last_updated": "2019-10-30T16:26:39.203Z"
    },
...

当应用速率限制过滤器时,与后端的连接会中断,不会向客户端返回错误或显示在 Envoy 的日志中。

【问题讨论】:

    标签: istio envoyproxy


    【解决方案1】:

    如果提供了 Thrift 过滤器,则需要将 Router 过滤器添加为链中的最后一个过滤器,如下所示:

    ...
           {
            "filters": [
             {
              "name": "envoy.filters.network.thrift_proxy",
              "typed_config": {
               "@type": "type.googleapis.com/envoy.config.filter.network.thrift_proxy.v2alpha1.ThriftProxy",
               "stat_prefix": "10.97.28.169_9090",
               "transport": "HEADER",
               "protocol": "BINARY",
               "route_config": {
                "name": "outbound|9090||backend.default.svc.cluster.local",
                "routes": [
                 {
                  "match": {
                   "method_name": ""
                  },
                  "route": {
                   "cluster": "outbound|9090||backend.default.svc.cluster.local",
                   "rate_limits": [
                    {
                     "actions": [
                      {
                       "request_headers": {
                        "header_name": ":method-name",
                        "descriptor_key": "method-name"
                       }
                      }
                     ]
                    }
                   ]
                  }
                 }
                ]
               },
               "thrift_filters": [
                {
                 "name": "envoy.filters.thrift.rate_limit",
                 "typed_config": {
                  "@type": "type.googleapis.com/envoy.config.filter.thrift.rate_limit.v2alpha1.RateLimit",
                  "domain": "backend.default.svc.cluster.local",
                  "timeout": "2s",
                  "rate_limit_service": {
                   "grpc_service": {
                    "google_grpc": {
                     "target_uri": "istio-lyft-ratelimit.istio-system.svc.cluster.local:80",
                     "stat_prefix": "istio-lyft-ratelimit.istio-system.svc.cluster.local:80"
                    }
                   }
                  }
                 }
                },
                {
                 "name": "envoy.filters.thrift.router"
                }
               ]
              }
             }
            ]
           }
          ],
          "deprecated_v1": {
           "bind_to_port": false
          },
          "listener_filters_timeout": "0.100s",
          "traffic_direction": "OUTBOUND",
          "continue_on_listener_filters_timeout": true
         },
         "last_updated": "2019-10-30T16:26:39.203Z"
        },
    ...
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多