8.6.2 速率限制配置

memquota适配器使用一个亚秒级分辨率的滑动窗口来实现速率限制。速率限制配置分为客户端和Mixer端两部分。

1.客户端

QuotaSpec定义客户端应该请求的配额名称和大小,如下所示:


apiVersion: config.istio.io/v1alpha2
kind: QuotaSpec
metadata:
  name: request-count
  namespace: istio-system
spec:
  rules:
  - quotas:
    - charge: 1
    quota: requestcount

QuotaSpecBinding有条件地将QuotaSpec与一个或多个服务相关联,如下所示:


apiVersion: config.istio.io/v1alpha2
kind: QuotaSpecBinding
metadata:
  name: request-count
  namespace: istio-system
spec:
  quotaSpecs:
  - name: request-count
    namespace: istio-system
  services:
  - name: server

2.Mixer端

quota实例定义了Mixer如何确定配额的大小。

内存配额适配器配置参数定义如表8-6所示。

表8-6 内存配额适配器配置参数

其中类型Quota定义了配额限制和持续时间,具体如表8-7所示。

表8-7 Quota定义的配额限制和持续时间

类型Override定义配额的覆盖值,如表8-8所示。如果没有覆盖值能够匹配特定配额请求,则使用配额的默认值。

表8-8 Override定义的配额覆盖值

适配器配置中的maxAmount设置了关联到quota实例中的所有计数器的默认限制。如果所有覆盖的条目都无法匹配到一个请求,就会使用maxAmount限制。memquota会选择适合请求的第一条进行覆盖。overrides的条目无需定义所有quota dimensions,示例如下:


apiVersion: "config.istio.io/v1alpha2"
kind: memquota
metadata:
  name: handler
  namespace: istio-system
spec:
  quotas:
  - name: requestcount.quota.istio-system
    maxAmount: 2
    validDuration: 1s
    overrides:
    - dimensions:
      destination: server
    maxAmount: 1
    validDuration: 5s

memquota adapter定义了memquota适配器配置。

每个命名的配额实例,例如下面的requestcount,都代表了一组计数器。这一个集合就是所有配额维度的笛卡尔积定义的。如果上一个expiration持续时间内的请求数量超过了maxAmount,Mixer,就会返回RESOURCE_EXHAUSTED信息给Envoy代理。Envoy代理则返回HTTP 429给调用方。


apiVersion: "config.istio.io/v1alpha2"
kind: quota
metadata:
  name: requestcount
  namespace: istio-system
spec:
  dimensions:
    source: source.labels["app"] | source.service | "unknown"
    sourceVersion: source.labels["version"] | "unknown"
    destination: destination.labels["app"] | destination.service | "unknown"
    destinationVersion: destination.labels["version"] | "unknown"

quota rule定义何时将配额实例分派给memquota适配器,如下所示:


apiVersion: "config.istio.io/v1alpha2"
kind: rule
metadata:
  name: quota
  namespace: istio-system
spec:
  actions:
  - handler: handler.memquota
    instances:
    - requestcount.quota

将以上YAML内容另存为mixer-rule-ratelimit.yaml,运行以下命令以使用memquota启用速率限制:


kubectl apply -f mixer-rule-ratelimit.yaml

memquota处理程序定义了2种不同的速率限制方案,默认情况下每秒请求限制为2次。如果destination值为server,限制值为每5秒1次。