envoy&istio 对接ratelimit 实现限流之envoy配置
envoy与ratelimit对接需要完成两步,1 启用ratelimit 过滤器,2 配置触发条件。
一、启用ratelimit 过滤器
envoy要与ratelimit服务对接,需要在lds的http_filter配置上启用ratelimit filter,启用方式如下
1 http_filters: 2 - name: envoy.filters.http.ratelimit 3 typed_config: 4 "@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit 5 domain: rl 6 request_type: external 7 stage: 0 8 rate_limited_as_resource_exhausted: true 9 failure_mode_deny: false 10 enable_x_ratelimit_headers: DRAFT_VERSION_03 11 rate_limit_service: 12 grpc_service: 13 envoy_grpc: 14 cluster_name: ratelimit 15 transport_api_version: V3 16 - name: envoy.filters.http.router 17 typed_config: 18 "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
对于七层协议,router filter一定要放在最后!
添加限流过滤器,指定限流服务器、domain、request_type
domain 与限流服务中定义的domain 保持一致,不一致不会报错,限流配置会失效。
request_type: 什么类型的请求使用限流服务,支持的配置 internal、external、both
判断规则,请求头中x-envoy-internal为true 则请求类型为internal,如果request_type 设置为external则不应用限流,反之亦然。
当request_type设置为both时 所有请求都应用限流(不一定触发,后面还有触发设置)
enableXRatelimitHeaders: 启用限流响应头类型,即当请求被限流后,envoy网关会在响应头中添加标头
X-RateLimit-Limit-:指示当前时间窗口中与客户端关联的请求配额,后跟配额策略的描述,例如:10, 10;w=1;name="per-ip", 1000;w=3600
X-RateLimit-Remaining-:当前时间窗口内剩余请求数量
X-RateLimit_Rest-: 限流重置剩余秒
完整配置如下图所示
二、配置触发规则
1 - match: 2 prefix: /test/testlimit/ 3 route: 4 cluster: k8s_proxy 5 rateLimits: 6 - actions: 7 - requestHeaders: 8 headerName: :path 9 descriptorKey: abc 10 - actions: 11 - requestHeaders: 12 headerName: :path 13 descriptorKey: minute100 14 - actions: 15 - requestHeaders: 16 headerName: userid 17 descriptorKey: userid 18 - requestHeaders: 19 headerName: :path 20 descriptorKey: path 21 - actions: 22 - requestHeaders: 23 headerName: userid 24 descriptorKey: useridminute 25 - requestHeaders: 26 headerName: :path 27 descriptorKey: path
在vhds的路由配置中添加如上配置
该配置设置在路由层面,详细描述限流触发规则,每个actions 是同级别的代表它们同时生效。
actions内部是规则链,顺序很重要,例如示例中的 第三个actions 它触发的规则是 userid_useridvalue_path_pathvalue
参考地址 https://www.envoyproxy.io/docs/envoy/v1.28.0/api-v3/config/route/v3/route_components.proto#envoy-v3-api-msg-config-route-v3-ratelimit
特别备注
1. 对于每个请求,如果满足限流规则,envoy会将触发的key一次性传递给限流服务。
2. 如果限流服务不可用,则envoy直接放过请求,不做限流
3. 触发规则的统计是累加的,如果要放宽限制,要考虑累加的超限数量。 例如 10次/小时,如果超限了,客户端仍旧访问了100次即当前小时内该接口/服务被访问了110次/小时,业务找运维放宽限制至100次/小时,这个时候客户端访问依旧超限