Ограничение комиссионных с посланником - PullRequest
1 голос
/ 30 октября 2019

Я расширяю Istio для предоставления функций Thrift. Компонентом Istio, над которым я сейчас работаю, является Pilot (служба конфигурации Envoy). Я расширил его базовой маршрутизацией Thrift, чтобы он мог предоставить конфигурацию Envoy для маршрутизации слушателя в правильный кластер. Моя среда разработки выглядит примерно так:

enter image description here

Теперь я пытаюсь добавить ограничение скорости. Я следую за документами . Я пропатчил мою конфигурацию с помощью 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, который заставляет Посланника вызывать настроенную мной службу ограничения скорости (пробовал и GoogleGrpc и EnvoyGrpc):

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"
    },
...

Когда применяется фильтр ограничения скорости, соединения с бэкэндом умирают и ошибки не возвращаютсяклиенту или отображается в логах посланника.

1 Ответ

1 голос
/ 30 октября 2019

Если предусмотрены фильтры 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"
    },
...
...