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指定限流器和限流器所使用的令牌桶的各项参数。
字段 | 类型 | 是否必选 | 说明 |
fill_amount | double | 是 | 每次向令牌桶中填充令牌时、填充的令牌数量。通过与RateLimiterParameters中的interval相结合,可以实现对请求的限流控制。 |
bucket_capacity | double | 是 | 限流器使用的令牌桶容量上限。当请求速率小于令牌桶填充速率时,令牌桶内的令牌数量会持续增加,最大将达到 |
parameters | 是 | 限流器的配置参数。 | |
request_parameters | 否 | 限流器的请求操作配置,可选。 | |
selectors | []Selector | 是 | 基于选择器来选择限流生效的具体请求流。 |
RateLimiterParameters
RateLimiterParameters是限流器的配置参数。
字段 | 类型 | 是否必选 | 说明 |
interval | Duration | 是 | 限流器每次填充令牌的时间间隔,例如 |
limit_by_label_key | string | 否 | 指定限流策略使用什么请求标签进行分组,指定后,不同标签的请求将分别进行限流,拥有相互独立的令牌桶。关于如何指定请求标签,请参见请求标签说明。 |
continuous_fill | bool | 否 | 指定限流器是否平滑地填充令牌桶。当指定为true时,限流器将会在interval指定的时间段内持续地向令牌桶中填充fill_amount个令牌,而不是每过interval指定的时间便立即填充fill_amount个令牌。默认为true。 |
delay_initial_fill | bool | 否 | 是否在限流策略配置后延迟填充令牌桶。当设置为 |
lazy_sync | 否 | 限流器的延迟同步能力配置。 | |
max_idle_time | Duration | 否 | 当配置 |
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: alice
和isProduction: false
两个请求标签。