ASM通過ASMLocalRateLimiter CRD實現本地限流的聲明式配置。本文介紹ASMLocalRateLimiter的配置示例和字段說明。
配置示例
以下配置表示對網關進行限流,從流量入口處進行限流,防止下游服務被壓垮。設置seconds
為1
,quota
為100
,表示1s內發放100個令牌,即網關1s內最多處理100個請求。
配置中的limit.quota
只針對單個網關實例生效,若網關有n個實例,test1該路由對應的后端服務限流閾值則為n * quota,若調整了網關實例個數,需要對應調整限流閾值。
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
字段說明
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 | 否 | 是否作用于網關,默認為 |
configs | 是 | 本地限流配置,可配置多條。 |
LocalRateLimiterConfig
字段 | 類型 | 是否必須 | 說明 |
name | string | 是 | 單條限流配置的名稱。 |
match | 是 | 匹配條件。 | |
limit | 是 | 限流閾值配置。 | |
limit_overrides | 否 | 限流閾值覆蓋配置。可通過該字段針對特定的請求指定單獨的限流閾值。支持配置多個覆蓋配置。 說明 僅支持ASM 1.19.0及以上版本。 |
RatelimitMatch
字段 | 類型 | 是否必須 | 說明 |
vhost | 否 | VirtualHost匹配條件。 |
LimitConfig
字段 | 類型 | 是否必須 | 說明 |
fill_interval | Duration | 否 | 令牌填充時間單位,例如 |
quota | int | 否 | 令牌數量,必須為整數,例如:1000。 |
per_downstream_connection | bool | 否 | 指定速率限制器的令牌桶的范圍。默認為 取值說明如下:
說明 僅支持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 | 是 | 限流閾值覆蓋配置指定的請求匹配條件。只有匹配條件的請求會應用覆蓋配置中的限流閾值。 | |
limit | 是 | 限流閾值覆蓋配置指定的請求限流閾值。 說明 當在限流閾值覆蓋配置(RateLimitOverrideConfig)中聲明limit字段時,只有fill_interval和quota字段生效,其它字段(per_downstream_connection、custom_response_body、response_header_to_add)與LocalRateLimiterConfig.limit字段中的聲明保持一致。 |
VirtualHostMatch
字段 | 類型 | 是否必須 | 說明 |
name | string | 是 | 匹配的 |
port | int | 否 | 匹配的請求端口。 |
route | 否 | 匹配的請求接口對應的路由名稱。 |
RouteMatch
字段 | 類型 | 是否必須 | 說明 |
name_match | string | 否 | 匹配的路由名稱,對應 |
header_match | 否 | 匹配服務請求的header,支持配置多個。 重要 在ASM 1.19.0及以上版本,該字段被標注為廢棄(Deprecated),請使用RateLimitOverrideConfig對請求進行匹配。 |
RequestMatcher
RequestMatcher中的多個字段可以同時使用。同時使用時,請求必須同時符合每個字段的匹配條件才會被匹配。
字段 | 類型 | 是否必須 | 說明 |
header_match | 否 | 匹配請求的header,支持配置多個。 | |
query_match | 否 | 匹配請求的查詢參數(query params),支持配置多個。 |
HeaderMatcher
字段 | 類型 | 是否必須 | 說明 | |
name | string | 否 | Header名稱。 | |
任選其一 | regex_match | string | 否 | 正則表達式匹配。 |
exact_match | string | 否 | 精確匹配。 | |
prefix_match | string | 否 | 前綴匹配,以什么開頭進行匹配。 | |
suffix_match | string | 否 | 后綴匹配,以什么結尾進行匹配。 | |
present_match | bool | 否 |
| |
invert_match | bool | 否 | 默認為false。
|
QueryParameterMatcher
字段 | 類型 | 是否必須 | 說明 | |
name | string | 是 | 查詢參數的名稱。 | |
任選其一 | exact_match | string | 否 | 精確匹配查詢參數的內容。 |
prefix_match | string | 否 | 前綴匹配查詢參數的內容。 | |
suffix_match | string | 否 | 后綴匹配查詢參數的內容。 | |
regex_match | string | 否 | 正則表達式匹配查詢參數的內容。 | |
contains_match | string | 否 | 包含匹配查詢參數的內容,即要求查詢參數的內容必須包含某個子串。 | |
present_match | bool | 否 |
| |
ignore_case | bool | 否 | 是否在匹配查詢參數時忽略大小寫。 |