istio 限流在官网的位置是 任务->策略执行->使用 Envoy 启用速率限制
istio 限流基于数据面 Envoy 开发,Envoy 支持两个类型限流,分别是本地限流和全局限流(本地限流和全局限流可以一起使用)
开始之前
- 安装 istio
- 部署 bookinfo 应用,参考 istio 专栏文章
本地限流
概念
- 配置为单实例,例如当 replicaset 设置为3,token_bucket 为3时,每个 pod 都可以处理3个请求,总共9个请求,与全局限流不一样
- 不依赖任何外部后端(无需调用其他服务)
- 基于 令牌桶机制,支持四层对连接的限制和七层对请求数的限制
- 令牌桶算法是一种限制发送到服务端的请求数量的方法,基于一定数量的令牌桶。存储桶以恒定的速
率不断填充令牌,当向服务发送请求时,会从存储桶中删除一个令牌。如果存储桶为空,则请求将被
拒绝。通常需要指定以下内容:- 桶被填充的速率(填充间隔)
- 每个填充间隔添加到桶中的令牌数
- 令牌桶算法是一种限制发送到服务端的请求数量的方法,基于一定数量的令牌桶。存储桶以恒定的速
demo 测试
- 部署官网提供的 demo
- 创建本地限流的 envoyfilter 文件
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:name: filter-local-ratelimit-svcnamespace: mm-xianliu
spec:workloadSelector:labels:app: productpageconfigPatches:- applyTo: HTTP_FILTERmatch:context: SIDECAR_INBOUNDlistener:filterChain:filter:name: "envoy.filters.network.http_connection_manager"patch:operation: INSERT_BEFOREvalue:name: envoy.filters.http.local_ratelimittyped_config:"@type": type.googleapis.com/udpa.type.v1.TypedStructtype_url: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimitvalue:stat_prefix: http_local_rate_limitertoken_bucket:max_tokens: 3tokens_per_fill: 3fill_interval: 30sfilter_enabled: # 启用runtime_key: local_rate_limit_enableddefault_value:numerator: 100denominator: HUNDREDfilter_enforced: # 强制执行runtime_key: local_rate_limit_enforceddefault_value:numerator: 100denominator: HUNDREDresponse_headers_to_add: # 被限流流量添加 header- append: falseheader:key: x-local-rate-limitvalue: 'true'
其中 filter_enabled
表示添启用本地限流功能,filter_enforced
表示强制执行本地限流,response_headers_to_add
表示被限流的流量的 response 中会加上这个 header
filter_enabled 和 filter_enforced 需要一起使用
例如,设置令牌桶的数量为3,允许30s 内3最多三次访问,第四次访问失败时会在 response 中添加 x-local-rate-limit: true
的 header