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 curl
vainas 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 demo
perfil con disablePolicyChecks: false
para 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.
Respuestas:
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.
fuente