Istio 1.4.10是否可通过自定义EnvoyFilter实现本地限流?
Istio 1.4.10 本地限流实现结论
完全可以通过自定义 EnvoyFilter 的方式实现本地限流,不需要依赖版本自带的 Redis 全局限流能力,可直接替换原有 Nginx 限流方案。
实现原理
Istio 1.4.10 版本配套的 Sidecar Envoy 已经内置了envoy.filters.http.local_ratelimit原生HTTP本地限流过滤器,只是Istio官方未在该版本将该能力封装为高层流量治理API,可通过EnvoyFilter手动将该过滤器注入到Sidecar的过滤器链中实现能力启用。
配置示例
以下是适配Istio 1.4.10版本的可用EnvoyFilter配置:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: service-local-ratelimit namespace: 目标服务所在命名空间 spec: workloadLabels: app: 目标服务的标签值 filters: - listenerMatch: listenerType: SIDECAR_INBOUND # 限制进入服务的入口流量用该值,限制服务调用外部的出口流量改为SIDECAR_OUTBOUND portNumber: 服务监听端口 filterName: envoy.filters.http.local_ratelimit filterType: HTTP insertPosition: index: BEFORE relativeTo: envoy.filters.http.router filterConfig: stat_prefix: http_local_rate_limiter # 令牌桶配置,以下示例为单Pod 1000QPS限流 token_bucket: max_tokens: 1000 tokens_per_fill: 1000 fill_interval: 1s # 全量开启限流统计 filter_enabled: default_value: numerator: 100 denominator: HUNDRED # 全量执行限流动作 filter_enforced: default_value: numerator: 100 denominator: HUNDRED # 限流触发时返回的响应头 response_headers_to_add: - append: false header: key: x-ratelimit-limit value: "1000" - append: false header: key: x-ratelimit-remaining value: "%LOCAL_RATELIMIT_REMAINING%" # 触发限流时返回429状态码 status: code: 429
注意事项
- 该方案实现的是单Sidecar实例级别的限流,服务整体限流阈值为单Pod配置阈值乘以服务副本数,适合替换原Nginx单实例限流场景;如果需要集群维度的精准全局限流,仍需使用官方提供的Redis全局限流方案。
- 配置下发后可执行
istioctl proxy-config listeners <目标Pod名称> -n <命名空间> -o json检查对应监听器的过滤器链,确认本地限流过滤器已插入到envoy.filters.http.router之前,否则规则不会生效。 - 如需针对特定请求路径、请求头、来源服务做差异化限流,可在
filterConfig下新增rate_limits匹配规则,语法与Envoy原生本地限流规则完全一致。 - 建议将本地限流过滤器插入到鉴权、遥测类过滤器之后,避免被限流的无效请求产生额外的鉴权计算、监控统计开销。
内容的提问来源于stack exchange,提问作者reperion
相关产品推荐
相关产品推荐

