ASMLocalRateLimiter CRD说明

更新时间:
复制 MD 格式

ASM通过ASMLocalRateLimiter CRD实现本地限流的声明式配置。本文介绍ASMLocalRateLimiter的配置示例和字段说明。

配置示例

示例一:网关限流

以下配置表示对网关进行限流,从流量入口处进行限流,防止下游服务被压垮。设置seconds为1,quota为100,表示1s内发放100个令牌,即网关1s内最多处理100个请求。

说明

配置中的limit.quota只针对单个网关实例生效,若网关有n个实例,test1该路由对应的后端服务限流阈值则为n * quota,若调整了网关实例个数,需要对应调整限流阈值。

展开查看YAML内容

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

示例二:客户端限流

说明

本示例需要实例版本≥1.25.6.74。

以下示例限制了 sleep 应用 10 秒内只能请求一次 httpbin 服务。

展开查看YAML内容

apiVersion: istio.alibabacloud.com/v1
kind: ASMLocalRateLimiter
metadata:
  name: client-limit
spec:
  configs:
    - limit:
        custom_response_body: '{"ret_code": xxx, "message": "Your request be limited" }'
        fill_interval:
          seconds: 10
        quota: 1
      target_services:
      - name: httpbin
        port: 8000
  applyToTraffic: sidecar_outbound
  workloadSelector:
    labels:
      app: sleep

示例三:服务端限流

说明

本示例需要实例版本≥1.25.6.74。

以下示例限制了 httpbin 应用 10 秒内只能被访问一次。

展开查看YAML内容

apiVersion: istio.alibabacloud.com/v1
kind: ASMLocalRateLimiter
metadata:
  name: server-limit
spec:
  configs:
    - limit:
        custom_response_body: '{"ret_code": xxx, "message": "Your request be limited" }'
        fill_interval:
          seconds: 10
        quota: 1
      target_services:
      - name: httpbin
        port: 8000
  applyToTraffic: sidecar_inbound
  workloadSelector:
    labels:
      app: httpbin

示例四:Waypoint限流

以下示例限制了名为default的 waypoint 10 秒内只能转发一个请求至 httpbin 服务。

本示例仅适用于Ambient模式,且需要实例版本≥1.25.6.74。

展开查看YAML内容

apiVersion: istio.alibabacloud.com/v1
kind: ASMLocalRateLimiter
metadata:
  name: waypoint-limit
spec:
  configs:
    - limit:
        custom_response_body: '{"ret_code": xxx, "message": "Your request be limited" }'
        fill_interval:
          seconds: 10
        quota: 1
      target_services:
      - name: httpbin
        port: 8000
  applyToTraffic: waypoint
  workloadSelector:
    labels:
      gateway.networking.k8s.io/gateway-name: default

字段说明

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

否

是否作用于网关,默认为false。

configs

LocalRateLimiterConfig[]

是

本地限流配置,可配置多条。

applyToTraffic

string

否

限流策略应用的流量类型。可选参数:

  • sidecar_inbound:sidecar入向流量,即挂载了sidecar的应用作为服务端接收的流量。

  • sidecar_outbound:sidecar出向流量,即挂载了sidecar的应用作为客户端发送的流量。

  • waypoint:Ambient模式下,通过Waypoint处理的流量。

  • gateway:网关流量。

默认值为sidecar_inbound。

说明

该字段仅支持ASM 1.25及以上版本。

LocalRateLimiterConfig

字段

类型

是否必须

说明

name

string

是

单条限流配置的名称。

match

RatelimitMatch

是

匹配条件。

limit

LimitConfig

是

限流阈值配置。

limit_overrides

RateLimitOverrideConfig[]

否

限流阈值覆盖配置。可通过该字段针对特定的请求指定单独的限流阈值。支持配置多个覆盖配置。

说明

仅支持ASM 1.19.0及以上版本。

target_services

TargetServiceRef[]

否

限流策略作用的服务。

说明

该字段仅支持ASM 1.25及以上版本。

TargetServiceRef

说明

此类型字段仅支持ASM 1.25及以上版本。

字段

类型

