NGINX Gateway Fabric : Rate Limit 구성
NGINX Gateway Fabric 은 고성능의 HTTP 요청을 처리하는 게이트웨이 솔루션으로, API Rate Limiting 기능을 통해 요청의 빈도를 제한함으로써 서비스의 안정성과 보안을 강화할 수 있습니다. 본 가이드에서는 SnippetsFilter와 Rate Limit 기능을 활용하여 요청 제한을 구성하는 방법을 소개합니다.
목차
1. 환경 구성
2. RateLimit이란?
3. SnippetsFilter 구성
4. NGINX Gateway Fabric RateLimit 구성
5. 결론
1. 환경 구성
NGINX Gateway Fabric(Gateway API)

NGINX Gateway Fabric의 Service Routing용 서비스

2. RateLimit이란?
RateLimit은 시스템, API, 또는 네트워크 리소스에 대한 사용량을 제한하는 메커니즘을 의미합니다. 이는 특정 시간 동안 사용자 또는 클라이언트가 수행할 수 있는 요청의 최대 횟수를 제한하여 과도한 사용이나 남용을 방지하고 시스템의 안정성을 유지하는 데 사용됩니다.

3. SnippetsFilter 구성
Rate Limit 기능을 사용하기 위해서는 NGINX의 SnippetsFilter API를 사용하여 NGINX의 다양한 모듈을 사용하고 Rate Limit과 같은 구성을 사용할 수 있습니다.
NGINX Snippet Filter가 활성화된 Manifest 파일을 추가하거나 아래와 같은 Deployment와 ClusterRole을 변경합니다.
NGINX Gateway Fabric의 Deployment를 아래와 같은 arg를 추가합니다.
kubectl edit deployment <NGINX Gateway Fabric Deployment> -n nginx-gateway
...
- args:
- static-mode
- --gateway-ctlr-name=gateway.nginx.org/nginx-gateway-controller
- --gatewayclass=nginx
- --config=ngf-config
- --service=ngf-nginx-gateway-fabric
- --nginx-plus
- --usage-report-secret=nplus-license
- --metrics-port=9113
- --health-port=8081
- --leader-election-lock-name=ngf-nginx-gateway-fabric-leader-election
- --snippets-filters # SnippetsFilter를 사용합니다.
...

아래와 같은 ClusterRole을 변경합니다.
...
- apiGroups:
- gateway.nginx.org
resources:
- nginxproxies
- clientsettingspolicies
- observabilitypolicies
- upstreamsettingspolicies
- snippetsfilters # snippetsfilter 리소스의 목록과 변경 사항을 감지합니다.
verbs:
- list
- watch
- apiGroups:
- gateway.nginx.org
resources:
- nginxgateways/status
- clientsettingspolicies/status
- observabilitypolicies/status
- upstreamsettingspolicies/status
- snippetsfilters/status # snippetsfilters의 현재 상태를 업데이트하거나 확인합니다.
verbs:
- update
...

4. NGINX Gateway Fabric RateLimit 구성
먼저 Gateway를 추가합니다.
# gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: nginx
namespace: nginx
spec:
gatewayClassName: nginx
listeners:
- name: http
port: 80
protocol: HTTP
Gateway 추가 후 먼저 SnippetsFilter를 통해 NGINX Gateway Fabric에 Rate Limit을 구성합니다.
(Rate Limit에 대한 자세한 내용은 NGINX STORE Rate Limit Docs 에서 확인할 수 있습니다.)
# snippetsfilter.yaml
apiVersion: gateway.nginx.org/v1alpha1
kind: SnippetsFilter
metadata:
name: ratelimiting
namespace: nginx
spec:
snippets:
- context: http # http 컨테스트에 value의 값을 추가합니다.
value: limit_req_zone \$remote_addr zone=myzone:10m rate=1r/s; # 초마다 최대 1개의 요청만 허용합니다. $ 같은 경우 변수로 인식하기 때문에 \를 넣어야 구성이 제대로 됩니다.
- context: http.server.location # location 컨테스트에 value의 값을 추가합니다.
value: limit_req zone=myzone; # 위에서 지정했던 zone을 넣습니다.
limit_req_status 429; # 요청 제한이 걸렸을 경우 반환할 http status code를 지정합니다.
Route를 구성합니다. 이전에 구성했었던 Snippetsfilter를 지정합니다.
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: nginx-route
namespace: nginx
spec:
parentRefs:
- name: nginx
hostnames:
- "example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
filters: # 요청에 적용되는 Filter를 정의합니다.
- type: ExtensionRef #
extensionRef: # 확장 Filter를 사용합니다.
group: gateway.nginx.org # gateway.nginx.org api를 사용합니다
kind: SnippetsFilter # SnippetsFilter를 사용합니다.
name: ratelimiting # SnippetsFilter ratelimiting을 사용합니다.
backendRefs: # 라우팅될 서비스를 지정합니다.
- name: nginx-svc # nginx svc를 지정합니다.
port: 80 # nginx-svc에서 사용하고 있는 포트 80을 지정합니다.
모두 apply 한 후 host로 초당 1회보다 많은 요청을 보냅니다.

초당 최대 1회의 요청만 허용하는 것을 볼 수 있습니다.
5. 결론
NGINX Gateway Fabric에서 SnippetsFilter와 Rate Limit 기능을 활용하면 API 요청 속도를 제어하여 서비스 안정성을 높일 수 있습니다. 이 설정은 트래픽 과부하를 방지하고 대량 요청 환경에서 서비스 품질을 유지하는 데 효과적입니다. 설정 후 초당 최대 1회의 요청만 허용되는 정책이 정상 작동하는 것을 확인할 수 있었으며, 필요에 따라 쉽게 조정 가능하다는 장점이 있습니다. 이를 통해 트래픽 제어와 API 보호를 효과적으로 구현할 수 있습니다.
NGINX Gateway Fabric에 관련한 더 많은 정보들을 알고싶으시다면 NGINX STORE Kubernetes 카테고리를 참고해주세요.
댓글을 달려면 로그인해야 합니다.