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.

Reut Sharabani
fonte
+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.

Sateesh Valluru
fonte
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