Auch wenn es selten aktiv bedacht wird: Jeder Webservice sollte eine Vorstellung davon haben, wie viele Requests er aushalten soll. Rate Limiting verhindert, dass unnötige Last – ob versehentlich oder absichtlich – die Verfügbarkeit gefährdet. Gerade in Kubernetes-Clustern mit einem NGINX-Ingress ist das Mittel der Wahl bereits integriert und muss nur richtig konfiguriert werden.
In der ConfigMap des NGINX-Ingress-Controllers lässt sich ein Limit konfigurieren. Beispiel:
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
data:
http-snippet: |
limit_req_zone $request_uri zone=megatoll:10m rate=1r/m;
Mit diesem Eintrag wird eine Zone namens megatoll angelegt, die maximal eine Anfrage pro Minute pro Schlüssel ($request_uri) zulässt.
Deployment per Patch:
kubectl patch configmap ingress-nginx-controller -n infrastructure --type merge -p '{"data":{"http-snippet":"limit_req_zone $request_uri zone=one:10m rate=1r/m;"}}'
Alternativ lässt sich die Konfiguration auch per Patch-File einspielen:
kubectl patch configmap ingress-nginx-controller -n infrastructure --type merge --patch-file ./manifests/additional_ingress_config.yaml
Sobald die Zone definiert ist, kann das Rate Limit über die Ingress-Ressource aktiviert werden:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
limit_req zone=megatoll nodelay;