
인그레스 운영 사례를 통해 배우는 트래픽 관리의 핵심
마이크로서비스 아키텍처(MSA)를 구축하고 처음 서비스를 배포했을 때, 가장 먼저 마주하는 벽은 외부에서 어떻게 내부 서비스로 안전하게 요청을 보낼 것인가 하는 문제예요. 처음에는 단순히 NodePort를 쓰거나 서비스마다 LoadBalancer를 하나씩 생성해서 해결하려고 했어요. 하지만 서비스가 10개, 20개로 늘어나면서 클라우드 비용은 천정부지로 솟구치고, 관리해야 할 엔드포인트는 엉망이 되어버렸어요.
서비스 하나당 외부 IP가 하나씩 할당되는 상황은 운영자에게 재앙과 같아요. 도메인 관리도 복잡해지고, SSL 인증서를 서비스마다 개별적으로 적용하는 것은 거의 불가능에 가까워지죠. 이런 혼란 속에서 저희 팀이 선택한 해결책이 바로 인그레스(Ingress)였어요. 인그레스는 클러스터의 입구에서 교통정리를 해주는 숙련된 안내원 역할을 수행해 줘요.
단순히 이론적인 개념을 넘어, 실제로 서비스를 운영하며 겪었던 생생한 경험을 나누려고 해요. 인그레스를 도입하기 전의 혼돈부터, 실제 설정 과정에서 만난 수많은 오류, 그리고 이를 어떻게 극복하고 최적화했는지에 대한 모든 과정을 담았어요. 이 글을 끝까지 읽으시면 실무에서 인그레스를 어떻게 구성하고 관리해야 하는지 명확한 감을 잡으실 수 있을 거예요.
이 글에서 다루는 핵심 내용은 다음과 같아요.
- 인그레스 도입 전후의 인프라 구조 변화와 비용 효율성
- Nginx 인그레스 컨트롤러를 활용한 실전 설정 단계
- SSL/TLS 인증서 자동화를 위한 Cert-manager 활용법
- 실무에서 가장 자주 발생하는 트러블슈팅 사례와 해결책
인그레스 도입 전 반드시 체크해야 할 준비 사항
인그레스를 설치한다고 해서 모든 문제가 마법처럼 해결되는 것은 아니에요. 본격적으로 설정을 시작하기 전에 우리 클러스터의 상태와 요구사항을 냉정하게 분석해야 해요. 준비 없이 도입했다가는 오히려 트래픽 병목 현상이 발생하거나 보안 구멍이 생길 수 있기 때문이에요.
먼저, 현재 서비스들이 어떻게 외부와 통신하고 있는지 파악해야 해요. 만약 모든 서비스가 각기 다른 LoadBalancer 타입을 사용하고 있다면, 클라우드 비용 청구서를 먼저 확인해 보세요. 인그레스 도입의 가장 큰 목적 중 하나는 비용 절감과 관리 포인트의 단일화니까요.
또한, 사용할 인그레스 컨트롤러를 결정해야 해요. 가장 대중적인 Nginx Ingress Controller부터 클라우드 네이티브한 환경에 최적화된 Traefik, 혹은 AWS 환경이라면 ALB Ingress Controller를 고려할 수 있어요. 각 컨트롤러마다 지원하는 어노테이션(Annotation)과 기능이 다르기 때문에 신중한 선택이 필요해요.
인그레스는 ‘규칙(Rule)’을 정의하는 리소스이고, 실제 트래픽을 처리하는 엔진은 ‘인그레스 컨트롤러’예요. 인그레스 리소스만 만든다고 트래픽이 흐르지 않는다는 점을 꼭 기억하세요!
트래픽 노출 방식 비교
도입 결정에 도움을 드리기 위해, 기존 방식과 인그레스 방식의 차이를 표로 정리해 보았어요.
| 방식 | 관리 편의성 | 비용 효율성 | 주요 용도 |
|---|---|---|---|
| NodePort | 매우 낮음 | 매우 높음 | 테스트 및 내부 통신 |
| LoadBalancer | 보통 | 매우 낮음 | 단일 서비스 노출 |
| Ingress | 매우 높음 | 매우 높음 | 다중 서비스 및 도메인 운영 |
위 표에서 볼 수 있듯이, 서비스 규모가 커질수록 Ingress는 선택이 아닌 필수적인 요소가 돼요. 인그레스를 도입하기 전에는 반드시 도메인 관리 주체, SSL 인증서 발급 방식, 그리고 트래픽 분산 전략이 수립되어 있어야 해요.
실전 인그레스 적용 과정과 최적화 단계
이제 본격적으로 인그레스를 클러스터에 올리고 실제 트래픽을 흘려보내는 과정을 단계별로 살펴볼게요. 저희 팀이 이커머스 플랫폼을 운영하며 실제로 적용했던 시나리오를 바탕으로 구성했어요. 단순히 명령어를 입력하는 것을 넘어, 왜 이렇게 설정해야 하는지에 집중해서 읽어주세요.
STEP 1. 인그레스 컨트롤러 설치와 기본 구성
가장 먼저 해야 할 일은 트래픽을 받아줄 엔진인 컨트롤러를 설치하는 것이에요. 저희는 가장 범용적이고 레퍼런스가 많은 Nginx Ingress Controller를 선택했어요. 설치는 Helm을 사용하는 것이 가장 빠르고 정확해요.
Helm 차트를 사용하여 설치하면, 컨트롤러 자체가 하나의 서비스로 클러스터 내에 존재하게 돼요. 이때 중요한 점은 컨트롤러가 할당받는 서비스의 타입이 LoadBalancer여야 한다는 것이에요. 이렇게 하면 클라우드 제공업체로부터 하나의 공인 IP를 할당받게 되고, 모든 트래픽은 이 단일 통로를 통해 들어오게 돼요. 설치 후에는 반드시 kubectl get pods -n ingress-nginx 명령어를 통해 컨트롤러가 정상적으로 Running 상태인지 확인해야 해요.
STEP 2. 도메인 연결과 TLS/SSL 인증서 자동화
인그레스의 진가는 보안 설정에서 드러나요. 서비스마다 인증서를 직접 설치하는 것은 불가능에 가깝죠. 그래서 저희는 Cert-manager를 도입하여 Let’s Encrypt 인증서를 자동으로 발급받고 갱신하도록 구성했어요.
먼저 Cert-manager를 설치한 뒤, ClusterIssuer라는 리소스를 생성해요. 이것은 인증서를 어디서 가져올지, 어떤 방식으로 검증할지를 정의하는 설정이에요. 이후 인그레스 설정 파일(YAML)에 tls: 섹션을 추가하고 사용할 Secret 이름을 지정하기만 하면 돼요. 설정이 완료되면 Cert-manager가 알아서 도메인 소유권을 확인하고 인증서를 가져와 Secret에 저장해 줘요. 브라우저 주소창에 초록색 자물쇠가 뜨는 순간의 안도감은 정말 말로 표현하기 어려울 정도예요.
STEP 3. 경로 기반 및 호스트 기반 라우팅 설정
인그레스의 핵심 기능은 들어온 요청의 URL을 보고 적절한 서비스로 배달하는 것이에요. 저희는 두 가지 방식을 혼합해서 사용했어요. 첫째는 호스트 기반 라우팅이에요. 예를 들어 api.example.com은 API 서버로, web.example.com은 프론트엔드 서버로 보내는 식이죠.
둘째는 경로 기반 라우팅이에요. 하나의 도메인 아래에서 example.com/orders는 주문 서비스로, example.com/products는 상품 서비스로 나누어 보낼 수 있어요. 이때 주의할 점은 pathType 설정이에요. Prefix를 사용할지, Exact를 사용할지에 따라 매칭되는 경로의 범위가 달라지므로, 서비스의 API 구조를 잘 파악하고 설정해야 해요. 잘못 설정하면 404 에러를 마주하게 될 거예요.
STEP 4. 트래픽 제어와 보안을 위한 어노테이션 활용
기본 설정만으로는 실제 운영 환경의 거친 트래픽을 견디기 어려워요. 그래서 저희는 Nginx 인그레스가 제공하는 다양한 Annotation을 적극적으로 활용했어요. 운영 중 예상치 못한 트래픽 폭주가 발생했을 때 서비스를 보호하기 위한 필수 작업이에요.
예를 들어, 특정 API에 과도한 요청이 몰리는 것을 방지하기 위해 nginx.ingress.kubernetes.io/limit-rps 어노테이션을 사용하여 초당 요청 수를 제한했어요. 또한, 이미지 업로드와 같이 큰 파일이 오가는 서비스의 경우 nginx.ingress.kubernetes.io/proxy-body-size 설정을 통해 기본 제한 값을 늘려주어야 해요. 이 설정을 놓치면 사용자가 파일을 올릴 때마다 413 Request Entity Too Large 에러를 보게 될 거예요.
어노테이션을 잘못 입력하면 인그레스 설정 전체가 적용되지 않을 수 있어요. 설정 변경 후에는 반드시
kubectl describe ingress 명령어로 설정이 정상적으로 반영되었는지 확인하는 습관을 가져야 해요.STEP 5. 모니터링 및 성능 지표 확인
마지막 단계는 눈에 보이지 않는 트래픽을 시각화하는 것이에요. 인그레스 컨트롤러가 잘 작동하고 있는지, 에러율이 높아지지는 않았는지 실시간으로 확인해야 해요. 저희는 Prometheus와 Grafana를 연동하여 인그레스의 지표를 모니터링하고 있어요.
Grafana 대시보드에서는 초당 요청 수(RPS), 응답 시간(Latency), 그리고 4xx/5xx 에러 발생 빈도를 한눈에 볼 수 있어요. 만약 특정 시점에 5xx 에러가 급증한다면, 인그레스 설정 문제인지 아니면 백엔드 서비스 자체가 죽은 것인지 빠르게 판단할 수 있는 근거가 돼요. 이 모니터링 체계가 갖춰져야 비로소 ‘운영’을 하고 있다고 말할 수 있어요.
실제 운영 환경에서는 인그레스 컨트롤러의 리소스(CPU, Memory) 할당량(Requests/Limits)을 충분히 확보하는 것이 매우 중요해요. 컨트롤러 자체가 병목이 되면 모든 서비스가 느려지기 때문이에요.
자주 하는 실수와 해결법
인그레스를 운영하다 보면 누구나 한 번쯤은 머리를 쥐어뜯게 만드는 순간을 마주하게 돼요. 저희 팀이 실제로 겪었던 시행착오를 바탕으로 정리해 드릴게요.
- ❌ Service 포트 번호 불일치 → 인그레스 리소스에 적은 포트와 실제 서비스(Service)의
targetPort가 다를 때 발생해요. →kubectl get svc로 정확한 포트를 다시 확인하세요. - ❌ SSL Secret 누락 → TLS 설정을 넣었지만 실제 Secret이 생성되지 않았을 때 404나 인증서 오류가 떠요. → Cert-manager의 로그를 확인하여 인증서 발급 과정을 추적하세요.
- ❌ PathType 설정 오류
Prefix와Exact를 혼동하면 의도치 않은 경로로 요청이 전달돼요. → 서비스의 경로 구조에 맞춰pathType을 신중히 결정하세요. - ❌ Annotation 오타
대소문자나 하이픈 하나만 틀려도 설정이 무시돼요. → 반드시 공식 문서를 대조하며 작성하세요. - ❌ DNS 전파 지연
새 도메인을 연결했을 때 바로 접속되지 않는 것은 지극히 정상이에요. →dig명령어로 DNS 레코드가 정상적으로 업데이트되었는지 확인하세요.
자주 묻는 질문
Q. 인그레스와 로드밸런서 서비스의 차이가 정확히 무엇인가요?
로드밸런서 서비스는 클라우드에서 제공하는 외부 IP를 직접 사용하여 하나의 서비스에 연결하는 방식이고, 인그레스는 하나의 외부 IP(로드밸런서)를 공유하면서 내부의 여러 서비스로 경로를 나누어 주는 스마트한 게이트웨이 역할을 해요.
Q. 인그레스를 사용하면 성능이 떨어지지는 않나요?
트래픽이 한 곳을 거쳐가기 때문에 아주 미세한 지연 시간(Latency)이 추가될 수는 있어요. 하지만 관리 효율성과 비용 절감 효과가 훨씬 크기 때문에, 대부분의 실무 환경에서는 인그레스를 사용하는 것이 훨씬 이득이에요.
Q. 하나의 인그레스 리소스에 여러 도메인을 넣을 수 있나요?
네, 가능해요. rules 섹션 아래에 서로 다른 host를 여러 개 정의하면 하나의 인그레스 컨트롤러가 여러 도메인을 나누어서 처리할 수 있어요.
Q. 404 Not Found 에러가 뜨는데 어디를 먼저 봐야 할까요?
가장 먼저 인그레스 리소스의 path와 pathType이 요청 URL과 정확히 일치하는지 확인하세요. 그다음은 인그레스가 바라보고 있는 serviceName과 port가 맞는지 체크해야 해요.
Q. 인증서 갱신이 안 될 때는 어떻게 하나요?
Cert-manager의 로그를 확인하는 것이 첫 번째예요. 주로 DNS-01 또는 HTTP-01 검증 과정에서 권한 문제나 네트워크 차단으로 인해 실패하는 경우가 많아요.
인그레스 운영을 마무리하며 전달하는 핵심 요약
지금까지 인그레스 도입부터 실전 적용, 그리고 트러블슈팅까지 긴 여정을 함께했어요. 인그레스는 단순한 설정 도구가 아니라, 복잡한 마이크로서비스 세계의 질서를 잡아주는 핵심 인프라예요. 오늘 배운 내용을 잊지 않도록 아래 요약을 꼭 확인해 보세요.
- 인그레스는 단일 진입점을 통해 비용을 절감하고 관리를 단순화해요.
- Nginx 인그레스 컨트롤러는 가장 안정적인 선택지 중 하나예요.
- Cert-manager를 사용해 SSL/TLS 인증서 관리를 자동화하세요.
- Annotation을 활용해 타임아웃과 요청 크기 등 실전 설정을 보완하세요.
- Prometheus와 Grafana를 통해 트래픽 지표를 반드시 모니터링하세요.
- 설정 변경 후에는 항상
describe명령어로 상태를 검증하세요.
이제 이론은 충분해요. 이론을 아는 것과 실제 클러스터에서 명령어를 치며 에러를 만나는 것은 완전히 다른 차원의 경험이니까요.
🚀 오늘 바로 실천해 보세요!
- 오늘 할 일: 현재 운영 중인 서비스들의 LoadBalancer 사용 현황과 비용을 파악해 보세요.
- 이번 주 할 일: 테스트 클러스터에 Helm을 이용해 Nginx 인그레스 컨트롤러를 설치해 보세요.
- 실행 직전 할 일: Cert-manager를 설치하고 도메인 연결을 위한 인증서 발급 테스트를 진행해 보세요.
실습 환경에서 직접 적용해 보다가 막히는 부분이 있다면 언제든 댓글로 질문을 남겨 주세요. 여러분의 시행착오가 쌓여 진짜 실력이 될 거예요. 더 깊이 있는 쿠버네티스 운영법이 궁금하다면 쿠버네티스 인그레스 기본 개념 글이나 클러스터 구축 입문 글도 함께 읽어보시는 것을 추천해요.