Отладка обработчика ограничения скорости istio

9

Я пытаюсь применить ограничение скорости для некоторых наших внутренних сервисов (внутри сетки).

Я использовал пример из документации и сгенерировал конфигурации ограничения скорости 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

Спецификация привязки квоты, которую все участвующие сервисы предварительно выбирают. Я тоже пытался с service: "*"чем тоже ничего не делал.

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, который, я полагаю, использовал бы ограничение скорости), поэтому я знаю, что он практически ничего не может ограничить.

Кажется, что обработчик настроен правильно (как я могу убедиться?), Потому что в нем были некоторые ошибки, о которых сообщалось в микшере (policy). Есть все еще некоторые ошибки, но ни одной, которые я связываю с этой проблемой или конфигурацией. Единственная строка, в которой упоминается обработчик 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профиль с, disablePolicyChecks: falseчтобы включить ограничение скорости. Это на istio 1.4.0, развернутом на EKS.

Я также пробовал использовать memquota (это наша промежуточная среда) с низкими пределами, и, похоже, ничего не получалось. Я никогда не получал 429 независимо от того, сколько я превысил настроенный предел скорости.

Я не знаю, как отладить это и посмотреть, где конфигурация не так, заставляя его ничего не делать.

Любая помощь приветствуется.

Реут Шарабани
источник
+1, я также не могу заставить что-либо работать с 1.4.2 и memquota на чистом кластере kubeadm. Я потратил значительное количество времени на отладку безрезультатно. Хотелось бы увидеть здесь некоторые ответы. Я начну щедрость.
gertvdijk
Я положил самую большую награду уже. Это истекло.
Реут Шарабани

Ответы:

2

Я тоже часами пытался расшифровать документацию и получить образец работы.

Согласно документации, они рекомендовали включить проверку политики:

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

Однако, когда это не сработало, я сделал «сброс профиля istioctl», искал политику и попробовал несколько настроек.

Я использовал Helm install и передал следующее, а затем смог получить описанное поведение:

--set global.disablePolicyChecks = false \ --set values.pilot.policy.enabled = true \ ===> это заставило его работать, но его нет в документации.

Сатиш Валлуру
источник
1
Спасибо! Это слишком старо, и мы упали istio (частично из-за этого). Я дам вам награду за указание на то, почему это не работает: github.com/istio/istio/issues/19139
Реут Шарабани