Gateway Rate Limiting¶
This tutorial walks you through an example of how to configure multiple rate limit polices for different listeners in an ingress gateway.
Prerequisites¶
- Kubernetes cluster with Kuadrant operator installed. See our Getting Started guide for more information.
- kubectl command line tool.
Deploy the sample API:¶
kubectl apply -f https://raw.githubusercontent.com/Kuadrant/Kuadrant-operator/main/examples/toystore/toystore.yaml
Create the ingress gateways¶
kubectl -n kuadrant-system apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: environment
annotations:
kuadrant.io/namespace: kuadrant-system
networking.istio.io/service-type: ClusterIP
spec:
gatewayClassName: istio
listeners:
- name: external
port: 80
protocol: HTTP
hostname: '*.io'
allowedRoutes:
namespaces:
from: All
- name: local
port: 80
protocol: HTTP
hostname: '*.local'
allowedRoutes:
namespaces:
from: All
EOF
Route traffic to the API from both gateways listeners¶
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: toystore
spec:
parentRefs:
- name: environment
namespace: kuadrant-system
hostnames:
- "*.toystore.io"
- "*.toystore.local"
rules:
- backendRefs:
- name: toystore
port: 80
EOF
Create a Kuadrant RateLimitPolicy
to configure rate limiting for the external listener:¶
kubectl apply -n kuadrant-system -f - <<EOF
apiVersion: kuadrant.io/v1beta3
kind: RateLimitPolicy
metadata:
name: gw-rlp-external
spec:
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: environment
sectionName: external
defaults:
strategy: merge
limits:
"external":
rates:
- limit: 2
window: 10s
EOF
Create a Kuadrant RateLimitPolicy
to configure rate limiting for the local listener:¶
kubectl apply -n kuadrant-system -f - <<EOF
apiVersion: kuadrant.io/v1beta3
kind: RateLimitPolicy
metadata:
name: gw-rlp-local
spec:
targetRef:
group: gateway.networking.k8s.io
kind: Gateway
name: environment
sectionName: local
defaults:
strategy: merge
limits:
"local":
rates:
- limit: 5
window: 10s
EOF
Note: It may take a couple of minutes for the RateLimitPolicy to be applied depending on your cluster.
Verify the rate limiting works by sending requests in a loop¶
Expose the gateways, respectively at the port numbers 9081
and 9082
of the local host:
Up to 5 successful (200 OK
) requests every 10 seconds through the external
ingress gateway (*.io
), then 429 Too Many Requests
:
while :; do curl --write-out '%{http_code}\n' --silent --output /dev/null -H 'Host: api.toystore.io' http://localhost:9081 | grep -E --color "\b(429)\b|$"; sleep 1; done
Unlimited successful (200 OK
) through the internal
ingress gateway (*.local
):