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 curl
vagens 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 demo
perfil com disablePolicyChecks: false
para 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.
Respostas:
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.
fonte