Kubernetes Istio Envoy - 通过 HTTP 方法进行速率限制
Kubernetes Istio Envoy - Rate Limiting by HTTP Method
我们正在使用 this documentation 中指定的基于 Istio Envoy 的速率限制(使用 Kubernetes 和 Docker)。
虽然我能够在 Kubernetes 集群中设置本地和全局速率限制,但我无法实现以下目标:
仅对 POST 请求限制服务速率,而 GET 请求应不受阻碍地通过。
仅在特定时间段(例如美国东部标准时间上午 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 的类似用法我已经介绍过了,相信可以帮到你。
我们正在使用 this documentation 中指定的基于 Istio Envoy 的速率限制(使用 Kubernetes 和 Docker)。
虽然我能够在 Kubernetes 集群中设置本地和全局速率限制,但我无法实现以下目标:
仅对 POST 请求限制服务速率,而 GET 请求应不受阻碍地通过。
仅在特定时间段(例如美国东部标准时间上午 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 的类似用法我已经介绍过了,相信可以帮到你。