web-dev-qa-db-fra.com

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

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

J'ai utilisé l'exemple de la documentation 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 souhaite pour l'instant limiter que par destination):

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 curl à partir de pods à l'intérieur du maillage. L'instance de redis est vide (pas de clé 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 profil demo avec disablePolicyChecks: false pour 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 obtenu 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.

9
Reut Sharabani

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.

2
Sateesh Valluru