
인그레스, 왜 지금 운영 사례를 살펴봐야 할까요?
새벽 2시, 갑작스러운 트래픽 증가로 인해 클러스터 비용 고지서를 확인하며 당혹스러워했던 경험이 있나요? 서비스가 늘어날 때마다 클라우드에서 생성되는 수십 개의 LoadBalancer 비용을 보며 한숨을 쉬는 것은 많은 백엔드 개발자와 데브옵스 엔지니어들이 겪는 흔한 일이에요. 단순한 서비스 하나를 띄울 때는 문제가 없지만, 마이크로서비스 아키텍처(MSA)로 넘어가면서 관리해야 할 엔드포인트가 기하급수적으로 늘어나면 상황은 완전히 달라져요.
처음에는 각 서비스마다 NodePort를 열거나 개별 LoadBalancer를 할당하는 방식으로 대응해요. 하지만 이 방식은 IP 관리의 복잡성을 높이고, 무엇보다 클라우드 비용을 감당하기 어렵게 만들어요. 트래픽 경로가 파편화되면 보안 정책을 일괄적으로 적용하는 것도 불가능에 가까워져요. 이런 혼란을 잠재우고 효율적인 트래픽 통로를 만들기 위해 등장한 것이 바로 인그레스(Ingress)예요.
이번 글에서는 제가 실제 프로덕션 환경에서 인그레스를 도입하며 겪었던 생생한 인그레스 운영 사례를 공유하려고 해요. 단순히 이론적인 개념을 나열하는 것이 아니라, 어떤 문제를 해결하기 위해 어떤 설정을 선택했는지, 그리고 그 과정에서 어떤 실수를 저질렀는지 아주 구체적으로 다룰 예정이에요. 이 글을 끝까지 읽고 나면, 여러분의 클러스터에 최적화된 트래픽 라우팅 체계를 설계할 수 있는 실전 감각을 얻게 될 거예요.
인그레스는 쿠버네티스 클러스터 외부에서 클러스터 내부 서비스로 HTTP/HTTPS 경로를 노출하는 규칙의 집합이에요. 인그레스 리소스 자체는 동작하지 않으며, 이를 실제로 처리하는 인그레스 컨트롤러가 반드시 필요해요.
오늘 함께 살펴볼 핵심 내용은 다음과 같아요.
- 기존 방식의 한계와 인그레스 도입의 필연성
- 인그레스 컨트롤러 선정 기준과 실제 설치 과정
- 경로 및 호스트 기반 라우팅을 활용한 트래픽 제어
- SSL/TLS 인증서 자동화와 운영 중 발생한 트러블슈팅
인그레스 도입 전 반드시 체크해야 할 준비 사항
무턱대고 인그레스를 설치한다고 해서 모든 문제가 해결되는 것은 아니에요. 오히려 준비 없이 도입했다가 트래픽 흐름을 파악하지 못해 더 큰 장애를 맞이할 수도 있어요. 인그레스를 구축하기 전에 우리 클러스터의 현재 상태를 진단하고, 어떤 컨트롤러가 우리 팀의 운영 역량에 맞을지 결정하는 과정이 선행되어야 해요.
트래픽 노출 방식의 비교와 선택 기준
가장 먼저 고민해야 할 점은 현재 사용 중인 서비스 노출 방식과 인그레스의 차이를 명확히 이해하는 것이에요. 아래 표를 통해 각각의 특징을 비교해 보았으니, 우리 상황에 어떤 것이 적합할지 판단해 보세요.
| 노출 방식 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|
| NodePort | 구현이 매우 간단하고 추가 비용 없음 | 포트 범위 제한 및 보안 취약성 | 테스트 환경, 로컬 개발 |
| LoadBalancer | 클라우드 제공 안정적인 IP 제공 | 서비스당 개별 비용 발생 (매우 비쌈) | 단일 서비스 운영 시 |
| Ingress | 단일 IP로 다수 서비스 관리, 비용 절감 | 컨트롤러 설정 및 관리 복잡도 증가 | MSA, 다수 서비스 운영 시 |
만약 현재 서비스가 10개인데 각각 LoadBalancer를 사용하고 있다면, 매달 청구되는 인스턴스 비용만 해도 상당할 거예요. 인그레스는 단 하나의 LoadBalancer로 모든 트래픽을 받아 내부 규칙에 따라 분산해주기 때문에 비용 효율성 측면에서 압도적인 우위를 점해요.
도입을 위한 기술적 전제 조건
인그레스를 성공적으로 안착시키기 위해서는 다음과 같은 요소들이 준비되어 있어야 해요.
- 도메인 관리 권한: 호스트 기반 라우팅을 위해 서비스별로 연결할 도메인(예: api.example.com)이 준비되어야 해요.
- 컨트롤러 선정: Nginx, HAProxy, Traefik, Kong 등 다양한 선택지 중 우리 서비스의 요구사항(예: 고성능, Lua 스크립트 필요 여부 등)에 맞는 것을 골라야 해요.
- 네트워크 보안 지식: 외부 트래픽이 클러스터 내부로 들어오는 경로를 이해하고, 방화벽 설정을 관리할 수 있어야 해요.
인그레스 컨트롤러는 클러스터의 모든 트래픽이 통과하는 단일 장애점(Single Point of Failure)이 될 수 있어요. 따라서 컨트롤러 자체의 고가용성(HA) 확보를 위한 설계를 반드시 병행해야 해요.
준비가 끝났다면, 이제 본격적으로 실제 운영 환경에 인그레스를 어떻게 적용했는지 구체적인 단계를 통해 살펴볼게요.
인그레스 실제 적용 과정과 운영 노하우
실제 서비스 환경에 인그레스를 도입하는 과정은 단순히 명령어를 입력하는 것 이상의 고민을 필요로 해요. 저는 이 과정을 다섯 가지 핵심 단계로 나누어 진행했어요. 각 단계마다 발생했던 기술적 결정들과 그 이유를 자세히 설명해 드릴게요.
STEP 1. 트래픽 정체와 비용 문제를 해결하기 위한 컨트롤러 도입
저희 팀의 초기 상태는 서비스가 늘어날 때마다 클라우드 LoadBalancer를 하나씩 더 추가하는 방식이었어요. 서비스가 20개가 넘어가자 매달 발생하는 네트워크 비용이 서버 인스턴스 비용을 위협하기 시작했죠. 무엇보다 각 서비스마다 다른 IP를 관리하는 것이 운영팀에게는 커다란 짐이었어요.
이를 해결하기 위해 가장 널리 쓰이고 커뮤니티가 활성화된 Nginx Ingress Controller를 선택했어요. Nginx는 설정이 직관적이고, 다양한 Annotation을 통해 복잡한 라우팅 규칙을 쉽게 적용할 수 있다는 장점이 있어요. 설치는 Helm을 사용하여 클러스터 내에 배포했어요. 이때 주의할 점은 컨트롤러 자체가 사용할 LoadBalancer를 생성할 때, 트래픽을 받아줄 안정적인 엔드포인트가 확보되어야 한다는 점이에요.
STEP 2. 경로(Path) 기반 라우팅으로 API 구조 정립하기
서비스를 도메인별로 쪼개기 전, 하나의 도메인 아래에서 경로에 따라 서로 다른 마이크로서비스로 연결하는 구조를 먼저 구축했어요. 예를 들어, `/api/user`로 들어오는 요청은 사용자 서비스로, `/api/order`로 들어오는 요청은 주문 서비스로 보내는 식이죠.
이 과정을 위해 작성한 Ingress 리소스의 핵심 구조는 다음과 같아요. 단순히 경로만 지정하는 것이 아니라, rewrite-target 설정을 통해 애플리케이션 내부에서 경로를 어떻게 인식할지 결정하는 것이 매우 중요해요. 만약 인그레스에서 `/api/user`를 받지만, 실제 컨테이너 내부 서비스는 `/` 경로로 요청을 기다리고 있다면 경로 재작성 규칙을 반드시 추가해야 해요. 그렇지 않으면 애플리케이션은 404 Not Found 에러를 뱉어내며 동작하지 않게 돼요.
STEP 3. 도메인(Host) 기반 라우팅과 멀티 테넌시 구현
서비스 규모가 커지면서 하나의 도메인에 경로를 계속 추가하는 방식은 한계에 부딪혔어요. 각 팀이 독립적인 도메인을 운영하고 싶어 했기 때문이죠. 이때 활용한 것이 호스트 기반 라우팅이에요. `auth.example.com`, `shop.example.com`처럼 각 서비스에 고유한 도메인을 할당할 수 있게 되었어요.
이렇게 하면 각 서비스의 설정이 서로 간섭할 위험이 줄어들고, 팀별로 Ingress 리소스를 완전히 분리하여 관리할 수 있는 멀티 테넌시 환경을 구축할 수 있어요. 이는 배포 실수로 인해 다른 서비스의 트래픽까지 끊어버리는 대형 사고를 방지하는 데 큰 도움을 주었어요. 각 팀은 자신이 담당하는 도메인에 대해서만 권한을 가지며, Ingress 리소스를 수정할 수 있게 되었죠.
STEP 4. Cert-manager를 활용한 SSL/TLS 인증서 자동화
보안을 위해 모든 트래픽을 HTTPS로 암호화하는 것은 필수예요. 하지만 수십 개의 도메인에 대해 인증서를 수동으로 발급하고 갱신하는 것은 불가능한 일이에요. 저희는 Cert-manager를 도입하여 Let’s Encrypt 인증서를 자동으로 발급받고 갱신하는 파이프라인을 구축했어요.
인그레스 설정에 `tls` 섹션을 추가하고, Cert-manager가 생성한 Secret을 참조하도록 설정하면 끝이에요. 인증서 만료로 인한 서비스 중단 사고를 방지하기 위해, 갱신 과정이 성공했는지 확인하는 모니터링 로직도 함께 구성했어요. 이 과정에서 DNS-01 챌린지 방식을 사용하여 와일드카드 인증서(*.example.com)를 발급받았는데, 이는 수많은 서브도메인을 관리해야 하는 상황에서 매우 효율적인 선택이었어요.
STEP 5. 실전 트래픽 제어와 모니터링 체계 구축
마지막 단계는 운영의 안정성을 높이는 것이었어요. 특정 서비스에 트래픽이 몰릴 때 전체 클러스터가 흔들리지 않도록 Rate Limiting(속도 제한) 설정을 적용했어요. Nginx Ingress의 Annotation을 활용하면 매우 간단하게 초당 요청 수를 제한할 수 있어요.
또한, Prometheus와 Grafana를 연동하여 인그레스 컨트롤러의 메트릭을 실시간으로 관찰했어요. 요청 수(Request Rate), 응답 지연 시간(Latency), 에러율(Error Rate, 특히 4xx/5xx 에러)을 대시보드로 구성하여, 트래픽 이상 징내를 즉각 감지할 수 있는 체계를 만들었어요. 덕분에 특정 서비스의 API 응답이 느려지는 문제를 인그레스 단계에서 먼저 포착하여 조기에 대응할 수 있었답니다.
인그레스 설정 시 사용하는 Annotation은 컨트롤러의 종류에 따라 문법이 완전히 달라요. Nginx 컨트롤러를 쓰면서 HAProxy용 설정을 넣으면 아무런 효과가 없으므로, 반드시 사용 중인 컨트롤러의 공식 문서를 확인하세요.
자주 하는 실수와 해결법 및 FAQ
인그레스를 운영하다 보면 예상치 못한 설정 오류로 서비스가 중단되는 경우가 빈번해요. 제가 직접 겪고 동료들이 자주 실수했던 사례들을 정리해 보았어요. 이 내용만 숙지해도 운영 중 발생하는 장애의 절반은 예방할 수 있어요.
자주 하는 실수와 해결법
- ❌ 실수: 경로(Path) 설정 시 trailing slash(/) 유무를 고려하지 않음
왜 발생하는가: `/api`와 `/api/`는 서로 다른 경로로 인식될 수 있는데, 이를 간과하면 특정 요청에서 404 에러가 발생해요.
✅ 해결법: 인그레스 설정 시 경로 끝에 슬래시를 붙이거나, Nginx의 rewrite 규칙을 사용하여 경로를 정규화하세요. - ❌ 실수: Ingress와 Service의 포트 번호 불일치
왜 발생하는가: Ingress 리소스의 backend 포트와 실제 Service 리소스의 port가 일치하지 않으면 트래픽이 전달되지 않아요.
✅ 해결법: YAML 파일을 작성한 후 `kubectl describe ingress` 명령어로 트래픽이 전달될 포트 정보를 다시 한번 검증하세요. - ❌ 실수: SSL/TLS Secret 생성 실패
왜 발생하는가: Cert-manager가 인증서를 발급받기 전에 Ingress가 해당 Secret을 참조하려고 하면 에러가 발생하거나 HTTPS 접속이 안 돼요.
✅ 해결법: 인증서 발급 상태를 `kubectl get certificate`로 확인하고, Secret이 정상적으로 생성되었는지 반드시 체크하세요. - ❌ 실수: 과도한 Annotation 사용으로 인한 성능 저하
왜 발생하는가: 너무 많은 복잡한 규칙을 Nginx 설정에 넣으면, 설정이 바뀔 때마다 Nginx 프로세스가 재시작(Reload)되어 일시적인 지연이 생길 수 있어요.
✅ 해결법: 꼭 필요한 설정만 사용하고, 복잡한 로직은 애플리케이션 레이어나 별도의 서비스 메쉬(Service Mesh)를 고려하세요. - ❌ 실수: LoadBalancer IP 변경 미대응
왜 발생하는가: 클라우드 환경에서 LoadBalancer를 재생성하면 IP가 바뀔 수 있는데, 이를 DNS에 즉시 반영하지 않으면 접속이 끊겨요.
✅ 해결법: IP 변경 시 자동 업데이트를 지원하는 DNS 관리 도구를 연동하거나, 변경 알림 설정을 구축하세요.
자주 묻는 질문
Q. 인그레스 컨트롤러를 여러 개 설치해서 사용할 수 있나요?
네, 가능해요. 예를 들어, 외부 트래픽용 Nginx 컨트롤러와 내부 관리용 Traefik 컨트롤러를 분리하여 운영할 수 있어요. 이렇게 하면 보안과 관리 효율성을 동시에 높일 수 있어요.
Q. 인그레스 사용 시 비용 절감 효과는 얼마나 되나요?
서비스의 개수에 따라 다르지만, 수십 개의 LoadBalancer를 사용하는 경우 인그레스 하나로 통합하면 클라우드 비용을 70~80% 이상 절감할 수도 있어요. 다만, 컨트롤러 자체를 구동하기 위한 노드 리소스 비용은 고려해야 해요.
Q. 왜 인그레스 설정이 변경되면 트래픽이 끊기나요?
Nginx 인그레스 컨트롤러는 설정 파일이 변경되면 설정을 새로 고침(Reload)하는 과정을 거쳐요. 이 과정에서 아주 짧은 순간 연결이 끊길 수 있는데, 이를 최소화하려면 컨트롤러의 업그레이드 방식이나 동작 방식을 최적화해야 해요.
Q. API Gateway와 인그레스의 차이점은 무엇인가요?
인그레스는 쿠버네티스 클러스터로 들어오는 트래픽의 단순한 라우팅과 L7 계층의 기본 기능에 집중해요. 반면 API Gateway는 인증, 인가, 사용자별 할당량 제한(Quota) 등 훨씬 더 복잡하고 고도화된 비즈니스 로직을 처리하는 데 특화되어 있어요.
성공적인 인그레스 운영을 위한 마무리
지금까지 실제 운영 환경에서의 인그레스 도입 사례와 다양한 설정 노하우를 살펴보았어요. 처음에는 복잡해 보일 수 있지만, 한 번 제대로 구축해 놓으면 클러스터 관리의 난이도가 획기적으로 낮아지는 것을 경험하실 수 있을 거예요. 효율적인 트래픽 관리와 비용 절감, 그리고 보안이라는 세 마리 토끼를 잡기 위해 인그레스는 이제 선택이 아닌 필수라고 할 수 있어요.
- 비용과 관리 효율을 위해 LoadBalancer 대신 인그레스를 적극 활용하세요.
- Nginx 인gress Controller는 검증된 선택지이지만, 컨트롤러의 고가용성을 반드시 고려하세요.
- 경로(Path) 기반 라우팅 시 rewrite 규칙을 통해 애플리케이션 경로와 일치시키세요.
- Cert-manager를 활용하여 SSL/TLS 인증서 관리를 자동화하는 것이 정신 건강에 이로워요.
- 트래픽 모니터링을 통해 이상 징후를 즉각 감지할 수 있는 체계를 갖추세요.
이 글을 읽고 계신 여러분이 바로 실천할 수 있는 다음 단계들을 제안해 드릴게요.
- 오늘 할 일: 현재 클러스터에서 사용 중인 LoadBalancer 개수와 비용을 확인해 보세요.
- 이번 주 할 일: 개발 환경에 Nginx Ingress Controller를 설치하고 간단한 경로 기반 라우팅을 테스트해 보세요.
- 실행 직전 할 일: 실제 운영 환경 적용을 위해 Cert-manager와 연동한 인증서 자동 발급 시나리오를 검토하세요.
실습 환경에서 직접 적용해 보시다가 설정이 꼬이거나 이해가 안 되는 부분이 있다면 언제든 댓글로 질문을 남겨 주세요. 여러분의 성공적인 쿠버네티스 운영을 진심으로 응원할게요!
함께 읽으면 좋은 글:
– 쿠버네티스 인그레스 기본 개념 정리
– 클러스터 구축 입문 가이드