ASMLocalRateLimiter CRD说明

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

配置示例

示例一:网关限流

以下配置表示对网关进行限流,从流量入口处进行限流,防止下游服务被压垮。设置seconds1quota100,表示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: 1000nanos表示纳秒。

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_intervalquota字段生效,其它字段(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

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