
쿠버네티스 환경에서 외부 트래픽을 내부로 인입시킬 때, 서비스(Service)의 타입을 습관적으로 LoadBalancer로 설정하는 경우가 많다. 단일 서비스를 띄울 때는 직관적이고 편리하지만, 서비스 개수가 늘어날수록 이 방식은 아키텍처의 부채가 된다.
LoadBalancer 타입은 L4(전송 계층)에서 동작한다. IP와 Port 번호만 확인하고 트래픽을 맹목적으로 전달할 뿐, HTTP/HTTPS 프로토콜의 특성(도메인, URL 경로 등)을 이해하지 못한다.
가장 큰 문제는 클라우드 벤더(AWS, GCP 등)와의 연동 방식이다.
쿠버네티스에 LoadBalancer 타입의 서비스를 생성하면, 클라우드 환경에서는 실제 로드밸런서(예: AWS NLB) 장비가 1:1로 생성된다.
기능적으로 동작한다고 해서 올바른 설계가 아니다. Ingress 도입은 선택이 아닌 필수이며, 그 논리적 근거는 다음과 같다.
HTTPS 통신을 구축할 때의 차이는 더욱 극명하다.
LoadBalancer 구조에서는 10개의 서비스에 각각 SSL 인증서를 세팅하고 갱신해야 하는 '관리 지옥'이 열린다.Ingress는 L7 계층에서 동작하므로, 단일 진입점에서 SSL 인증을 해제(SSL Termination)한다. 뒷단의 서비스들은 복잡한 암복호화 로직 없이 비즈니스 로직에만 집중할 수 있다.인그레스는 시스템의 '정문 경비실'이다. 외부의 모든 요청은 정문(Ingress Controller)을 통과하며, 여기서 방문자의 목적지(URL Path, Host)를 분석해 클러스터 내부의 각 서비스(ClusterIP)로 안내한다.
단 하나의 도메인(example.com)으로 관리자 페이지, API, 프론트엔드를 분기하는 라우팅 규칙이다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: main-routing-ingress
spec:
rules:
# 1. 서브 도메인 기반 라우팅
- host: admin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-svc # 외부 노출 없이 ClusterIP로 설정됨
port:
number: 80
# 2. URI 경로(Path) 기반 라우팅
- host: example.com
http:
paths:
# /api 요청은 api-svc로 포워딩
- path: /api
pathType: Prefix
backend:
service:
name: api-svc
port:
number: 8080
# 그 외 모든 요청은 frontend-svc로 포워딩
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 80
서비스마다 외부 직통 도로(LoadBalancer)를 개통하는 것은 클라우드 벤더의 매출만 올려주는 비효율적인 설계다.
ClusterIP)으로 철저히 제한하여 보안을 확보한다.이러한 설계가 인프라 리소스와 유지보수 공수를 동시에 방어하는 쿠버네티스 네트워크 아키텍처의 기본 정석이다.