当前位置: 首页 > 知识库问答 >
问题:

调试istio速率限制处理程序

司徒骞尧
2023-03-14

我正在尝试对我们的一些内部服务(网格内部)应用速率限制。

我使用了文档中的示例并生成了redis速率限制配置,其中包括(redis)处理程序、配额实例、配额规范、配额规范绑定和应用处理程序的规则。

此redis处理程序:

apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
  name: redishandler
  namespace: istio-system
spec:
  compiledAdapter: redisquota
  params:
    redisServerUrl: <REDIS>:6379
    connectionPoolSize: 10
    quotas:
    - name: requestcountquota.instance.istio-system
      maxAmount: 10
      validDuration: 100s
      rateLimitAlgorithm: FIXED_WINDOW
      overrides:
      - dimensions:
          destination: s1
        maxAmount: 1
      - dimensions:
          destination: s3
        maxAmount: 1
      - dimensions:
          destination: s2
        maxAmount: 1

配额实例(目前我只对按目的地限制感兴趣):

apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
  name: requestcountquota
  namespace: istio-system
spec:
  compiledTemplate: quota
  params:
    dimensions:
      destination: destination.labels["app"] | destination.service.host | "unknown"

配额规格,如果我理解正确,每个请求收费1:

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

所有参与服务预取的配额绑定规范。我还尝试了服务:“*”,但也没有任何效果。

apiVersion: config.istio.io/v1alpha2
kind: QuotaSpecBinding
metadata:
  name: request-count
  namespace: istio-system
spec:
  quotaSpecs:
  - name: request-count
    namespace: istio-system
  services:
  - name: s2
    namespace: default
  - name: s3
    namespace: default
  - name: s1
    namespace: default
    # - service: '*'  # Uncomment this to bind *all* services to request-count

应用处理程序的规则。目前在所有情况下(尝试匹配,但也没有改变任何内容):

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

所有参与者的VirtualService定义都非常相似:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: s1
spec:
  hosts:
  - s1

  http:
  - route:
    - destination:
        host: s1

问题是什么都没有发生,也没有限速。我从网格内的豆荚中使用curl进行测试。redis实例是空的(db 0上没有键,我假设这是速率限制将使用的),所以我知道它实际上不能限制任何速率。

处理程序似乎配置正确(如何确保?)因为我在混音器(策略)中报告了一些错误。仍然存在一些错误,但没有一个与此问题或配置相关。提到redis处理程序的唯一一行是:

2019-12-17T13:44:22.958041Z info    adapters    adapter closed all scheduled daemons and workers    {"adapter": "redishandler.istio-system"}   

但不清楚这是否是个问题。我想不是。

这些是我部署后重新加载的其余行:

2019-12-17T13:44:22.601644Z info    Built new config.Snapshot: id='43'
2019-12-17T13:44:22.601866Z info    adapters    getting kubeconfig from: "" {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.601881Z warn    Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
2019-12-17T13:44:22.602718Z info    adapters    Waiting for kubernetes cache sync...    {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.903844Z info    adapters    Cache sync successful.  {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.903878Z info    adapters    getting kubeconfig from: "" {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.903882Z warn    Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
2019-12-17T13:44:22.904808Z info    Setting up event handlers
2019-12-17T13:44:22.904939Z info    Starting Secrets controller
2019-12-17T13:44:22.904991Z info    Waiting for informer caches to sync
2019-12-17T13:44:22.957893Z info    Cleaning up handler table, with config ID:42
2019-12-17T13:44:22.957924Z info    adapters    deleted remote controller   {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.957999Z info    adapters    adapter closed all scheduled daemons and workers    {"adapter": "prometheus.istio-system"}
2019-12-17T13:44:22.958041Z info    adapters    adapter closed all scheduled daemons and workers    {"adapter": "redishandler.istio-system"}   
2019-12-17T13:44:22.958065Z info    adapters    shutting down daemon... {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.958050Z info    adapters    shutting down daemon... {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.958096Z info    adapters    shutting down daemon... {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:22.958182Z info    adapters    shutting down daemon... {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:44:23.958109Z info    adapters    adapter closed all scheduled daemons and workers    {"adapter": "kubernetesenv.istio-system"}
2019-12-17T13:55:21.042131Z info    transport: loopyWriter.run returning. connection error: desc = "transport is closing"
2019-12-17T14:14:00.265722Z info    transport: loopyWriter.run returning. connection error: desc = "transport is closing"

我使用的demo配置文件与disablePolcyChecks: false启用速率限制。这是在istio 1.4.0上,部署在EKS上。

我还尝试了限制较低的memequetu(这是我们的登台环境),似乎没有任何效果。我从来没有得到一个429无论我去了多少超过率限制配置。

我不知道如何调试它,看配置哪里出错,导致它什么也不做。

任何帮助都很感激。

共有1个答案

解河
2023-03-14

我也花了数小时试图破译文档,并让一个样本工作。

根据留档,他们建议我们启用策略检查:

https://istio.io/docs/tasks/policy-enforcement/rate-limiting/

然而,当这不起作用时,我做了一个“istioctl配置文件转储”,搜索策略,并尝试了一些设置。

我使用了Helm install并通过了以下测试,然后能够获得所描述的行为:

--设置全局。disablePolicyChecks=false\--设置值。飞行员政策启用=真\===

 类似资料:
  • 我们必须为Istio配置速率限制。我们正在使用istio 1.6。提供的所有示例都具有基于标头的速率限制。我们是否可以对所有请求限制我们的应用程序,而不考虑标题。像istio一样,应该限制所有用户在一分钟内访问应用程序超过500次。

  • 通过应用以下脚本,我无法看到istio 1.7中应用的速率限制。 除此之外,我还部署了istio bookinfo示例应用程序 已配置到此应用的istio入口网关路由 当我通过应用相关的速率限制标头通过入口网关访问应用程序时 它一直给我200个OK响应,不管我应用它多少次,尽管应用的rimit是每分钟2个请求。 此外,当我试图在redis中查看数据时,在那里看不到任何数据。 任何人都将不胜感激。

  • 速率限制配置参考 filter.http.RateLimit filter.http.RateLimit proto { "domain": "...", "stage": "...", "request_type": "...", "timeout": "{...}" } domain (string, REQUIRED) 需要调用速率限制服务时的域。 stage (uint3

  • 速率限制配置参考。 filter.network.RateLimit filter.network.RateLimit proto { "stat_prefix": "...", "domain": "...", "descriptors": [], "timeout": "{...}" } stat_prefix (string, REQUIRED) 发布统计信息时使用的前缀。

  • 速率限制配置概述。 { "name": "rate_limit", "config": { "domain": "...", "stage": "...", "request_type": "...", "timeout_ms": "..." } } domain (required, string) 调用速率限制服务时使用的域。 stage (opt

  • 速率限制配置参考。 { "name": "ratelimit", "config": { "stat_prefix": "...", "domain": "...", "descriptors": [], "timeout_ms": "..." } } stat_prefix (required, string) 发布统计信息时使用的前缀。 domai