
인그레스 운영 사례를 통해 배우는 효율적인 트래픽 관리
마이크로서비스 아키텍처(MSA)를 운영하다 보면 누구나 한 번쯤 고민에 빠지게 돼요. 서비스가 늘어날수록 외부에서 접속할 수 있는 통로를 어떻게 관리해야 할지 막막해지기 때문이죠. 처음에는 간단하게 NodePort나 서비스 타입인 LoadBalancer를 사용해 문제를 해결하려 해요. 하지만 서비스가 10개, 20개로 늘어나면 상황은 완전히 달라져요.
매 서비스마다 클라우드 제공업체의 로드밸런서를 하나씩 생성하면 비용이 기하급수적으로 늘어나요. 게다가 각 서비스마다 고유한 IP와 포트를 관리하는 것은 운영 팀에게 엄청난 부담이 되죠. 보안 정책을 적용하거나 도메인 기반으로 트래픽을 나누는 작업도 점점 복잡해져요. 이런 상황에서 인그레스 운영 사례를 제대로 분석하고 적용하는 것은 선택이 아닌 필수예요.
실제로 제가 경험한 환경에서는 서비스 15개를 운영하기 위해 15개의 로드밸런서를 사용하다가, 클라우드 비용이 예상치를 훨씬 초과하는 사고가 있었어요. 인그레스를 도입한 후에는 단 하나의 로드밸런서만으로도 모든 트래픽을 경로와 호스트 이름에 따라 스마트하게 분산할 수 있게 되었죠. 운영 효율성은 물론이고 보안성까지 챙길 수 있었던 그 과정을 자세히 들려드릴게요.
이 글에서는 다음과 같은 내용을 깊이 있게 다뤄요.
- 인그레스 도입 전 겪었던 기술적 한계와 비용 문제
- 실제 운영 환경에 적용한 인그레스 구성과 설정 방식
- 도입 후 트래픽 처리 지표와 운영 환경의 변화
- 실무에서 직접 겪은 시행착오와 트러블슈팅 경험
인그레스 도입 전 반드시 알아야 할 사전 준비 사항
인그레스를 무작정 설치한다고 해서 모든 문제가 해결되는 것은 아니에요. 오히려 잘못된 설정으로 인해 서비스 접속이 끊기거나 보안 구멍이 생길 수도 있어요. 본격적인 구축에 앞서 현재 우리 클러스터의 네트워크 구조와 요구사항을 명확히 정의하는 과정이 필요해요.
네트워크 계층에 대한 이해
인그레스는 OSI 7계층 모델 중 애플리케이션 계층(Layer 7)에서 동작해요. 이는 단순히 IP와 포트 번호만 보고 트래픽을 전달하는 것이 아니라, HTTP 헤더, URL 경로, 쿠키 정보 등을 읽고 판단할 수 있다는 뜻이에요. 따라서 단순한 포트 포워딩과는 차원이 다른 유연함을 제공해요. 하지만 그만큼 설정이 복잡해질 수 있다는 점을 기억해야 해요.
기존 방식과의 비교 분석
우리가 어떤 방식으로 트래픽을 받고 있었는지, 그리고 인그레스가 왜 필요한지를 데이터로 증명할 수 있어야 해요. 아래 표를 통해 기존 방식들과 인그레스의 차이점을 비교해 보세요.
| 구분 | NodePort | LoadBalancer | Ingress |
|---|---|---|---|
| 동작 계층 | L4 (전송 계층) | L4 (전송 계층) | L7 (애플리케이션 계층) |
| 비용 효율성 | 매우 높음 | 매우 낮음 (서비스당 비용 발생) | 매우 높음 (하나로 통합 가능) |
| 기능적 유연성 | 매우 낮음 | 보통 | 매우 높음 (경로/호스트 기반 라우팅) |
| 보안 관리 | 어려움 (포트 개방 필요) | 보통 | 우수 (중앙 집중식 SSL/TLS 관리) |
인그레스는 그 자체로 트래픽을 처리하는 장치가 아니에요. 실제 트래픽을 전달하는 엔진 역할을 하는 인그레스 컨트롤러(Ingress Controller)가 클러스터 안에 반드시 설치되어 있어야 해요.
도입 전 체크리스트
실제 구축 단계로 넘어가기 전에 다음 질문들에 스스로 답해 보세요. 이 질문들에 명확한 답을 내릴 수 없다면 도입 과정에서 큰 혼란을 겪을 수 있어요.
- 현재 사용 중인 클라우드 환경에서 지원하는 로드밸런서 종류는 무엇인가요?
- 서비스별로 도메인을 다르게 가져갈 예정인가요, 아니면 하나의 도메인 아래 경로(Path)로 나눌 예정인가요?
- SSL/TLS 인증서를 어떻게 관리할 계획인가요? (예: Cert-manager 활용 여부)
- 트래픽 폭주 시를 대비한 오토스케일링 전략이 준비되어 있나요?
이러한 준비 과정이 탄탄해야만 나중에 인그레스 사례를 통해 얻을 수 있는 기술적 이득을 온전히 누릴 수 있어요. 단순히 유행을 따르는 것이 아니라, 우리 서비스의 트래픽 패턴에 맞는 설계를 하는 것이 핵심이에요.
단계별 실행: 인그레스 구축부터 최적화까지
이제 본격적으로 인그레스를 구축하고 실제 서비스에 적용하는 과정을 살펴볼게요. 제가 진행했던 프로젝트의 흐름을 따라 5개의 단계로 나누어 설명해 드릴게요. 이 과정은 단순히 기술을 설치하는 것이 아니라, 운영 안정성을 확보하는 과정이에요.
STEP 1. 인그레스 컨트롤러 선정 및 설치
가장 먼저 해야 할 일은 어떤 컨트롤러를 사용할지 결정하는 것이에요. 가장 대중적인 선택지는 NGINX Ingress Controller예요. 설정이 유연하고 커뮤니티 지원이 강력해서 실무에서 가장 많이 쓰이죠. 만약 더 고도화된 API 게이트웨이 기능이 필요하다면 Kong이나 Traefik을 고려할 수도 있어요.
저희 팀은 NGINX를 선택했어요. 설치는 Helm을 이용하면 아주 간편해요. 하지만 설치가 끝났다고 해서 바로 사용할 수 있는 건 아니에요. 설치 직후에는 컨트롤러가 클러스터의 노드들과 통신할 수 있는지, 그리고 외부 로드밸런서와 제대로 연결되었는지 반드시 확인해야 해요. 컨트롤러의 Pod가 Running 상태인지, 그리고 서비스 타입이 LoadBalancer로 정상 생성되었는지를 확인하는 것이 첫걸음이에요.
STEP 2. 경로(Path) 및 호스트(Host) 기반 라우팅 설계
인그레스의 진정한 가치는 여기서 나와요. 하나의 진입점에서 여러 서비스로 트래픽을 나누는 규칙을 만드는 과정이죠. 예를 들어, `api.example.com`은 API 서비스로, `example.com/web`은 프론트엔드 서비스로 보내는 식이에요.
이때 주의할 점은 경로 매칭 규칙이에요. `/api`와 `/api/`는 다르게 인식될 수 있고, 특정 경로를 지정했을 때 하위 경로까지 모두 포함할지 결정해야 해요. 저희는 `ImplementationSpecific` 대신 `Prefix` 방식을 주로 사용하여 하위 경로까지 유연하게 포함되도록 구성했어요.
설계 예시는 다음과 같아요.
- Host 기반: `auth.myapp.com` → Auth Service / `shop.myapp.com` → Shop Service
- Path 기반: `myapp.com/users` → User Service / `myapp.com/orders` → Order Service
이렇게 설계를 마치면 YAML 파일을 통해 인그레스 리소스를 생성하게 돼요. 이 과정에서 각 서비스의 `Service Name`과 `Port`를 정확히 매칭하는 것이 매우 중요해요. 이름 하나만 틀려도 404 에러를 만나게 되니까요.
STEP 3. TLS 인증서 자동화 및 보안 강화
실무 운영에서 가장 귀찮으면서도 중요한 것이 바로 SSL/TLS 인증서 관리예요. 서비스가 늘어날수록 각 도메인에 맞는 인증서를 수동으로 적용하는 것은 불가능에 가까워요. 그래서 저희는 Cert-manager를 도입했어요.
Cert-manager를 설치하면 Let’s Encrypt와 같은 무료 인증서 발급 기관과 연동하여, 인증서의 만료를 자동으로 감지하고 갱신까지 해줘요. 개발자가 인그레스 설정 파일에 특정 Annotation만 추가하면, 시스템이 알아서 인증서를 가져오고 적용하는 구조를 만들 수 있어요. 이는 운영자의 실수로 인해 서비스가 중단되는 대형 사고를 막아주는 아주 강력한 도구예요.
인증서 설정 시 Secret의 이름이 인그레스 리소스에 정의된 이름과 정확히 일치하는지 확인하세요. 이름이 다르면 트래픽이 암호화되지 않은 HTTP로 전달되거나 접속 자체가 차단될 수 있어요.
STEP 4. 카나리(Canary) 배포를 통한 트래픽 제어
인그레스 운영의 꽃은 바로 트래픽 분할 기능이에요. 새로운 버전의 서비스를 배포할 때, 모든 사용자에게 한꺼번에 노출하는 것은 위험해요. 인그레스를 활용하면 트래픽의 일부(예: 5%)만 새로운 버전으로 보내는 카나리 배포를 아주 쉽게 구현할 수 있어요.
NGINX Ingress Controller를 사용한다면 `nginx.ingress.kubernetes.io/canary`라는 어노테이션을 활용하면 돼요. 이를 통해 서비스 안정성을 검증하면서 점진적으로 트래픽을 늘려갈 수 있죠. 저희는 이 기능을 통해 신규 기능 배포 시 발생하는 장애를 80% 이상 줄일 수 있었어요. 만약 새 버전에서 에러율이 높아지면 즉시 트래픽 비율을 0으로 낮춰 기존 버전으로 복구할 수도 있어요.
STEP 5. 모니터링 및 성능 최적화
마지막 단계는 운영 중인 인그레스의 상태를 관찰하는 것이에요. 트래픽이 몰릴 때 응답 시간이 느려지지는 않는지, 5xx 에러가 급증하지는 않는지 실시간으로 확인해야 해요. 저희는 Prometheus와 Grafana를 연동하여 인그레스의 메트릭을 시각화했어요.
주요 모니터링 지표는 다음과 같아요.
- Request Rate: 초당 요청 수 (RPS)
- Latency: 요청 처리 시간 (P95, P99 지표 확인 필수)
- Error Rate: 4xx 및 5xx 응답 코드 비율
- Bandwidth: 인그레스를 통과하는 총 데이터 양
모니터링을 통해 특정 경로에서 지연이 발생한다면, 인그레스 컨트롤러의 설정값(Timeout, Max Connections 등)을 튜닝하거나 백엔드 서비스의 리소스를 조절하는 등의 조치를 취할 수 있어요. 이러한 인그레스 적용기의 과정은 서비스의 성장에 따라 끊임없이 반복되는 순환 구조예요.
자주 하는 실수와 해결법 + FAQ
인그레스를 운영하다 보면 예상치 못한 벽에 부딪히기 마련이에요. 제가 직접 겪었거나 팀원들이 흔히 저지르는 실수들을 정리했어요. 이 내용만 숙지해도 삽질 시간을 절반으로 줄일 수 있어요.
자주 하는 실수와 해결법
❌ 실수: Ingress Class를 지정하지 않아 컨트롤러가 동작하지 않음
왜 발생하는가: 클러스터에 여러 개의 컨트롤러가 있거나, 어떤 컨트롤러가 이 인그레스를 관리할지 명시하지 않았기 때문이에요.
✅ 해결법: 인그레스 리소스 설정에 spec.ingressClassName을 정확히 입력하세요.
❌ 실수: 경로 설정 시 트레일링 슬래시(/) 문제로 404 에러 발생
왜 발생하는가: `/api`로 설정했는데 클라이언트가 `/api/`로 요청하거나 그 반대인 경우, 경로 매칭 규칙에 어긋나기 때문이에요.
✅ 해결법: 인그레스 설정의 Rewrite Target 기능을 사용하거나, 클라이언트의 요청 규칙을 통일하세요.
❌ 실수: SSL 인증서 적용 후 브라우저에서 보안 경고 발생
왜 발생하는가: 인증서가 담긴 Secret이 엉뚱한 네임스페이스에 있거나, 인증서 체인이 불완전하기 때문이에요.
✅ 해결법: Secret이 인그레스 리소스와 동일한 네임스페이스에 있는지 확인하고, Cert-manager 로그를 통해 인증서 발급 상태를 점검하세요.
❌ 실수: 대용량 파일 업로드 시 413 Request Entity Too Large 에러
왜 발생하는가: 인그레스 컨트롤러의 기본 클라이언트 바디 크기 제한에 걸렸기 때문이에요.
✅ 해결법: nginx.ingress.kubernetes.io/proxy-body-size 어노테이션을 사용하여 허용 용량을 늘려주세요.
❌ 실수: 타임아웃 설정 미비로 인한 연결 끊김
왜 발생하는가: 데이터 처리가 오래 걸리는 API 호출 시 인그레스의 기본 타임아웃 시간이 지나버리기 때문이에요.
✅ 해결법: proxy-read-timeout 등의 값을 서비스 특성에 맞게 조절하세요.
자주 묻는 질문
Q. NGINX와 Kong 중 무엇을 선택하는 게 좋을까요?
단순히 트래픽 라우팅과 SSL 관리가 주 목적이라면 가볍고 설정이 쉬운 NGINX를 추천해요. 하지만 인증, 속도 제한(Rate Limiting), 복잡한 플러그인 기능이 포함된 API 게이트웨이 역할까지 원하신다면 Kong이 더 강력한 기능을 제공해요.
Q. 인그레스 하나에 너무 많은 서비스를 넣어도 괜찮나요?
트래픽 규모에 따라 다르지만, 하나의 컨트롤러가 너무 많은 규칙을 처리하면 성능 저하가 올 수 있어요. 서비스의 성격(예: 내부용 vs 외부용)에 따라 컨트롤러를 분리하여 운영하는 것이 안정적이에요.
Q. 인그레스 설정이 변경되었을 때 반영이 느린 것 같아요.
컨트롤러가 새로운 설정을 읽어와서 내부 엔진을 재시작하거나 리로딩하는 과정이 필요해요. 설정이 복잡할수록 이 시간이 길어질 수 있으니, 설정을 변경할 때는 영향을 받는 서비스가 있는지 항상 확인해야 해요.
Q. 서비스가 늘어나면 인그레스도 자동으로 늘어나나요?
인그레스 리소스 자체는 설정 파일일 뿐이라 늘어나지 않아요. 대신 이를 처리하는 인그레스 컨트롤러(Pod)가 HPA(Horizontal Pod Autoscaler)를 통해 자동으로 확장되도록 설정해야 트래픽 증가에 대응할 수 있어요.
인그레스 운영을 마치며: 다음 단계로 나아가기
지금까지 인그레스 운영 사례를 통해 구축부터 트러블슈팅까지 살펴보았어요. 인그레스는 단순히 문을 만드는 것이 아니라, 우리 서비스로 들어오는 모든 손님을 맞이하는 스마트한 안내 데스크를 만드는 과정이에요. 처음에는 설정 하나하나가 어렵게 느껴질 수 있지만, 이 구조를 잘 잡아두면 서비스가 커져도 운영의 무게를 훨씬 가볍게 가져갈 수 있어요.
- 서비스마다 로드밸런서를 만드는 대신 인그레스로 통합하여 비용을 절감하세요.
- NGINX Ingress Controller를 활용해 L7 계층의 유연한 라우팅을 구현하세요.
- Cert-manager를 도입해 SSL/TLS 인증서 관리를 자동화하세요.
- 카나리 배포 기능을 활용해 신규 버전의 안정성을 검증하세요.
- Prometheus와 Grafana로 실시간 트래픽 지표를 반드시 모니터링하세요.
- 설정 변경 시 타임아웃과 바디 크기 제한을 반드시 체크하세요.
인그레스 설정을 마쳤다면 이제 다음 단계로 나아갈 차례예요. 기술적인 설정을 넘어, 실제 운영 환경에서의 안정성을 높이는 작업들이 기다리고 있어요.
- 오늘 할 일: 현재 사용 중인 서비스들의 트래픽 패턴을 분석하고 인그레스 도입 시 예상되는 비용 절감액 계산해 보기
- 이번 주 할 일: 테스트 환경에 Cert-manager를 설치하고 자동 인증서 발급 프로세스 완성하기
- 실행 직전 할 일: 인그레스 컨트롤러의 리소스 제한(Resource Limit) 설정을 통해 안정적인 Pod 운영 환경 만들기
실습 환경에서 직접 적용해 보시다가 막히는 부분이 있다면 언제든 댓글로 질문을 남겨 주세요. 함께 고민하면 해결 방법을 찾을 수 있을 거예요!
함께 읽으면 좋은 글: 쿠버네티스 인그레스 기본 개념 글, 클러스터 구축 입문 글