Ich versuche, für einige unserer internen Services (innerhalb des Netzes) eine Ratenbegrenzung anzuwenden.
Ich habe das Beispiel aus den Dokumenten verwendet und Redis-Ratenbegrenzungskonfigurationen generiert, die einen (Redis-) Handler, eine Kontingentinstanz, eine Kontingentspezifikation, eine Quotenspezifikationsbindung und eine Regel zum Anwenden des Handlers enthalten.
Dieser Redis-Handler:
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
Die Kontingentinstanz (ich bin momentan nur daran interessiert, sie nach Ziel zu beschränken):
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"
Eine Quotenspezifikation, die 1 pro Anfrage berechnet, wenn ich das richtig verstehe:
apiVersion: config.istio.io/v1alpha2
kind: QuotaSpec
metadata:
name: request-count
namespace: istio-system
spec:
rules:
- quotas:
- charge: 1
quota: requestcountquota
Eine Kontingentbindungsspezifikation, die alle teilnehmenden Dienste vorab abrufen. Ich habe auch versucht, mit service: "*"
dem auch nichts gemacht hat.
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
Eine Regel zum Anwenden des Handlers. Derzeit bei allen Gelegenheiten (versucht mit Streichhölzern, hat aber auch nichts geändert):
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
name: quota
namespace: istio-system
spec:
actions:
- handler: redishandler
instances:
- requestcountquota
Die VirtualService-Definitionen sind für alle Teilnehmer ziemlich ähnlich:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: s1
spec:
hosts:
- s1
http:
- route:
- destination:
host: s1
Das Problem ist, dass nichts wirklich passiert und keine Ratenbegrenzung stattfindet. Ich habe mit curl
Pods innerhalb des Netzes getestet . Die Redis-Instanz ist leer (keine Schlüssel in Datenbank 0, von denen ich annehme, dass sie von der Ratenbegrenzung verwendet werden), daher weiß ich, dass sie praktisch keine Ratenbegrenzung bewirken kann.
Der Handler scheint richtig konfiguriert zu sein (wie kann ich das sicherstellen?), Da ich einige Fehler hatte, die im Mixer (Richtlinie) gemeldet wurden. Es gibt immer noch einige Fehler, aber keine, die ich mit diesem Problem oder der Konfiguration in Verbindung bringe. Die einzige Zeile, in der der Redis-Handler erwähnt wird, ist folgende:
2019-12-17T13:44:22.958041Z info adapters adapter closed all scheduled daemons and workers {"adapter": "redishandler.istio-system"}
Aber es ist unklar, ob es ein Problem ist oder nicht. Ich nehme an, es ist nicht.
Dies sind die restlichen Zeilen des Neuladens nach der Bereitstellung:
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"
Ich verwende das demo
Profil mit disablePolicyChecks: false
, um die Ratenbegrenzung zu aktivieren. Dies ist auf istio 1.4.0, das auf EKS bereitgestellt wird.
Ich habe auch Memquota (dies ist unsere Staging-Umgebung) mit niedrigen Grenzwerten ausprobiert und nichts scheint zu funktionieren. Ich habe nie einen 429 bekommen, egal wie viel ich über das konfigurierte Ratenlimit hinausgegangen bin.
Ich weiß nicht, wie ich das debuggen und sehen soll, wo die Konfiguration falsch ist, was dazu führt, dass nichts unternommen wird.
Jede Hilfe wird geschätzt.
Antworten:
Auch ich habe stundenlang versucht, die Dokumentation zu entschlüsseln und ein Beispiel zum Laufen zu bringen.
Gemäß der Dokumentation wurde empfohlen, Richtlinienprüfungen zu aktivieren:
https://istio.io/docs/tasks/policy-enforcement/rate-limiting/
Wenn dies jedoch nicht funktionierte, führte ich einen "istioctl profile dump" durch, suchte nach Richtlinien und versuchte mehrere Einstellungen.
Ich habe Helm install verwendet und Folgendes bestanden und konnte dann das beschriebene Verhalten erhalten:
--set global.disablePolicyChecks = false \ --set values.pilot.policy.enabled = true \ ===> Damit hat es funktioniert, aber es ist nicht in den Dokumenten enthalten.
quelle