Debugging istio rate limiting handler

9

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 curlPods 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 demoProfil 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.

Reut Sharabani
quelle
+1, ich kann auch nichts mit 1.4.2 & memquota auf einem einfachen kubeadm clean cluster zum Laufen bringen. Ich habe viel Zeit damit verbracht, ohne Erfolg zu debuggen. Würde gerne auch hier einige Antworten sehen. Ich werde ein Kopfgeld starten.
gertvdijk
Ich habe schon das größte Kopfgeld gesetzt. Es ist abgelaufen.
Reut Sharabani

Antworten:

2

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.

Sateesh Valluru
quelle
1
Vielen Dank! Das ist zu alt und wir haben istio fallen lassen (teilweise aus diesem Grund). Ich werde Ihnen jedoch das Kopfgeld geben, wenn Sie auf einen Hinweis hinweisen, warum dies nicht funktioniert: github.com/istio/istio/issues/19139
Reut Sharabani