ASM通过ASMLocalRateLimiter CRD实现本地限流的声明式配置。本文介绍ASMLocalRateLimiter的配置示例和字段说明。
配置示例
示例一:网关限流
以下配置表示对网关进行限流,从流量入口处进行限流,防止下游服务被压垮。设置seconds为1,quota为100,表示1s内发放100个令牌,即网关1s内最多处理100个请求。
配置中的limit.quota只针对单个网关实例生效,若网关有n个实例,test1该路由对应的后端服务限流阈值则为n * quota,若调整了网关实例个数,需要对应调整限流阈值。
示例二:客户端限流
本示例需要实例版本≥1.25.6.74。
以下示例限制了 sleep 应用 10 秒内只能请求一次 httpbin 服务。
示例三:服务端限流
本示例需要实例版本≥1.25.6.74。
以下示例限制了 httpbin 应用 10 秒内只能被访问一次。
示例四:Waypoint限流
以下示例限制了名为default的 waypoint 10 秒内只能转发一个请求至 httpbin 服务。
本示例仅适用于Ambient模式,且需要实例版本≥1.25.6.74。
字段说明
apiVersion
- 若ASM实例版本为1.15.3.105及以上,支持使用 - apiVersion: istio.alibabacloud.com/v1。若您在ACK集群进行了相关配置,请将对应的ASMLocalRateLimiter CRD中的- apiVersion: istio.alibabacloud.com/v1beta1修改为- apiVersion: istio.alibabacloud.com/v1,再重新进行部署。
- 若ASM实例版本为1.15.3.105以下,支持使用 - apiVersion: istio.alibabacloud.com/v1beta1。
spec
spec字段配置说明如下。关于ASMLocalRateLimiter的功能介绍和使用示例,请参见为入口网关配置本地限流。
| 字段 | 类型 | 是否必须 | 说明 | 
| workloadSelector | map<string, string> | 是 | 通过一个或多个标签,指明限流配置生效的一组特定的Pod。标签搜索的范围限制在资源所在的配置命名空间。更多信息,请参见Workload Selector。 | 
| isGateway | bool | 否 | 是否作用于网关,默认为 | 
| configs | 是 | 本地限流配置,可配置多条。 | |
| applyToTraffic | string | 否 | 限流策略应用的流量类型。可选参数: 
 默认值为 说明  该字段仅支持ASM 1.25及以上版本。 | 
LocalRateLimiterConfig
| 字段 | 类型 | 是否必须 | 说明 | 
| name | string | 是 | 单条限流配置的名称。 | 
| match | 是 | 匹配条件。 | |
| limit | 是 | 限流阈值配置。 | |
| limit_overrides | 否 | 限流阈值覆盖配置。可通过该字段针对特定的请求指定单独的限流阈值。支持配置多个覆盖配置。 说明  仅支持ASM 1.19.0及以上版本。 | |
| target_services | 否 | 限流策略作用的服务。 说明  该字段仅支持ASM 1.25及以上版本。 | 
TargetServiceRef
此类型字段仅支持ASM 1.25及以上版本。
| 字段 | 类型 | 是否必须 | 说明 | 
| kind | string | 否 | 限流策略作用的服务 kind。可选值: 
 默认为 | 
| name | string | 是 | 限流策略作用的服务名称。 | 
| namespace | string | 否 | 限流策略作用的服务所处的命名空间。默认为您定义的限流策略所处命名空间。 | 
| port | int32 | 否 | 限流策略作用的服务端口。 | 
| section_name | string | 否 | 服务的额外属性,当前只对 
 | 
示例一
以下示例定义了 default 命名空间的 httpbin Service 的 8000 端口上。
target_services:
- kind: Service
  namespace: default
  name: httpbin
  port: 8000示例二
当前实例中存在如下 ServiceEntry。
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: se-httpbin-external
spec:
  hosts:
  - httpbin.test.com
  location: MESH_EXTERNAL
  ports:
  - name: http
    number: 80
    protocol: HTTP
  - name: https
    number: 443
    protocol: HTTPS
  resolution: DNS以下策略将生效于该 ServiceEntry 的 80 端口上。
target_services:
- kind: ServiceEntry
  namespace: default
  name: se-httpbin-external
  port: 80示例三
当前实例中存在以下 VirtualService。
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: vs-httpbin
spec:
  hosts:
  - httpbin.test.com
  http:
  - name: default
    route:
    - destination:
        host: httpbin
        port:
          number: 8000以下策略将生效与 VirtualService 中定义的 http 名为 default 的路由规则上。
