Citrix ADC Ingress Controller

Ratenlimit in Kubernetes mit Citrix ADC

In einer Kubernetes-Bereitstellung können Sie die Anforderungen an die Ressourcen auf dem Back-End-Server oder den Diensten mit der vom Citrix ADC bereitgestellten Ratenlimitfunktion begrenzen.

Citrix bietet eine Kubernetes CustomResourceDefinitions (CRDs), die als Ratenlimit-CRD bezeichnet wird und die Sie mit dem Citrix Ingress Controller verwenden können, um die Ratenlimitkonfigurationen auf den Citrix ADCs zu konfigurieren, die als Ingress-Geräte verwendet werden.

Neben dem Ratenlimit für Anforderungen an die Dienste in einer Kubernetes-Umgebung können Sie die CRD für das Ratenlimit auch für die API-Sicherheit verwenden. Mit der CRD für das Ratenlimit können Sie die REST-API-Anforderung auf API-Server oder bestimmte API-Endpunkte auf den API-Servern beschränken. Es überwacht und verfolgt die Anforderungen an den API-Server oder die Endpunkte gegen das zulässige Limit pro Zeitscheibe und schützt somit vor Angriffen wie dem DDoS-Angriff.

Sie können die Protokollierung für die Beobachtbarkeit mit der CRD für Ratenlimit Protokolle werden auf Citrix ADC gespeichert, die angezeigt werden können, indem Sie die Protokolle mit dem Shell-Befehl überprüfen. Der Dateispeicherort basiert auf der Syslog-Konfiguration. Beispiel: /var/logs/ns.log.

CRD-Definition der Tarifbegrenzung

Die CRD-Spezifikation für das Ratenlimit ist im GitHub-Repo des Citrix Ingress Controller verfügbar unter: ratelimit-crd.yaml. Die CRD für das Ratenlimit bietet Attribute für die verschiedenen Optionen, die erforderlich sind, um die Ratenlimitrichtlinien auf dem Ingress Citrix ADC zu definieren, der als API-Gateway fungiert.

CRD-Attribute

In der folgenden Tabelle sind die verschiedenen Attribute aufgeführt, die in der CRD für das Ratenlimit bereitgestellt werden:

CRD-Attribut Beschreibung
servicename Die Liste der Kubernetes-Dienste, auf die Sie die Tariflimit-Richtlinien anwenden möchten.
selector_keys Die Verkehrsauswahlschlüssel, die den Datenverkehr filtern, um die API-Anforderungen zu identifizieren, auf die die Drosselung angewendet und überwacht wird.
  Hinweis: Das selector_keys ist ein optionales Attribut. Sie können wählen, Null, eine oder mehrere der Auswahltasten zu konfigurieren. Wenn mehrere Auswahltasten konfiguriert sind, wird dies als logischer UND-Ausdruck betrachtet.
  In dieser Version der CRD für Ratenlimit wird der basic Konfigurationsabschnitt selector_keys bereitgestellt, mit dem Sie die folgenden häufig verwendeten Verkehrseigenschaften als Schlüssel konfigurieren können, anhand derer die konfigurierten Grenzwerte überwacht und gedrosselt werden:
  path: Ein Array von URL-Pfadpräfixen, die sich auf einen bestimmten API-Endpunkt beziehen. Beispiel: /api/v1/products/.
  method: Ein Array von HTTP-Methoden. Zulässige Werte sind GET, PUT, POST oder DELETE.
  header_name: HTTP-Header, der über den eindeutigen API-Client oder die Benutzerkennung verfügt. Zum Beispiel, X-apikey das mit einem eindeutigen API-Schlüssel geliefert wird, der den API-Client identifiziert, der die Anfrage sendet.
  per_client_ip: Ermöglicht Ihnen, den konfigurierten Schwellenwert zu überwachen und auf jede API-Anforderung anzuwenden, die pro eindeutiger Client-IP-Adresse empfangen wird.
