Kubernetes Istio Envoy - 通过 HTTP 方法进行速率限制

Kubernetes Istio Envoy - Rate Limiting by HTTP Method

我们正在使用 this documentation 中指定的基于 Istio Envoy 的速率限制(使用 Kubernetes 和 Docker)。

虽然我能够在 Kubernetes 集群中设置本地和全局速率限制,但我无法实现以下目标:

  1. 仅对 POST 请求限制服务速率,而 GET 请求应不受阻碍地通过。

  2. 仅在特定时间段(例如美国东部标准时间上午 9 点到下午 5 点)对服务进行速率限制,其他时间正常工作。

在当前的 Istio 功能中是否可以实现上述功能?

下面我会尽量回答你的两个问题。

1。仅针对特定请求方法对服务进行速率限制

我们可以使用 header_value_match 速率限制操作。

我创建了一个 rate_limits filter 和一个 action 匹配任何使用方法 GET:
的请求 注意:为了简单起见,我只给出了配置的重要部分。

Envoy rate_limits 过滤器配置:

...
        value:
          rate_limits:
            - actions:
              - header_value_match:
                  descriptor_value: get
                  headers:
                  - name: :method
                    prefix_match: GET
...

接下来,我创建了一个 ratelimit service configuration 来匹配具有键 header_match 和值 get 的描述符。它将提供每分钟 1 个请求的限制:

...
    descriptors:
      - key: header_match
        rate_limit:
          unit: minute
          requests_per_unit: 1
        value: get
...

应用上述配置后,我们可以查看是否可以在1分钟内多次使用GET方法:

$ curl "http://$GATEWAY_URL/productpage" -I -X GET
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 5179
server: istio-envoy
date: Tue, 11 Jan 2022 09:57:33 GMT
x-envoy-upstream-service-time: 120


$ curl "http://$GATEWAY_URL/productpage" -I -X GET
HTTP/1.1 429 Too Many Requests
x-envoy-ratelimited: true
date: Tue, 11 Jan 2022 09:57:35 GMT
server: istio-envoy
content-length: 0

正如我们所见,在第二次请求之后,我们收到了 HTTP 429 Too Many Requests 响应状态代码,这表明用户在给定时间内发送了太多请求。这意味着一切都按预期工作。

我建议您阅读 Understanding Envoy Rate Limits 文章,其中包含很多有用的信息。

2。仅在特定时间段(例如美国东部标准时间上午 9 点至下午 5 点)对服务进行速率限制,并在其他时间正常工作。

不幸的是,我找不到任何合适的选项来配置此行为。我认为 CronJob 可以用作一种变通方法,它将 运行 按给定的时间表定期 create/delete 负责速率限制的适当配置。简而言之,您可以使用一个 Bash 脚本,该脚本 creates/deletes 一个负责速率限制的配置,然后您可以将该脚本挂载到 CronJob Pod 的一个卷中。 CronJob here 的类似用法我已经介绍过了,相信可以帮到你。