ASM通过ASMLocalRateLimiter CRD实现本地限流的声明式配置。本文介绍ASMLocalRateLimiter的配置示例和字段说明。
配置示例
以下配置表示对网关进行限流,从流量入口处进行限流,防止下游服务被压垮。设置seconds
为1
,quota
为100
,表示1s内发放100个令牌,即网关1s内最多处理100个请求。
配置中的limit.quota
只针对单个网关实例生效,若网关有n个实例,test1该路由对应的后端服务限流阈值则为n * quota,若调整了网关实例个数,需要对应调整限流阈值。
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMLocalRateLimiter
metadata:
name: for-api-test
namespace: default
spec:
workloadSelector:
labels:
app: istio-ingressgateway
isGateway: true
configs:
- match:
vhost:
name: "www.example1.com" # 如果gateway中配置了多个host域名,填写最后一个即可。
port: 80
route:
name_match: "test1" # VirtualService路由配置中对应route的name,若VirtualService路由配置下没有对应name的路由,则不生效。
limit:
fill_interval:
seconds: 1
quota: 10
- match:
vhost:
name: "www.example2.com"
port: 80
route:
name_match: "test1"
limit:
fill_interval:
seconds: 1
quota: 100
字段说明
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 | 是 | 本地限流配置,可配置多条。 |
LocalRateLimiterConfig
字段 | 类型 | 是否必须 | 说明 |
name | string | 是 | 单条限流配置的名称。 |
match | 是 | 匹配条件。 | |
limit | 是 | 限流阈值配置。 | |
limit_overrides | 否 | 限流阈值覆盖配置。可通过该字段针对特定的请求指定单独的限流阈值。支持配置多个覆盖配置。 说明 仅支持ASM 1.19.0及以上版本。 |
RatelimitMatch
字段 | 类型 | 是否必须 | 说明 |
vhost | 否 | VirtualHost匹配条件。 |
LimitConfig
字段 | 类型 | 是否必须 | 说明 |
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。
|
QueryParameterMatcher
字段 | 类型 | 是否必须 | 说明 | |
name | string | 是 | 查询参数的名称。 | |
任选其一 | exact_match | string | 否 | 精确匹配查询参数的内容。 |
prefix_match | string | 否 | 前缀匹配查询参数的内容。 | |
suffix_match | string | 否 | 后缀匹配查询参数的内容。 | |
regex_match | string | 否 | 正则表达式匹配查询参数的内容。 | |
contains_match | string | 否 | 包含匹配查询参数的内容,即要求查询参数的内容必须包含某个子串。 | |
present_match | bool | 否 |
| |
ignore_case | bool | 否 | 是否在匹配查询参数时忽略大小写。 |