RateLimitingPolicy CRD说明

RateLimitingPolicy是服务网格ASM流量调度套件提供的一种预置策略,可以用声明式的方式对网格内服务的全局流量配置限流。本文介绍RateLimitingPolicy的字段说明。

配置示例

以下配置表示为Kubernetes集群中的httpbin Service进行限流,限流使用的令牌桶每30秒填充两个令牌(即每30秒允许两个请求),令牌桶内的令牌数量上限为两个(即不容忍突发流量);同时,基于请求的user_id请求头对请求进行分组限流,带有不同user_id请求头的请求会各自独立地计算是否限流,消耗各自独立的令牌桶中的令牌。

apiVersion: istio.alibabacloud.com/v1
kind: RateLimitingPolicy
metadata:
  name: ratelimit
  namespace: istio-system
spec:
  rate_limiter:
    bucket_capacity: 2
    fill_amount: 2
    parameters:
      interval: 30s
      limit_by_label_key: http.request.header.user_id
    selectors:
    - agent_group: default
      control_point: ingress
      service: httpbin.default.svc.cluster.local

RateLimitingPolicy字段说明

RateLimitingPolicy定义了ASM流量调度套件中的一个全局限流策略,指定了限流生效的服务、限流策略的运行参数、以及限流使用的令牌桶的属性。

RateLimitingPolicySpec

RateLimitingPolicySpec是RateLimitingPolicy的核心配置,即spec字段的部分。

字段

类型

是否必选

说明

rate_limiter

RateLimiter

指定执行限流策略的限流器的配置。

RateLimiter

RateLimiter指定限流器和限流器所使用的令牌桶的各项参数。

字段

类型

是否必选

说明

fill_amount

double

每次向令牌桶中填充令牌时、填充的令牌数量。通过与RateLimiterParameters中的interval相结合,可以实现对请求的限流控制。

bucket_capacity

double

限流器使用的令牌桶容量上限。当请求速率小于令牌桶填充速率时,令牌桶内的令牌数量会持续增加,最大将达到bucket_capacity。使用bucket_capacity可以容许一定程度的突发流量。将bucket_capacity设置成与fill_amount相同可以禁止突发流量在短时间内超过限流速率。

parameters

RateLimiterParameters

限流器的配置参数。

request_parameters

RateLimiterRequestParameters

限流器的请求操作配置,可选。

selectors

[]Selector

基于选择器来选择限流生效的具体请求流。

RateLimiterParameters

RateLimiterParameters是限流器的配置参数。

字段

类型

是否必选

说明

interval

Duration

限流器每次填充令牌的时间间隔,例如 30s表示30秒间隔填充一次令牌。

limit_by_label_key

string

指定限流策略使用什么请求标签进行分组,指定后,不同标签的请求将分别进行限流,拥有相互独立的令牌桶。关于如何指定请求标签,请参见请求标签说明

continuous_fill

bool

指定限流器是否平滑地填充令牌桶。当指定为true时,限流器将会在interval指定的时间段内持续地向令牌桶中填充fill_amount个令牌,而不是每过interval指定的时间便立即填充fill_amount个令牌。默认为true。

delay_initial_fill

bool

是否在限流策略配置后延迟填充令牌桶。当设置为false时,令牌桶会在收到第一个请求时立刻充满,这会使得一开始接收的流量速率可能超出限流配置。默认为false

lazy_sync

RateLimiterParametersLazySync

限流器的延迟同步能力配置。

max_idle_time

Duration

当配置limit_by_label_key时生效。指定当带有某个标签的请求持续没有到来时,该标签对应的令牌桶在释放前的最长等待时间。默认为7200s

RateLimiterRequestParameters

RateLimiterRequestParameters指定了限流器对请求进行操作的自定义配置。

字段

类型

是否必选

说明

denied_response_status_code

int

当限流发生时,可以使用此字段覆盖默认响应的HTTP 429状态码。

tokens_label_key

string

使用此字段可以覆盖请求消耗的令牌数量。当请求带有指定的标签时,将用该标签内的数字消耗令牌桶内令牌的指定数量。

RateLimiterParametersLazySync

RateLimiterParametersLazySync指定了限流器的延迟同步能力相关的配置参数,延迟同步是ASM流量调度套件中限流器的一种能力。在未开启延迟同步的情况下,对于每个请求,envoy都会和远程的agent进行同步以判断是否限流,这可以实现针对单个服务的精准限流。当延迟同步开启时,envoy会在本地进行限流决策,并定期与远程agent进行同步,这会降低限流的精准度、但可以加快限流决策,减少请求延迟。

字段

类型

是否必选

说明

enabled

bool

是否开启延迟同步能力,默认为false。

num_sync

int

在interval指定的时间内,envoy和远程agent同步限流数量的次数。默认为4。

请求标签说明

在ASM流量调度套件中,请求标签是一系列表示请求特征或分类的键值对,可以基于请求的标签对不同请求进行针对性的调度。例如,可根据特定请求标签对请求进行分组,每组请求分别使用独立的令牌桶进行限流。一个请求可以从多种来源获取标签。包括请求元数据和Baggage的标签。

请求元数据

对于每个HTTP请求,HTTP请求的各项基础元数据将自动转化为请求的一系列标签。HTTP请求的元数据与请求标签的对应关系如下:

  • http.method:HTTP请求的方法,例如POST

  • http.flavor:HTTP请求的协议版本,例如1.1

  • http.host:HTTP请求的域名,例如httpbin.default.svc.cluster.local

  • http.target:HTTP请求的路径名,例如/get

  • http.request_content_length:HTTP请求的请求体大小,例如431

  • http.request.header.header_name:HTTP请求头中名为header_name的请求头。例如http.request.header.user_agent代表user_agent请求头。

Baggage

Baggage是OpenTelemetry推出的一种标准化机制,旨在实现分布式系统调用链路中跨进程传递上下文信息。它通过在HTTP头部增加名为“Baggage”的字段实现,字段值为键值对格式,可传递租户ID、追踪ID、安全凭证等上下文数据,支持链路追踪、日志关联等功能而无需修改代码。例如:

baggage: userId=alice,isProduction=false

当请求携带Baggage时,Baggae中的每个键值对将自动转化为同名的请求标签。例如上文示例中的Baggage将转化为userId: aliceisProduction: false两个请求标签。