Manipulador de limitação de taxa de istio de depuração


9

Estou tentando aplicar a limitação de taxa em alguns de nossos serviços internos (dentro da malha).

Usei o exemplo dos documentos e gerou configurações de limitação de taxa de redis que incluem um manipulador (redis), instância de cota, especificação de cota, ligação de especificação de cota e regra para aplicar o manipulador.

Este manipulador 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

A instância da cota (estou interessado apenas em limitar por destino no momento):

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"

Uma especificação de cota, cobrando 1 por solicitação, se eu entendi corretamente:

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

Uma especificação de ligação de cota que todos os serviços participantes buscam previamente. Eu também tentei com o service: "*"que também não fez nada.

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

Uma regra para aplicar o manipulador. Atualmente em todas as ocasiões (tentei com correspondências, mas não mudou nada também):

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

As definições do VirtualService são bastante semelhantes para todos os participantes:

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

  http:
  - route:
    - destination:
        host: s1

O problema é que nada realmente acontece e não ocorre nenhuma limitação de taxa. Testei com curlvagens dentro da malha. A instância redis está vazia (sem chaves no db 0, que eu assumo ser o que a limitação da taxa usaria), então eu sei que ela não pode praticamente limitar a taxa de nada.

O manipulador parece estar configurado corretamente (como posso ter certeza?) Porque havia alguns erros relatados no misturador (política). Ainda existem alguns erros, mas nenhum que eu associo a esse problema ou à configuração. A única linha na qual o manipulador de redis é mencionada é esta:

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

Mas não está claro se é um problema ou não. Presumo que não.

Estas são as demais linhas da recarga assim que eu implantar:

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"

Estou usando o demoperfil com disablePolicyChecks: falsepara ativar a limitação de taxa. Isso está na versão 1.4.0, implantada no EKS.

Também tentei o memquota (este é o nosso ambiente de preparação) com limites baixos e nada parece funcionar. Eu nunca recebi um 429, não importa o quanto excedesse o limite de taxa configurado.

Não sei como depurar isso e ver onde a configuração está errada, fazendo com que ela não faça nada.

Qualquer ajuda é apreciada.


+1, também não consigo trabalhar com o 1.4.2 & memquota no cluster limpo do kubeadm. Passei uma quantidade significativa de tempo para depurar sem sucesso. Gostaria muito de ver algumas respostas aqui também. Vou começar uma recompensa.
— gertvdijk

Eu coloquei a maior recompensa já. Expirou.
— Reut Sharabani

Respostas:


2

Também passei horas tentando decifrar a documentação e obter uma amostra funcionando.

De acordo com a documentação, eles recomendaram a ativação de verificações de política:

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

No entanto, quando isso não funcionou, fiz um "despejo de perfil istioctl", procurei por políticas e tentei várias configurações.

Usei a instalação do Helm e passei o seguinte e, em seguida, consegui obter o comportamento descrito:

--set global.disablePolicyChecks = false \ --set values.pilot.policy.enabled = true \ ===> isso fez funcionar, mas não está nos documentos.


11
Obrigado! Isso é muito antigo e descartamos o istio (parcialmente por causa disso). No entanto, vou dar a você a recompensa por apontar alguma pista sobre por que isso não está funcionando: github.com/istio/istio/issues/19139
— Reut Sharabani
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.