【问题标题】:Istio (envoy) rate limits for matching the absence of a headerIstio (envoy) 匹配没有标头的速率限制
【发布时间】:2021-10-12 11:46:32
【问题描述】:

我们希望实现envoyFilters,它允许我们对所有没有特定标头的流量应用每分钟最多 20 个请求的本地速率限制。想法是限制对所有应缺少标头 x-user-auth: some_value 的未经过身份验证的用户的请求量。

所有请求都来自同一个 Kubernetes 服务,并且来自不同/未确定的来源。我们没有使用任何 Istio ingressgateway,但作为这些请求电路一部分的所有 pod 都注入了​​ Istio sidecar 代理。

如何做到这一点?

【问题讨论】:

    标签: istio envoyproxy


    【解决方案1】:

    我没有使用本地速率限制,而是作为我们的速率限制器的外部服务 - 我在本文中更详细地描述了它:https://domagalski-j.medium.com/istio-rate-limits-for-egress-traffic-8697df490f68

    所以就我而言,这只是调整envoy actions 的问题。我已将其从 generic_key 更改为 request_headers - 正如您在 docs 中看到的那样,request_headers 有一个选项:skip_if_absent - 如果留空,则如果给定的标头未附加到请求,则不会将请求转发到速率限制器服务。 您正在尝试对没有特定标头的所有内容进行速率限制,因此 "header_value_match" 操作可能更适合您,因为它具有您可以使用的“expect_match”字段。

    这是我在 istio 中使用的 EnvoyFilter:

    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: route-httpbin
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: bastion-box
      configPatches:
        - applyTo: HTTP_ROUTE
          match:
            context: SIDECAR_OUTBOUND
            routeConfiguration:
              vhost:
                name: "httpbin.org:80"
                route:
                  name: "default"
          patch:
            operation: MERGE
            value:
              route:
                rate_limits:
                  - actions:
                      - request_headers:
                          header_name: "X-Client-Id"
                          descriptor_key: "clientId"
                      - request_headers:
                          header_name: "X-Credential-Username"
                          descriptor_key: "username"
    

    我还发现这篇文章对理解 envoy 过滤器很有帮助: https://www.aboutwayfair.com/tech-innovation/understanding-envoy-rate-limits

    【讨论】:

      【解决方案2】:

      查看 Envoy 的速率限制服务documentation,没有明显的方法可以根据标头限制请求速率。

      但是,使用 Istio 的 Request RoutingRate Limits 可以实现这样的配置。
      创建route based on user identity匹配头

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      ...
      spec:
        hosts:
        - foo
        http:
        - match:
          - headers:
              x-user-auth:
                exact: <some_value>
          route:
          - destination:
              host: foo
              subset: bar
        - route:
          - destination:
              host: foo
              subset: baz
      

      并使用local rate limiting 创建服务。

      希望此配置将带有x-user-auth 标头的请求重定向到非受限服务(bar),并将其他所有人重定向到受限服务(baz)。

      【讨论】:

      • 这是我们试图避免的一种方法,我们可以说是“纯”速率限制。如果我们不能让它变得艰难,那肯定是我们的首选。我们正在尝试遵循此文档envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/…,同时使用此处描述的“header_value_match”:envoyproxy.io/docs/envoy/latest/api-v3/config/route/v3/… 你怎么看?这可行吗?
      • 如果我理解正确,它会首先将标头x-test-rate-limit(根据示例)添加到没有x-user-auth 的请求中,然后根据x-test-rate-limit 限制费率。这与我建议的相反,但它应该可以工作。但是,我的知识不够丰富,无法为您提供示例配置。
      • 我仍在尝试理解它,但我认为x-test-rate-limit 是在应用 ratelimit 时添加的,而使用 expect_match 为 false 会将限制应用于与某个标题键/值不匹配的任何内容.看来我还有很多阅读要做:(
      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多