req_threshold Die maximale Anzahl von Anforderungen, die in der angegebenen Zeitscheibe zulässig sind (Anforderungsrate).
timeslice Das in Mikrosekunden angegebene Zeitintervall (Vielfaches von 10 s), während dem die Anforderungen anhand der konfigurierten Grenzwerte überwacht werden. Wenn nicht angegeben, ist es standardmäßig 1000 Millisekunden.
limittype Sie können damit die Art der Drosselungsalgorithmen konfigurieren, die Sie zum Anwenden des Limits verwenden möchten. Unterstützte Algorithmen sind Burst und Smooth. Die Standardeinstellung ist der Burst-Modus .
throttle_action Sie können damit die Drosselaktion definieren, die für den Verkehr ausgeführt werden muss, der zum Überschreiten des konfigurierten Schwellenwerts gedrosselt wird.
  Im Folgenden finden Sie die Drosselaktion, die Sie definieren können:
  DROP: Verwirft die Anforderungen über die konfigurierten Verkehrsbeschränkungen hinaus.
  RESET: Setzt die Verbindung für die Anforderungen zurück, die das konfigurierte Limit überschreiten.
  REDIRECT: Leitet den Datenverkehr zum konfigurierten um redirect_url.
  RESPOND: Reagiert mit der Standardantwort “429 Zu viele Anfragen”.
redirect_url Dieses Attribut ist ein optionales Attribut, das nur erforderlich ist, wenn throttle_action es mit dem Wert konfiguriert ist REDIRECT.
logpackets Ermöglicht Überwachungsprotokolle.
logexpression Gibt den Standard-Syntaxausdruck an, der das Format und den Inhalt der Protokollmeldung definiert.
loglevel Gibt den Schweregrad der generierten Protokollmeldung an.

Stellen Sie die CRD für das Ratenlimit

Führen Sie Folgendes aus, um die CRD für das Ratenlimit bereitzustellen:

  1. Laden Sie die CRD herunter (ratelimit-crd.yaml).

  2. Stellen Sie die CRD für Ratenlimit mit dem folgenden Befehl bereit:

    kubectl create -f ratelimit-crd.yaml
    

    Zum Beispiel:

    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
    

So schreiben Sie eine ratenbasierte Richtlinienkonfiguration

Nachdem Sie die von Citrix bereitgestellte CRD im Kubernetes-Cluster bereitgestellt haben, können Sie die ratenbasierte Richtlinienkonfiguration in einer .yaml Datei definieren. Verwenden Sie in der .yaml Datei ratelimit im kind Feld und fügen Sie im spec Abschnitt die CRD-Attribute für das Ratenlimit basierend auf Ihren Anforderungen für die Richtlinienkonfiguration hinzu.

Nachdem Sie die .yaml Datei bereitgestellt haben, wendet der Citrix Ingress Controller die ratenbasierte Richtlinienkonfiguration auf dem Ingress Citrix ADC-Gerät an.

Im Folgenden finden Sie einige Beispiele für Konfigurationen von Tarifbegrenzungsrichtlinien.

API-Anforderungen auf konfigurierte API-Endpunktpräfixe

Stellen Sie sich ein Szenario vor, in dem Sie eine ratenbasierte Richtlinie in Citrix ADC definieren möchten, um die API-Anforderungen von jeder eindeutigen Client-IP-Adresse auf die konfigurierten API-Endpunktpräfixe auf 15 Anforderungen pro Minute zu beschränken. Erstellen Sie eine .yaml-Datei mit dem Namen ratelimit-example1.yaml und verwenden Sie die entsprechenden CRD-Attribute, um die ratenbasierte Richtlinie wie folgt zu definieren:

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

Hinweis:

Sie können mehrere Kubernetes-Objekte für verschiedene Pfade initiieren, die unterschiedliche Ratenlimitkonfigurationen erfordern.

Nachdem Sie die Richtlinienkonfiguration definiert haben, stellen Sie die .yaml-Datei mit dem folgenden Befehl bereit:

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

Der Citrix Ingress Controller wendet die Richtlinienkonfiguration auf dem Ingress Citrix ADC-Gerät an.

Beschränken von API-Anforderungen auf Kalender-APIs

Stellen Sie sich ein Szenario vor, in dem Sie eine ratenbasierte Richtlinie in einem Citrix ADC definieren möchten, um die API-Anforderungen (GET oder POST) auf fünf Anforderungen von jedem API-Client zu beschränken, der mithilfe des HTTP-Headers X-API-Key auf die Kalender-APIs identifiziert wurde. Erstellen Sie eine .yaml-Datei mit dem Namen ratelimit-example2.yaml und verwenden Sie die entsprechenden CRD-Attribute, um die ratenbasierte Richtlinie wie folgt zu definieren:

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

Nachdem Sie die Richtlinienkonfiguration definiert haben, stellen Sie die .yaml-Datei mit dem folgenden Befehl bereit:

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

Der Citrix Ingress Controller wendet die Richtlinienkonfiguration auf dem Ingress Citrix ADC-Gerät an.

Ratenlimit in Kubernetes mit Citrix ADC