Ingress Controller de Citrix ADC

Limitación de velocidad en Kubernetes mediante Citrix ADC

En una implementación de Kubernetes, puede limitar la velocidad de las solicitudes a los recursos en el servidor o los servicios back-end mediante la función de limitación de velocidad proporcionada por el Citrix ADC de entrada.

Citrix proporciona una CustomResourceDefinitions (CRD) de Kubernetes denominada CRD de límite de velocidad que puede usar con el Citrix Ingress Controller para configurar las configuraciones de limitación de velocidad en los ADC de Citrix que se utilizan como dispositivos de entrada.

Además de limitar la velocidad de las solicitudes a los servicios en un entorno de Kubernetes, también puede usar la CRD de límite de velocidad para la seguridad de la API. La CRD de límite de velocidad le permite limitar la solicitud de la API de REST a los servidores de la API o puntos finales de la API específicos en los servidores de la API. Supervisa y realiza un seguimiento de las solicitudes al servidor de la API o los puntos finales en relación con el límite permitido por intervalo de tiempo y, por lo tanto, protege de ataques como el ataque DDoS.

Puede habilitar el registro para la observabilidad con el CRD de límite de velocidad. Los registros se almacenan en Citrix ADC, que se pueden ver comprobando los registros mediante el comando shell. La ubicación del archivo se basa en la configuración de syslog. Por ejemplo, /var/logs/ns.log.

Definición de CRD de límite de velocidad

La especificación de CRD de límite de velocidad está disponible en el repositorio de GitHub del Citrix Ingress Controller en: ratelimit-crd.yaml. La CRD de límite de velocidad proporciona atributos para las diversas opciones que se requieren para definir las directivas de límite de velocidad en el Citrix ADC de entrada que actúa como puerta de enlace de API.

Atributos de CRD de límite

En la siguiente tabla se enumeran los diversos atributos proporcionados en la CRD de límite de tasa:

Atributo CRD Descripción
servicename La lista de servicios de Kubernetes a los que quieres aplicar las directivas de límite de tarifa.
selector_keys Las claves de selección de tráfico que filtran el tráfico para identificar las solicitudes de API contra las que se aplica y supervisa la limitación.
  Nota: El atributo selector_keys es opcional. Puede elegir configurar cero, una o más de las teclas de selección. Si se configuran más de una tecla selectora, se considera una expresión AND lógica.
  En esta versión de la CRD de límite de velocidad, selector_keys proporciona la sección de configuración basic que puede usar para configurar las siguientes funciones de tráfico de uso común como claves para supervisar y limitar los límites configurados:
  path: conjunto de prefijos de ruta de URL que hacen referencia a un punto de enlace de API específico. Por ejemplo, /api/v1/products/.
  method: conjunto de métodos HTTP. Los valores permitidos son GET, PUT, POST o DELETE.
  header_name: encabezado HTTP que tiene el identificador único de usuario o cliente de la API. Por ejemplo, X-apikey que viene con una clave API única que identifica al cliente de la API que envía la solicitud.
  per_client_ip: Le permite supervisar y aplicar el umbral configurado a cada solicitud de API recibida por dirección IP de cliente única.
req_threshold El número máximo de solicitudes que se permiten en un intervalo de tiempo determinado (tasa de solicitudes).
timeslice El intervalo de tiempo especificado en microsegundos (múltiplo de 10 s), durante el cual las solicitudes se supervisan según los límites configurados. Si no se especifica, el valor predeterminado es de 1000 milisegundos.
limittype Le permite configurar el tipo de algoritmos de aceleración que quiere usar para aplicar el límite. Los algoritmos compatibles son rápidos y suaves. El modo por defecto es el modo ráfaga.
throttle_action Le permite definir la acción de aceleración que se debe tomar en el tráfico que se limita para cruzar el umbral configurado.
  Las siguientes son las acciones de aceleración que puede definir:
  DROP: descarta las solicitudes por encima de los límites de tráfico configurados.
  RESET: restablece la conexión para las solicitudes que cruzan el límite configurado.
  REDIRECT: Redirige el tráfico a la redirect_url configurada.
  RESPONDER: Responde con la respuesta estándar “429 Demasiadas solicitudes”.
