Depuración de controlador de limitación de velocidad

9

Estoy tratando de aplicar la limitación de velocidad en algunos de nuestros servicios internos (dentro de la malla).

Usé el ejemplo de los documentos y generé configuraciones de limitación de velocidad de redis que incluyen un controlador (redis), instancia de cuota, especificación de cuota, enlace de especificación de cuota y regla para aplicar el controlador.

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

La instancia de cuota (solo estoy interesado en limitar por destino en este 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"

Una especificación de cuota, cobrando 1 por solicitud si entiendo correctamente:

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

Una especificación de enlace de cuota que todos los servicios participantes obtienen previamente. También probé con el service: "*"que tampoco hice 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

Una regla para aplicar el controlador. Actualmente en todas las ocasiones (probado con partidos pero no cambió nada también):

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

Las definiciones de VirtualService son bastante similares para todos los participantes:

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

  http:
  - route:
    - destination:
        host: s1

El problema es que nada sucede realmente y no se produce una limitación de velocidad. Probé con curlvainas dentro de la malla. La instancia de redis está vacía (no hay claves en db 0, que supongo es lo que usaría la limitación de velocidad), así que sé que prácticamente no puede limitar nada.

El controlador parece estar configurado correctamente (¿cómo puedo asegurarme?) Porque tenía algunos errores que se informaron en el mezclador (política). Todavía hay algunos errores pero ninguno que asocio a este problema o la configuración. La única línea en la que se menciona el controlador de redis es esta:

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

Pero no está claro si es un problema o no. Supongo que no.

Estas son el resto de las líneas de la recarga una vez que despliegue:

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"

Estoy usando el demoperfil con disablePolicyChecks: falsepara habilitar la limitación de velocidad. Esto está en istio 1.4.0, implementado en EKS.

También probé memquota (este es nuestro entorno de preparación) con límites bajos y nada parece funcionar. Nunca obtuve un 429, no importa cuánto haya superado el límite de velocidad configurado.

No sé cómo depurar esto y ver dónde está mal la configuración haciendo que no haga nada.

Cualquier ayuda es apreciada.

Reut Sharabani
fuente
+1, tampoco logro que nada funcione con 1.4.2 y memquota en el clúster limpio de kubeadm. He pasado una cantidad significativa de tiempo para depurar en vano. Me encantaría ver algunas respuestas aquí también. Comenzaré una recompensa.
gertvdijk
Ya puse la mayor recompensa. Expiró.
Reut Sharabani

Respuestas:

2

Yo también pasé horas tratando de descifrar la documentación y hacer que funcione una muestra.

Según la documentación, recomendaron que habilitemos las comprobaciones de políticas:

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

Sin embargo, cuando eso no funcionó, hice un "volcado de perfil de istioctl", busqué la política e intenté varias configuraciones.

Utilicé Helm install y pasé lo siguiente y luego pude obtener el comportamiento descrito:

--set global.disablePolicyChecks = false \ --set values.pilot.policy.enabled = true \ ===> esto lo hizo funcionar, pero no está en los documentos.

Sateesh Valluru
fuente
1
¡Gracias! Esto es demasiado viejo y dejamos caer la istio (en parte debido a esto). Sin embargo, le daré la recompensa por señalar alguna pista de por qué esto no está funcionando: github.com/istio/istio/issues/19139
Reut Sharabani