포스팅은 CloudNet@팀 서종호(Gasida)님이 진행하시는 AWS EKS Workshop Study 내용을 참고하여 작성합니다.
안녕하세요!
오늘은 LoadBalancer Controller를 이용한
차세대 트래픽 관리 도구인 API Gateway를 사용해보도록 하겠습니다.
01. API Gateway란?
📌 개요
Kubernetes community에서 대표적인 오픈소스 도구인 ingress nginx controller가 2026년 3월 이후 EOL
종료 이후에는 업데이트, 보안 패치, 버그 수정 등이 완전히 중단 된다고 합니다. 이는 오랜 기간 소수의 개발자(1~2명)가 야간·주말에 유지보수를 이어온 구조적 한계와, 올해 발생한 중대한 보안 취약점(IngressNightmare, CVE-2025-1974) 을 해결하는 과정에서 프로젝트가 보유한 자원만으로는 안정적인 지원이 어렵다는 판단이 배경이 되었습니다.
이에 따라 다른 ingress controller나 API Gateway로 마이그레이션을 권장하고 있습니다.
API Gateway는 클라이언트와 백엔드 서비스 사이의 단일 진입점 입니다.
모든 요청을 받아서 적절한 서비스로 라우팅한다.
그 과정에서 인증/인가, 트래픽 제어, 로깅, 프로토콜 변환 등을 처리합니다.
Ingress nginx controller와 비교하면, Ingress는 단순히 L7 트래픽을 어디에 보낼지?에 집중하는 반면,
API Gateway는 그보다 훨씬 넓은 횡단 관심사(cross-cutting concerns)를 처리합니다.
API Gateway가 처리하는 기능들을 소개합니다.
인증/인가 (AuthN/AuthZ)
JWT 토큰 검증, OAuth 2.0 / OIDC 처리
API Key 검증
백엔드 서비스는 인증 로직을 몰라도 됨 (offloading)
Rate Limiting / Throttling
IP별, 사용자별, API Key별 요청 수 제한
서킷 브레이커 패턴 (Circuit Breaker)
라우팅
/api/v1/users → User Service
/api/v1/orders → Order Service
ath rewriting, Header 기반 라우팅
프로토콜 변환
REST ↔ gRPC 변환
WebSocket 지원
GraphQL 집계
관찰가능성 (Observability)
요청/응답 로깅
분산 트레이싱 (Jaeger, Zipkin)
Prometheus 메트릭 노출
그렇다면, API Gateway를 도입한다면 Ingress는 완전히 필요가 없는가?
즉 API Gateway를 어떻게 구현하느냐에 따라서 Ingress를 대체할 수도 있고 공존할 수도 있습니다.
기존 Ingress에서 annotation으로 하던 ALB 설정을 별도 오브젝트로 분리한 겁니다.
# 기존 Ingress 방식
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing # ← 이게
# Gateway API 방식
kind: LoadBalancerConfiguration
spec:
scheme: internet-facing # ← 이렇게 분리됨
나중에 Gateway 오브젝트가 이 설정을 참조해서 ALB를 프로비저닝할 때 사용됩니다.
📌 gatewayclasses 생성
cat << EOF | kubectl apply -f -
# 기존 IngressClass 방식
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
spec:
controller: ingress.k8s.aws/alb # ← 컨트롤러 지정
# Gateway API 방식
kind: GatewayClass
spec:
controllerName: gateway.k8s.aws/alb # ← 컨트롤러 지정
parametersRef: # ← 추가로 설정 참조 가능
kind: LoadBalancerConfiguration
name: lbc-config
namespace: default
EOF
클러스터 전역 오브젝트입니다.
"이 클러스터에서 ALB를 만들 때 어느 컨트롤러가 처리하고, 어떤 기본 설정을 쓸지" 를 선언합니다. 나중에 Gateway를 만들 때 gatewayClassName: aws-alb 로 이걸 참조하면 자동으로 internet-facing ALB가 생성됩니다.
타겟 그룹의 세부 설정을 정의하는 오브젝트입니다. 기존 Ingress annotation으로 하던 것들이 분리된 겁니다.
# 기존 Ingress annotation 방식
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/backend-protocol: HTTP
alb.ingress.kubernetes.io/healthcheck-path: /health
# Gateway API 방식 → TargetGroupConfiguration으로 분리
kind: TargetGroupConfiguration
spec:
targetReference:
name: service-2048 # 어느 Service에 적용할지
defaultConfiguration:
targetType: ip # ip or instance
protocol: HTTP
EKS에서는 targetType을 ip로 하는 것을 권장합니다. (Pods가 직접 타겟이 되어 불필요한 홉을 줄입니다)
TargetGroupConfiguration은 Service와 1:1로 연결됩니다.
AWS 리소스와 맵핑해보면 아래와 같습니다.
ALB
├── LoadBalancerConfiguration ← ALB 자체 설정
│ scheme, ipAddressType
│ access logs, idle timeout
│ security groups
│
├── Listener (80, 443)
│ └── ListenerRuleConfiguration ← 리스너/규칙 설정
│ ssl policy, redirect rules
│
└── Target Group
└── TargetGroupConfiguration ← 타겟 그룹 설정
targetType: ip/instance
healthcheck path/interval
deregistration delay
LoadBalancerConfiguration은 ALB 전체에 한 번만 적용되고, TargetGroupConfiguration은 Service마다 개별 설정이 가능합니다. 기존 Ingress 방식에선 이게 annotation 하나에 섞여 있어서 관리가 어려웠던 겁니다.
백엔드 서비스와 맵핑을 완료 하였습니다. 타겟 그룹 설정은 아래와 정의하였으니, 설정을 해볼까요?
📌 HTTProute 설정 - 타겟 그룹 설정
실제 AWS 타겟 그룹은 HTTPRoute가 Service를 참조하는 순간 LBC가 프로비저닝합니다.