
왜 우리는 인그레스를 통해 트래픽을 관리해야 할까요
마이크로서비스 아키텍처를 운영하다 보면 어느 순간 비용과 관리 복잡도라는 거대한 벽에 부딪히곤 해요. 처음에는 서비스 하나를 띄울 때마다 LoadBalancer 타입을 사용하여 각각의 외부 IP를 할당했어요. 서비스가 5개면 5개의 로드밸런서가 생기고, 서비스가 20개가 되면 클라우드 비용 청구서를 보고 눈을 의심하게 되지요. 게다가 각 서비스마다 SSL 인증서를 따로 적용하고 관리하는 과정은 정말 고역이었어요.
단순히 외부 요청을 전달하는 것을 넘어, 특정 도메인에 따라 다른 서비스로 보내거나 URL 경로에 따라 트래픽을 분산하고 싶을 때 NodePort나 개별 LoadBalancer만으로는 한계가 명확해요. 인그레스 운영 사례를 살펴보면, 대부분의 팀이 비슷한 지점에서 갈등을 겪고 있다는 것을 알 수 있어요. 규칙 기반의 라우팅이 필요해지고, 보안 인증서 관리를 통합하고 싶어지는 시점이 바로 인그레스 도입의 적기예요.
이 글에서는 단순히 이론적인 개념을 나열하는 대신, 실제 운영 환경에서 인그레스를 어떻게 도입했고 어떤 문제를 해결했는지 생생하게 다뤄보려고 해요. 인그레스를 도입함으로써 얻을 수 있는 비용 절감 효과와 트래픽 제어의 유연성을 직접 확인해 보세요. 백엔드 개발자라면 반드시 거쳐야 할 관문과도 같은 이 과정을 함께 살펴봐요.
- 기존 로드밸런서 방식의 한계와 인그레스 도입 배경
- 인그레스 컨트롤러 선택 기준과 주요 구성 요소
- 실무에서 적용한 단계별 인그레스 설정 과정
- 운영 중 마주친 실수와 트러블슈팅 경험담
- 성공적인 인그레스 운영을 위한 핵심 체크리스트
인그레스 도입 전 반드시 짚고 넘어가야 할 준비물
인그레스를 무턱대고 설치한다고 해서 모든 문제가 해결되는 것은 아니에요. 무엇보다 우리 서비스의 트래픽 패턴과 요구사항이 무엇인지 명확히 정의하는 과정이 선행되어야 해요. 단순히 “인그레스가 좋다니까 쓰자”는 식의 접근은 오히려 설정의 복잡도만 높이고 장애를 유발할 수 있어요.
가장 먼저 결정해야 할 것은 인그레스 컨트롤러(Ingress Controller)의 종류예요. 인그레스는 규칙을 담은 설정 파일일 뿐이고, 실제로 그 규칙을 읽어서 트래픽을 전달하는 엔진이 필요한데 이것이 바로 컨트롤러예요. 가장 대중적인 것은 Nginx 기반의 컨트롤러이지만, 환경에 따라 HAProxy나 Kong, 혹은 클라우드 제공업체의 전용 컨트롤러를 고려해야 할 수도 있어요.
인그레스 리소스(Ingress Resource)는 ‘어떤 경로로 들어오면 어디로 보내라’는 규칙 정의서이고, 인그레스 컨트롤러(Ingress Controller)는 그 규칙을 실제로 실행하는 실제 프로그램(엔진)이라고 이해하면 쉬워요.
또한, 현재 클러스터의 네트워크 구조도 확인해야 해요. 외부에서 클러스터 내부로 트래픽이 들어올 때 어떤 경로를 거치는지, 그리고 인그레스 컨트롤러 자체가 어떤 서비스 타입(LoadBalancer 또는 NodePort)으로 노출될 것인지 결정해야 해요. 아래 표를 통해 기존 방식과 인그레스 방식의 차이를 비교해 보세요.
| 비교 항목 | NodePort / LoadBalancer | Ingress 방식 |
|---|---|---|
| 비용 효율성 | 서비스마다 개별 비용 발생 (높음) | 하나의 IP로 여러 서비스 통합 (낮음) |
| 라우팅 유연성 | L4 계층 중심, 경로 기반 라우팅 불가 | L7 계층 중심, 도메인/경로 기반 가능 |
| SSL/TLS 관리 | 서비스마다 개별 적용 필요 | 인그레스 계층에서 통합 관리 가능 |
| 설정 난이도 | 단순하지만 확장 시 관리가 힘듦 | 초기 설정 및 규칙 관리가 다소 복잡함 |
마지막으로 체크리스트를 준비해 보세요. 우리가 도메인을 몇 개나 사용할 것인지, URL 경로에 따른 분기(예: /api vs /web)가 필요한지, 그리고 트래픽이 몰릴 때 컨트롤러의 성능을 어떻게 확장할 것인지를 미리 고민해야 해요. 이러한 준비가 되어 있어야 인그레스 적용기의 주인공이 될 수 있어요.
실전 인그레스 구축 및 운영 단계별 가이드
실제 운영 환경에서 인그레스를 도입했던 과정을 5가지 핵심 단계로 나누어 설명해 드릴게요. 이론적인 설명보다는 실제 어떤 순서로 작업이 진행되었는지를 중심으로 살펴보세요.
STEP 1. 인그레스 컨트롤러 설치 및 인프라 구성
가장 먼저 할 일은 클러스터에 엔진을 설치하는 것이에요. 저희 팀은 가장 커뮤니티가 활발하고 검증된 Nginx Ingress Controller를 선택했어요. Helm을 사용하면 설치 과정이 매우 간단해져요. Helm 차트를 통해 컨트롤러를 배포하면, 클라우드 환경에서는 자동으로 하나의 LoadBalancer 타입 서비스가 생성되면서 외부 통로가 열리게 돼요.
이때 주의할 점은 컨트롤러가 사용하는 리소스를 미리 계산해야 한다는 것이에요. 트래픽이 급증할 경우 컨트롤러 자체가 병목 구간이 될 수 있으므로, Horizontal Pod Autoscaler(HPA)를 설정하여 컨트롤러의 Pod 개수가 유동적으로 늘어날 수 있도록 준비해 두었어요. 설치가 완료된 후에는 `kubectl get svc` 명령어를 통해 외부 IP가 정상적으로 할당되었는지 반드시 확인해야 해요.
STEP 2. 도메인 및 경로 기반 라우팅 규칙 정의
컨트롤러가 준비되었다면 이제 본격적으로 트래픽을 나누는 규칙을 만들 차례예요. 인그레스 리소스(Ingress Resource) 파일을 작성하여 어떤 도메인으로 들어온 요청을 어떤 서비스로 보낼지 명시해요. 예를 들어 `api.example.com`은 API 서버로, `example.com/web`은 프론트엔드 서비스로 보내는 식이죠.
작업 시 가장 까다로운 부분은 PathType 설정이에요. `Prefix`로 설정할지, `Exact`로 설정할지에 따라 요청이 매칭되는 범위가 완전히 달라지거든요. 만약 `/api`를 `Prefix`로 설정하면 `/api/v1`, `/api/users` 등 모든 하위 경로가 API 서버로 전달되지만, `Exact`로 설정하면 오직 `/api`라는 정확한 경로로 들어온 요청만 매칭돼요. 저희는 대부분의 경우 하위 경로를 포함해야 하므로 `Prefix` 타입을 주로 사용했어요.
STEP 3. SSL/TLS 인증서 통합 관리 자동화
보안은 타협할 수 없는 영역이에요. 서비스마다 인증서를 관리하는 지옥에서 벗어나기 위해, 저희는 cert-manager를 함께 도입했어요. cert-manager를 사용하면 Let’s Encrypt와 같은 무료 인증서 기관과 연동하여 인증서를 자동으로 발급받고, 만료되기 전에 알아서 갱신할 수 있어요.
인그레스 설정 파일에 `tls` 섹션을 추가하고, 발급된 Secret의 이름을 적어주기만 하면 끝나요. 이렇게 하면 인그레스 컨트롤러가 외부 트래픽을 받는 즉시 HTTPS로 암호화하여 안전하게 전달하게 돼요. 개발자가 일일이 인증서 파일을 복사하고 Secret을 만드는 수고를 덜어주기 때문에 운영 생산성이 비약적으로 상승했어요.
인증서 갱신 실패는 서비스 중단의 가장 큰 원인 중 하나예요. cert-manager의 로그를 주기적으로 모니터링하고, 인증서 만료 알림을 슬랙(Slack) 같은 메신저와 연동해 두는 것을 강력히 추천해요.
STEP 4. 어노테이션(Annotation)을 활용한 고급 기능 구현
인그레스의 진가는 어노테이션을 사용할 때 나타나요. Nginx 인그레스 컨트롤러는 수많은 어노테이션을 제공하는데, 이를 통해 트래픽의 세부적인 동작을 제어할 수 있어요. 예를 들어, 클라이언트의 요청 바디 크기가 클 경우 nginx.ingress.kubernetes.io/proxy-body-size 값을 조절하여 ‘413 Request Entity Too Large’ 에러를 방지할 수 있어요.
또한, 특정 서비스로 트래픽의 일부만 보내는 카나리(Canary) 배포 기능도 어노테이션 하나로 구현이 가능해요. 신규 버전의 서비스를 배포할 때 전체 트래픽의 5%만 새 버전으로 보내서 안정성을 테스트하는 과정은 운영 안정성을 높이는 데 엄청난 도움이 되었어요. 이처럼 어노테이션은 인그레스를 단순한 통로에서 강력한 트래픽 제어기로 만들어주는 핵심 도구예요.
STEP 5. 모니터링과 성능 최적화
모든 설정이 끝났다고 안심해서는 안 돼요. 이제 인그레스가 트래픽을 잘 처리하고 있는지 감시해야 해요. 저희는 Prometheus와 Grafana를 연동하여 인그레스 컨트롤러의 요청 수, 응답 시간(Latency), 에러율(4xx, 5xx 에러)을 실시간 대시보드로 시각화했어요.
특히 응답 시간이 갑자기 늘어난다면 인그레스 컨트롤러의 CPU 사용량을 체크하거나, 백엔드 서비스와의 연결 설정(Keep-alive)을 검토해야 해요. 실무 운영 경험에 따르면, 트래픽 급증 시 인그레스 컨트롤러의 리소스 제한(Limit) 설정이 너무 낮으면 요청이 드롭되는 현상이 발생하곤 해요. 따라서 지속적인 부하 테스트를 통해 적절한 리소스 값을 찾아내는 과정이 반드시 필요해요.
아래는 저희가 실제 운영 중 사용했던 간단한 인그레스 설정 예시 시나리오예요.
- 도메인: api.myapp.com
- 경로: /v1 (Prefix)
- 연결 서비스: api-service:80
- SSL: cert-manager를 통한 자동 발급 Secret 사용
- 특이사항: 클라이언트 요청 본문 최대 10MB 허용
자주 하는 실수와 해결법 및 자주 묻는 질문
인그레스를 운영하다 보면 이론과 다른 수많은 변수를 만나게 돼요. 제가 직접 겪고 팀원들과 함께 해결했던 문제들을 정리해 드릴게요.
자주 하는 실수와 해결법
❌ 어노테이션 오타로 인한 설정 미적용
왜 발생하는가: 인그레스 설정 파일의 어노테이션 키 값을 잘못 입력하면 컨트롤러가 이를 무시하고 기본값으로 동작해요.
✅ 해결법: 설정 후 반드시 `kubectl describe ingress [이름]` 명령어를 통해 적용된 설정값들을 눈으로 직접 확인하세요.
❌ PathType 설정 오류로 인한 404 에러
왜 발생하는가: `/api` 경로에 대해 `Exact` 타입을 사용하면 `/api/login` 같은 하위 경로 요청이 전달되지 않아요.
✅ 해결법: 하위 경로를 포함해야 하는 경우에는 반드시 `Prefix` 타입을 사용하세요.
❌ SSL 인증서와 Secret 이름 불일치
왜 발생하는가: 인그레스 리소스에 적은 TLS Secret 이름과 실제 생성된 Secret의 이름이 다르면 HTTPS 접속 시 보안 에러가 발생해요.
✅ 해결법: `kubectl get secret` 명령어로 정확한 이름을 확인하고 인그레스 설정과 대조하세요.
❌ 백엔드 서비스 타임아웃 문제
왜 발생하는가: 인그레스 컨트롤러의 기본 타임아웃보다 백엔드 서비스의 작업 시간이 더 길면 연결이 끊겨요.
✅ 해결법: `nginx.ingress.kubernetes.io/proxy-read-timeout` 등의 어노테이션을 통해 타임아웃 값을 충분히 늘려주세요.
❌ 리소스 부족으로 인한 Pod 재시작
왜 발생하는가: 트래픽이 몰릴 때 인그레스 컨트롤러의 메모리 사용량이 제한치(Limit)를 넘어서면 OOM(Out of Memory)이 발생해요.
✅ 해결법: 컨트롤러의 리소스 요청(Requests)과 제한(Limits) 값을 모니터링 데이터에 기반하여 넉넉하게 설정하세요.
자주 묻는 질문
Q. Nginx 인그레스 컨트롤러 외에 다른 대안은 무엇이 있나요?
가장 흔한 대안은 Kong이나 Traefik이에요. Kong은 API 게이트웨이 기능이 매우 강력해서 인증이나 플러그인 관리가 필요한 경우 유리하고, Traefik은 설정이 매우 직관적이고 클라우드 네이티브한 환경에 최적화되어 있어요. 서비스의 목적에 따라 선택하시면 돼요.
Q. 하나의 클러스터에 여러 개의 인그레스 컨트롤러를 띄울 수 있나요?
네, 가능해요. 컨트롤러마다 고유한 `ingress-class`를 지정하면 돼요. 예를 들어, 일반 웹 트래픽용 Nginx 컨트롤러와 내부 관리용 Kong 컨트롤러를 분리해서 운영할 수 있어요.
Q. 인그레스에서 대용량 파일 업로드를 처리할 때 주의할 점은 무엇인가요?
기본적으로 Nginx는 업로드 용량을 매우 작게 제한하고 있어요. 반드시 어노테이션을 통해 `proxy-body-size`를 늘려주어야 하며, 클라이언트와 인그레스, 그리고 백엔드 서비스 간의 타임아웃 설정도 함께 맞춰주는 것이 좋아요.
Q. 인그레스와 서비스(Service)의 차이는 무엇인가요?
서비스는 클러스터 내부의 Pod들에게 트래픽을 전달하는 역할을 하고, 인그레스는 클러스터 외부에서 들어오는 HTTP/HTTPS 요청을 어떤 서비스로 보낼지 결정하는 ‘문지기’ 역할을 한다고 보시면 돼요.
Q. 인증서 관리가 너무 힘든데 자동으로 할 방법이 없을까요?
앞서 말씀드린 cert-manager를 꼭 사용해 보세요. Let’s Encrypt와 연동하면 인증서 발급부터 갱신까지 모든 과정이 자동화되어 운영 부담이 획기적으로 줄어들어요.