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
兩個請求標籤。