Débogage du gestionnaire de limitation de débit istio

9

J'essaie d'appliquer une limitation de taux sur certains de nos services internes (à l'intérieur du maillage).

J'ai utilisé l'exemple des documents et généré des configurations de limitation de débit redis qui incluent un gestionnaire (redis), une instance de quota, une spécification de quota, une liaison de spécification de quota et une règle pour appliquer le gestionnaire.

Ce gestionnaire de 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

L'instance de quota (je ne suis intéressé que par la limitation par destination pour le moment):

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"

Une spécification de quota, facturant 1 par demande si je comprends bien:

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

Une spécification de liaison de quota que tous les services participants prélèvent. J'ai aussi essayé avec service: "*"qui n'a rien fait non plus.

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

Une règle pour appliquer le gestionnaire. Actuellement à toutes les occasions (essayé avec des matchs mais n'a rien changé aussi):

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

Les définitions de VirtualService sont assez similaires pour tous les participants:

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

  http:
  - route:
    - destination:
        host: s1

Le problème est que rien ne se passe vraiment et aucune limitation de taux n'a lieu. J'ai testé avec curldes pods à l'intérieur du maillage. L'instance de redis est vide (pas de clés sur db 0, ce que je suppose est ce que la limitation de débit utiliserait) donc je sais qu'elle ne peut pratiquement rien limiter.

Le gestionnaire semble être configuré correctement (comment puis-je m'assurer?) Car j'ai eu des erreurs qui ont été signalées dans le mélangeur (stratégie). Il y a encore quelques erreurs mais aucune que j'associe à ce problème ou à la configuration. La seule ligne dans laquelle le gestionnaire redis est mentionné est la suivante:

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

Mais ce n'est pas clair si c'est un problème ou non. Je suppose que ce n'est pas le cas.

Voici le reste des lignes du rechargement une fois que je déploie:

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"

J'utilise le demoprofil avec disablePolicyChecks: falsepour activer la limitation de débit. C'est sur istio 1.4.0, déployé sur EKS.

J'ai également essayé memquota (c'est notre environnement de mise en scène) avec des limites basses et rien ne semble fonctionner. Je n'ai jamais eu de 429, peu importe combien j'ai dépassé la limite de taux configurée.

Je ne sais pas comment déboguer cela et voir où la configuration est incorrecte, ce qui ne fait rien.

Toute aide est appréciée.

Reut Sharabani
la source
+1, je n'arrive pas non plus à faire fonctionner quoi que ce soit avec 1.4.2 & memquota sur un cluster propre kubeadm. J'ai passé beaucoup de temps à déboguer en vain. J'adorerais voir des réponses ici aussi. Je vais commencer une prime.
gertvdijk
J'ai déjà mis la plus grosse prime. Elle a expiré.
Reut Sharabani

Réponses:

2

Moi aussi, j'ai passé des heures à essayer de déchiffrer la documentation et de faire fonctionner un échantillon.

Selon la documentation, ils ont recommandé d'activer les vérifications de stratégie:

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

Cependant, lorsque cela n'a pas fonctionné, j'ai effectué un "vidage de profil istioctl", recherché la stratégie et essayé plusieurs paramètres.

J'ai utilisé l'installation de Helm et passé les éléments suivants, puis j'ai pu obtenir le comportement décrit:

--set global.disablePolicyChecks = false \ --set values.pilot.policy.enabled = true \ ===> cela l'a fait fonctionner, mais ce n'est pas dans la documentation.

Sateesh Valluru
la source
1
Je vous remercie! C'est trop vieux et nous avons abandonné l'istio (en partie à cause de cela). Je vais toutefois vous donner la prime pour avoir indiqué la
Reut Sharabani