MSA 트레이닝 센터
Ingress Controller 로 Kubernetes API를 보호하는 방법
귀하의 조직은 Kubernetes에서 Ingress Controller 첫 번째 앱과 API를 출시했습니다.
높은 트래픽 볼륨이 예상된다고 들었지만(NGINX Ingress Controller가 트래픽을 신속하게 라우팅할 수 있도록 이미 autoscaling을 구현함)
API가 악의적인 공격의 대상이 될 수 있다는 우려가 있습니다.
무차별 대입 암호 공격 또는 DDoS 공격에서 발생할 수 있는 것처럼 API가 많은 양의 HTTP 요청을 수신하면 API와 앱이 모두 압도되어 충돌할 수도 있습니다.
하지만 당신은 운이 좋습니다! 트래픽 제어 기술 “Rate Limiting”은 들어오는 요청 속도를 실제 사용자에게 일반적인 값으로 제한하는 API Gateway 사용 사례입니다.
이 트레이닝 영상에서는 NGINX Ingress Controller를 구성하여 앱과 API가 너무 많은 요청에 압도되지 않도록 하는 Rate Limiting 정책을 구현합니다.
Ingress Controller 로 Kubernetes API를 보호하는 방법
Kubernetes 클러스터에서 API와 애플리케이션은 요청의 급증으로 인해 과부하 상태가 될 수 있습니다. 이를 방지하기 위해 NGINX Ingress Controller 를 활용하여 Rate Limiting 정책을 구성하면, 클러스터의 안정성을 보장하고 리소스 낭비를 줄일 수 있습니다. 이 가이드는 NGINX Ingress Controller를 사용해 Kubernetes API를 보호하고 트래픽을 관리하는 방법을 설명합니다.
Rate Limiting이란?
Rate Limiting은 클라이언트가 API에 요청을 보낼 수 있는 빈도(시간당 요청 수)를 제한하는 기술입니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다:
- API 안정성 보장: 요청 과부하로 인한 서비스 중단 방지.
- 보안 강화: DDoS(Distributed Denial of Service)와 같은 공격을 완화.
- 리소스 효율성 향상: 불필요한 요청 처리로 인한 리소스 낭비 방지.
NGINX Ingress Controller로 Rate Limiting 구현
Ingress Controller 설치
먼저, Kubernetes 클러스터에 NGINX Ingress Controller를 설치합니다. 아래는 Helm을 사용한 설치 방법입니다.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx \
--set controller.metrics.enabled=true \
--set controller.service.type=LoadBalancer
이 설정은 Ingress Controller를 설치하며, Rate Limiting에 필요한 메트릭 기능을 활성화합니다.
Rate Limiting 활성화
Ingress 리소스에 Rate Limiting을 설정하려면 NGINX 주석(annotation)을 사용해야 합니다. 기본적인 설정은 다음과 같습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/limit-req-zone: "$binary_remote_addr zone=mylimit:10m rate=5r/s"
nginx.ingress.kubernetes.io/limit-req: "10"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
nginx.ingress.kubernetes.io/limit-req-zone: Rate Limiting 설정을 위한 메모리 영역을 정의합니다.$binary_remote_addr: 클라이언트 IP를 기준으로 제한.10m: 메모리 크기 설정.rate=5r/s: 초당 5개의 요청 허용.
nginx.ingress.kubernetes.io/limit-req: 초당 허용된 요청을 초과한 요청 대기열 크기를 설정합니다.
Rate Limiting 테스트
curl 또는 로드 테스트 도구를 사용하여 설정된 Rate Limiting을 검증합니다.
Rate 제한 내에서 요청을 보냅니다.
curl -v http://api.example.com
초당 허용 요청을 초과하여 요청을 보냅니다.
for i in {1..10}; do curl -s http://api.example.com & done
HTTP/1.1 503 Service Temporarily Unavailable
Retry-After: 1
초과된 요청은 503 상태 코드를 반환하며, Retry-After 헤더를 통해 재요청 대기 시간을 제공합니다.
고급 Rate Limiting 설정
Rate Limiting은 단순한 요청 제한 외에도 특정 조건에 따라 다양한 방식으로 설정할 수 있습니다.
특정 사용자 또는 API 키를 기준으로 Rate Limiting을 설정하려면 헤더를 기준으로 제한합니다.
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-req-zone: "$http_x_api_key zone=mylimit:10m rate=10r/m"
$http_x_api_key: 요청 헤더의 X-API-KEY 값을 기준으로 제한.
특정 경로에 대해서만 Rate Limiting을 적용합니다.
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-req-zone: "$request_uri zone=apilimit:10m rate=2r/s"
$request_uri: 요청된 URI를 기준으로 제한.
모니터링 및 관리
NGINX Ingress Controller는 요청 상태를 로깅합니다. Rate Limiting 관련 로그를 확인하려면 다음 명령을 사용합니다.
kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
Rate Limiting 상태를 시각적으로 모니터링하려면 Prometheus와 Grafana를 사용합니다.
helm install prometheus prometheus-community/kube-prometheus-stack
Grafana 대시보드 설정 NGINX Ingress Controller의 메트릭 데이터를 기반으로 Rate Limiting 상태를 모니터링합니다.
Best Practices
- 적절한 요청 제한 설정: 서비스 성격과 트래픽 패턴에 맞는 Rate Limiting 값을 설정하세요.
- 최소 허용량 설정: Rate Limiting을 너무 낮게 설정하면 정상 사용자가 불편함을 겪을 수 있습니다.
- 모니터링 활성화: Prometheus 및 Grafana를 통해 트래픽 패턴과 Rate Limiting 동작을 지속적으로 모니터링하세요.
- 주기적인 테스트: 로드 테스트 도구를 사용하여 설정이 실제 트래픽 환경에서 잘 작동하는지 확인하세요.
- 보안 강화: Rate Limiting과 함께 IP 필터링 및 인증 정책을 결합하여 다층 보안을 구현하세요.
결론
이 가이드를 통해 NGINX Ingress Controller를 사용하여 Kubernetes API에 Rate Limiting을 적용하고, 과부하로 인한 서비스 중단을 방지하는 방법을 배웠습니다.
클러스터 내 API와 애플리케이션의 안정성을 보장하기 위해 트래픽 패턴을 분석하고 적절한 Rate Limiting 정책을 설정하세요.
NGINX STORE에 문의하여 사용 사례에 적합한 이와 함께 지속적인 모니터링과 관리로 최적의 보안 상태를 유지하세요.