我正在尝试对我们的一些内部服务(网格内部)应用速率限制。
我使用了文档中的示例并生成了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无论我去了多少超过率限制配置。
我不知道如何调试它,看配置哪里出错,导致它什么也不做。
任何帮助都很感激。
我也花了数小时试图破译文档,并让一个样本工作。
根据留档,他们建议我们启用策略检查:
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