是否必须

说明

kind

string

否

限流策略作用的服务 kind。可选值:

  • Service

  • ServiceEntry

  • VirtualService

默认为Service。

name

string

是

限流策略作用的服务名称。

namespace

string

否

限流策略作用的服务所处的命名空间。默认为您定义的限流策略所处命名空间。

port

int32

否

限流策略作用的服务端口。

section_name

string

否

服务的额外属性,当前只对VirtualService生效。

  • VirtualService:取值为VirtualService中定义的 route 名称。

示例一

以下示例定义了 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: default

RemoteAddressMatcher

字段

类型

是否必须

说明

distinct

bool

否

是否根据请求的不同源 IP 分别限流,如果distinct设为true,不能填写 address。

说明

该字段仅支持ASM 1.25及以上版本。

RatelimitMatch

字段

类型

是否必须

说明

vhost

VirtualHostMatch

否

VirtualHost匹配条件。

LimitConfig

字段

类型

是否必须

说明

status

int

否

自定义被限流时的HTTP响应代码,当请求被限流后,该响应代码被返回,默认值为429,该值必须>=400。

说明

支持此字段需ASM版本 >= 1.24.6.64

fill_interval

Duration

否

令牌填充时间单位,例如seconds: 1或者nanos: 1000。nanos表示纳秒。

quota

int

否

令牌数量,必须为整数,例如:1000。

per_downstream_connection

bool

否

指定速率限制器的令牌桶的范围。默认为false。

取值说明如下:

  • false:令牌桶将在所有工作线程共享,速率限制将应用于每个Envoy进程。

  • true:为每个连接分配一个令牌桶,速率限制适用于每个连接,允许在每个连接的基础上对请求进行速率限制。

说明

仅支持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

RequestMatcher

是

限流阈值覆盖配置指定的请求匹配条件。只有匹配条件的请求会应用覆盖配置中的限流阈值。

limit

LimitConfig

是

限流阈值覆盖配置指定的请求限流阈值。

说明

当在限流阈值覆盖配置(RateLimitOverrideConfig)中声明limit字段时,只有fill_interval和quota字段生效,其它字段(per_downstream_connection、custom_response_body、response_header_to_add)与LocalRateLimiterConfig.limit字段中的声明保持一致。

VirtualHostMatch

字段

类型

是否必须

说明

name

string

是

匹配的VirtualHost名称。

port

int

否

匹配的请求端口。

route

RouteMatch

否

匹配的请求接口对应的路由名称。

RouteMatch

字段

类型

是否必须

说明

name_match

string

否

匹配的路由名称,对应VirtualService下的单条路由名称。

header_match

HeaderMatcher[]

否

匹配服务请求的header,支持配置多个。

重要

在ASM 1.19.0及以上版本,该字段被标注为废弃(Deprecated),请使用RateLimitOverrideConfig对请求进行匹配。

RequestMatcher

说明

RequestMatcher中的多个字段可以同时使用。同时使用时,请求必须同时符合每个字段的匹配条件才会被匹配。

字段

类型

是否必须

说明

header_match

HeaderMatcher[]

否

匹配请求的header,支持配置多个。

query_match

QueryParameterMatcher[]

否

匹配请求的查询参数(query params),支持配置多个。

HeaderMatcher

字段

类型

是否必须

说明

name

string

否

Header名称。

任选其一

regex_match

string

否

正则表达式匹配。

exact_match

string

否

精确匹配。

prefix_match

string

否

前缀匹配,以什么开头进行匹配。

suffix_match

string

否

后缀匹配,以什么结尾进行匹配。

present_match

bool

否

  • 配置为true,表示存在Header即可,无需关注Header Value的取值。

  • 配置为false,表示不存在Header。

invert_match

bool

否

默认为false。

  • 配置为true,表示上述匹配结果取反。

  • 配置为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

否

  • 配置为true,表示进行存在性匹配,即存在指定的查询参数即可,不关注内容。

  • 不能配置false,配置为false等同于不配置,需要指定其他匹配条件。

ignore_case

bool

否

是否在匹配查询参数时忽略大小写。