target_services:
- kind: VirtualService
  namespace: default
  name: vs-httpbin
  section_name: defaultRemoteAddressMatcher
| 字段 | 类型 | 说明 | |
| distinct | bool | 否 | 是否根据请求的不同源 IP 分别限流,如果 说明  该字段仅支持ASM 1.25及以上版本。 | 
RatelimitMatch
| 字段 | 类型 | 是否必须 | 说明 | 
| vhost | 否 | VirtualHost匹配条件。 | 
LimitConfig
| 字段 | 类型 | 是否必须 | 说明 | 
| status | int | 否 | 自定义被限流时的HTTP响应代码,当请求被限流后,该响应代码被返回,默认值为429,该值必须>=400。 说明  支持此字段需ASM版本 >= 1.24.6.64 | 
| fill_interval | Duration | 否 | 令牌填充时间单位,例如 | 
| quota | int | 否 | 令牌数量,必须为整数,例如:1000。 | 
| per_downstream_connection | bool | 否 | 指定速率限制器的令牌桶的范围。默认为 取值说明如下: 
 说明  仅支持ASM 1.13.4及以上版本。 | 
| custom_response_body | string | 否 | 当请求被限制时,自定义返回Body内容。 说明  仅支持ASM 1.13.4及以上版本。 | 
| response_header_to_add | map[string]string | 否 | 当请求被限制时,自定义添加Header内容。 说明  仅支持ASM 1.13.4及以上版本。 | 
RateLimitOverrideConfig
| 字段 | 类型 | 是否必须 | 说明 | 
| request_match | 是 | 限流阈值覆盖配置指定的请求匹配条件。只有匹配条件的请求会应用覆盖配置中的限流阈值。 | |
| limit | 是 | 限流阈值覆盖配置指定的请求限流阈值。 说明  当在限流阈值覆盖配置(RateLimitOverrideConfig)中声明limit字段时,只有fill_interval和quota字段生效,其它字段(per_downstream_connection、custom_response_body、response_header_to_add)与LocalRateLimiterConfig.limit字段中的声明保持一致。 | 
VirtualHostMatch
| 字段 | 类型 | 是否必须 | 说明 | 
| name | string | 是 | 匹配的 | 
| port | int | 否 | 匹配的请求端口。 | 
| route | 否 | 匹配的请求接口对应的路由名称。 | 
RouteMatch
| 字段 | 类型 | 是否必须 | 说明 | 
| name_match | string | 否 | 匹配的路由名称,对应 | 
| header_match | 否 | 匹配服务请求的header,支持配置多个。 重要  在ASM 1.19.0及以上版本,该字段被标注为废弃(Deprecated),请使用RateLimitOverrideConfig对请求进行匹配。 | 
RequestMatcher
RequestMatcher中的多个字段可以同时使用。同时使用时,请求必须同时符合每个字段的匹配条件才会被匹配。
| 字段 | 类型 | 是否必须 | 说明 | 
| header_match | 否 | 匹配请求的header,支持配置多个。 | |
| query_match | 否 | 匹配请求的查询参数(query params),支持配置多个。 | 
HeaderMatcher
| 字段 | 类型 | 是否必须 | 说明 | |
| name | string | 否 | Header名称。 | |
| 任选其一 | regex_match | string | 否 | 正则表达式匹配。 | 
| exact_match | string | 否 | 精确匹配。 | |
| prefix_match | string | 否 | 前缀匹配,以什么开头进行匹配。 | |
| suffix_match | string | 否 | 后缀匹配,以什么结尾进行匹配。 | |
| present_match | bool | 否 | 
 | |
| invert_match | bool | 否 | 默认为false。 
 | |
| distinct | bool | 否 | 是否为相同请求头的不同值分别分配限流 bucket,如果distinct设为true,不能使用其他 match 类型。 说明  该字段仅支持ASM 1.25及以上版本。 | |
QueryParameterMatcher
| 字段 | 类型 | 是否必须 | 说明 | |
| name | string | 是 | 查询参数的名称。 | |
| 任选其一 | exact_match | string | 否 | 精确匹配查询参数的内容。 | 
| prefix_match | string | 否 | 前缀匹配查询参数的内容。 | |
| suffix_match | string | 否 | 后缀匹配查询参数的内容。 | |
| regex_match | string | 否 | 正则表达式匹配查询参数的内容。 | |
| contains_match | string | 否 | 包含匹配查询参数的内容,即要求查询参数的内容必须包含某个子串。 | |
| present_match | bool | 否 | 
 | |
| ignore_case | bool | 否 | 是否在匹配查询参数时忽略大小写。 | |