redirect_url Este atributo es un atributo opcional que solo se requiere si throttle_action se configura con el valor REDIRECT.
logpackets Permite los registros de auditoría.
logexpression Especifica la expresión de sintaxis predeterminada que define el formato y el contenido del mensaje de registro.
loglevel Especifica el nivel de gravedad del mensaje de registro que se genera.

Implementar el CRD de límite de velocidad

Realice lo siguiente para implementar la CRD de límite de velocidad:

  1. Descargue el CRD (ratelimit-crd.yaml).

  2. Implemente la CRD de límite de velocidad con el siguiente comando:

    kubectl create -f ratelimit-crd.yaml
    

    Por ejemplo:

    root@master:~# kubectl create -f ratelimit-crd.yaml
    
    customresourcedefinition.apiextensions.k8s.io/ratelimits.citrix.com created
    
    root@master:~# kubectl get crd
    
    NAME CREATED AT
    ratelimits.citrix.com 2019-08-27T01:06:30Z
    

Cómo escribir una configuración de directivas basada en tasas

Después de implementar la CRD proporcionada por Citrix en el clúster de Kubernetes, puede definir la configuración de directivas basada en tasas en un archivo .yaml. En el archivo .yaml, use ratelimit en el campo kind y en la sección spec agregue los atributos de CRD de límite de velocidad según sus requisitos para la configuración de la directiva.

Después de implementar el archivo .yaml, el Citrix Ingress Controller aplica la configuración de directiva basada en la tasa en el dispositivo Citrix ADC de entrada.

A continuación se presentan algunos ejemplos de configuraciones de directivas de límite de velocidad.

Limitar las solicitudes de API a los prefijos de extremo de API

Considere un caso en el que quiere definir una directiva basada en tasas en Citrix ADC para limitar las solicitudes de API a 15 solicitudes por minuto desde cada dirección IP de cliente única a los prefijos de extremo de la API configurados. Cree un archivo .yaml llamado ratelimit-example1.yaml y use los atributos CRD apropiados para definir la directiva basada en tasas de la siguiente manera:

apiVersion: citrix.com/v1beta1
kind: ratelimit
metadata:
  name: throttle-req-per-clientip
spec:
  servicenames:
    - frontend
  selector_keys:
   basic:
    path:
     - "/api/v1/products"
     - "/api/v1/orders/"
    per_client_ip: true
  req_threshold: 15
  timeslice: 60000
  throttle_action: "RESPOND"
  logpackets:
    logexpression: "http.req.url"
    loglevel: "INFORMATIONAL"
<!--NeedCopy-->

Nota:

Puede iniciar varios objetos de Kubernetes para diferentes rutas que requieran configuraciones de límite de velocidad diferentes.

Una vez que haya definido la configuración de la directiva, implemente el archivo .yaml con el siguiente comando:

root@master:~#kubectl create -f ratelimit-example1.yaml
ratelimit.citrix.com/throttle-req-per-clientip created

El Citrix Ingress Controller aplica la configuración de directivas en el dispositivo Citrix ADC de entrada.

Limitar las solicitudes de API a las API de calendario

Considere un caso en el que quiere definir una directiva basada en tasas en un Citrix ADC para limitar las solicitudes de API (GET o POST) a cinco solicitudes de cada cliente de API identificado mediante el encabezado HTTP X-API-Key a las API del calendario. Cree un archivo .yaml llamado ratelimit-example2.yaml y use los atributos CRD apropiados para definir la directiva basada en tasas de la siguiente manera:

apiVersion: citrix.com/v1beta1
kind: ratelimit
metadata:
  name: throttle-calendarapi-perapikey
spec:
  servicenames:
    - frontend
  selector_keys:
    basic:
      path:
        - "/api/v1/calender"
      method:
        - "GET"
        - "POST"
      header_name: "X-API-Key"
  req_threshold: 5
  throttle_action: "RESPOND"
  logpackets:
    logexpression: "rate exceeded, you may want to configure higher limit"
    loglevel: "INFORMATIONAL"
<!--NeedCopy-->

Una vez que haya definido la configuración de la directiva, implemente el archivo .yaml con el siguiente comando:

root@master:~#kubectl create -f ratelimit-example2.yaml
ratelimit.citrix.com/throttle-req-per-clientip created

El Citrix Ingress Controller aplica la configuración de directivas en el dispositivo Citrix ADC de entrada.

Limitación de velocidad en Kubernetes mediante Citrix ADC