
인그레스 운영 사례가 왜 실무에서 중요할까요
개발팀에서 마이크로서비스 아키텍처(MSA)를 도입하고 서비스 개수가 늘어나기 시작하면 반드시 마주하는 벽이 있어요. 바로 서비스마다 각각의 로드밸런서를 할당해야 하는 비용과 관리의 복잡성 문제예요. 처음에는 서비스가 몇 개 안 되니까 서비스마다 로드밸런서를 하나씩 붙여도 큰 문제가 없다고 느껴져요. 하지만 서비스가 10개, 20개로 늘어나는 순간 매달 청구되는 클라우드 비용 고지서를 보고 깜짝 놀라게 돼요.
단순히 비용 문제만 있는 건 아니에요. 각 서비스마다 개별적인 공인 IP를 관리해야 하고, 도메인을 연결할 때마다 설정해야 하는 작업이 기하급수적으로 늘어나요. 운영팀 입장에서는 관리 포인트가 너무 많아져서 실수가 생길 확률도 높아지고요. 이런 혼란을 겪던 팀이 인그레스 운영 사례를 참고하여 구조를 개선한 경험은 정말 값진 자산이 되었어요.
실제로 현업에서 인그레스를 도입하면 트래픽을 한곳으로 모아 효율적으로 배분할 수 있고, 보안 인증서(TLS) 관리도 훨씬 간편해져요. 하지만 단순히 설치만 한다고 모든 문제가 해결되지는 않아요. 잘못된 경로(Path) 설정 하나 때문에 서비스가 접속되지 않거나, 설정 하나 실수해서 전체 트래픽이 끊기는 아찔한 상황도 빈번하게 발생하거든요.
이 글에서는 제가 직접 겪은 인그레스 운영 사례를 바탕으로, 어떤 문제 상황에서 인그레스를 도입했는지, 그리고 실제 적용 과정에서 어떤 설정들을 거쳐 최적화했는지를 생생하게 들려드릴게요. 이론적인 설명보다는 실무에서 바로 써먹을 수 있는 구체적인 경험을 담았어요.
이 글을 읽고 나면 다음과 같은 내용을 확실히 가져가실 수 있어요.
- 인그레스 도입이 필요한 구체적인 비용 및 운영적 배경
- 인그레스 컨트롤러 선정 기준과 핵심 설정 방법
- 실제 적용 과정에서 겪은 트래픽 라우팅 이슈와 해결책
- 운영 효율을 높여주는 모니터링 및 확장 전략
인그레스 도입 전 반드시 체크해야 할 준비 사항
인그레스를 무턱대고 설치하기 전에 우리 클러스터의 현재 상태를 먼저 점검해야 해요. 인그레스는 그 자체로 동작하는 것이 아니라, 트래픽을 실제로 처리해 줄 인그레스 컨트롤러가 반드시 필요하기 때문이에요. 흔히 사용하는 Nginx Ingress Controller나 클라우드 네이티브한 ALB(Application Load Balancer) 컨트롤러 중 무엇을 선택할지가 첫 번째 고민이에요.
선택을 돕기 위해 기존의 로드밸런서 방식과 인그레스 방식의 차이를 비교해 보았어요. 이 표를 보면 왜 우리가 인그레스로 넘어가야 하는지 명확히 알 수 있을 거예요.
| 비교 항목 | 기존 LoadBalancer 방식 | 인그레스(Ingress) 방식 |
|---|---|---|
| 비용 효율성 | 서비스별로 개별 로드밸런서가 필요해 비용이 높음 | 하나의 로드밸런서로 여러 서비스를 처리해 매우 경제적임 |
| 도메인 관리 | 서비스마다 다른 IP/도메인 관리가 번거로움 | 도메인 하나로 다양한 경로(Path) 기반 라우팅 가능 |
| 보안(TLS) 적용 | 각 서비스마다 인증서를 개별 적용해야 함 | 인그레스 계층에서 통합적으로 인증서 관리 가능 |
| 설정 복잡도 | 클라우드 인프라 설정에 의존적임 | 쿠버네티스 리소스로 표준화된 관리 가능 |
인그레스를 도입하기로 결정했다면, 다음 세 가지 기준을 바탕으로 컨트롤러를 선택해야 해요. 첫 번째는 커뮤니티의 지원 규모예요. 문제가 생겼을 때 구글링으로 해결책을 찾기 쉬운 Nginx가 가장 유리해요. 두 번째는 기존 인프라와의 호환성이에요. AWS를 사용 중이라면 AWS Load Balancer Controller가 제공하는 기능이 매력적일 수 있어요. 세 번째는 기능의 확장성이에요. 단순히 경로 분기만 할 것인지, 아니면 복잡한 인증(Auth)이나 속도 제한(Rate Limiting)이 필요한지를 따져봐야 해요.
인그레스 컨트롤러를 도입하면 단일 장애점(Single Point of Failure)이 생길 수 있어요. 컨트롤러 자체가 죽으면 모든 서비스가 마비되기 때문에, 반드시 컨트롤러를 고가용성(HA) 구조로 구성해야 한다는 점을 잊지 마세요.
마지막으로 체크리스트를 준비해 보세요. 현재 서비스들의 도메인 체계가 잡혀 있는지, TLS 인증서를 관리할 Secret 리소스 준비는 되었는지, 그리고 트래픽 양을 예측했을 때 컨트롤러의 리소스 사양은 어느 정도가 적당할지를 미리 계산해 두는 것이 좋아요. 이 준비가 제대로 되어 있지 않으면, 도입 직후 트래픽 폭주로 인해 클러스터 전체가 휘청거리는 경험을 할 수도 있거든요.
단계별 인그레스 적용 및 운영 프로세스
이제 본격적으로 저희 팀이 겪었던 실제 적용 과정을 단계별로 살펴볼게요. 단순히 명령어를 입력하는 과정이 아니라, 왜 그런 결정을 내렸고 어떤 고민을 했는지를 중심으로 설명해 드릴게요.
STEP 1. 기존 트래픽 관리 방식의 한계 분석
저희 팀은 처음에 서비스를 하나 띄울 때마다 LoadBalancer 타입의 서비스를 생성해서 사용했어요. 서비스가 5개였을 때는 정말 편했죠. 하지만 서비스가 15개로 늘어나면서 상황이 변했어요. 우선 클라우드 비용이 예상보다 3배 이상 높게 나왔어요. 매달 수십만 원의 추가 비용이 로드밸런서 인스턴스 비용으로만 나가고 있었거든요.
게다가 운영 측면에서도 큰 불편함이 생겼어요. 각 서비스의 도메인을 관리할 때마다 DNS 레코드를 하나씩 추가해야 했고, 만약 서비스가 변경되어 IP가 바뀌면 이를 동기화하는 데 시간이 걸려 장애로 이어지는 경우도 있었어요. 무엇보다 보안팀에서 모든 서비스에 HTTPS를 강제하기 시작하면서, 15개의 서비스마다 각각 인증서를 적용하고 갱신하는 작업이 운영팀의 퇴근 시간을 늦추는 주범이 되었어요.
STEP 2. 인그레스 컨트롤러 선정 및 설치
이런 문제를 해결하기 위해 저희는 가장 표준적이고 검증된 Nginx Ingress Controller를 사용하기로 결정했어요. 설치는 헬름(Helm)을 이용해 진행했는데, 설정이 매우 간편하면서도 다양한 주석(Annotation)을 통해 미세한 제어가 가능하다는 점이 마음에 들었어요.
설치할 때 가장 신경 썼던 부분은 네임스페이스(Namespace) 분리였어요. 인그레스 컨트롤러는 클러스터 전체의 관문 역할을 하기 때문에, 일반적인 애플리케이션과 섞이지 않도록 별도의 `ingress-nginx` 네임스페이스를 만들어 독립적으로 운영했어요. 이렇게 하면 컨트롤러의 업데이트나 설정 변경이 다른 서비스에 주는 영향을 최소화할 수 있거든요.
STEP 3. 도메인 기반 라우팅과 TLS 인증서 적용
설치가 끝난 후, 가장 먼저 수행한 작업은 도메인에 따라 트래픽을 분기하는 규칙을 만드는 것이었어요. 예를 들어 `example.com/api`로 들어오는 요청은 백엔드 서비스로, `example.com/web`으로 들어오는 요청은 프런트엔드 서비스로 보내는 식이죠.
이 과정에서 인그레스 리소스를 작성할 때 경로(Path) 설정을 아주 신중하게 해야 했어요. Prefix 방식과 Exact 방식의 차이를 제대로 이해하지 못하면, 엉뚱한 서비스로 요청이 흘러 들어가는 일이 발생하거든요. 저희는 대부분의 경우 `/api`와 같이 접두사를 기준으로 하는 Prefix 방식을 사용하여 유연하게 대응했어요.
또한, 보안을 위해 TLS 인증서 적용도 병행했어요. Cert-manager라는 도구를 활용해 Let’s Encrypt 인증서를 자동으로 발급받고 갱신하도록 구성했어요. 인그레스 리소스에 인증서가 담긴 Secret 이름만 적어주면, Nginx가 알아서 HTTPS 통신을 처리해 주니 운영 부담이 정말 획기적으로 줄어들었어요. 이제 더 이상 서비스 하나하나마다 인증서 설정을 고민할 필요가 없어진 거예요.
STEP 4. 실제 트래픽 유입과 성능 모니터링
모든 설정이 끝나고 실제 트래픽을 흘려보냈을 때, 저희가 가장 먼저 확인한 것은 응답 지연 시간(Latency)이었어요. 인그레스라는 중간 단계를 하나 더 거치게 되면 아주 미세하게라도 지연이 생길 수 있기 때문이에요. 다행히 Nginx의 성능은 매우 뛰어났고, 기존 로드밸런서 방식과 비교했을 때 체감할 수 있는 차이는 거의 없었어요.
하지만 트래픽이 몰리는 피크 시간대에는 CPU 사용량이 급격히 튀는 현상이 관찰되었어요. 이를 위해 프로메테우스(Prometheus)와 그라파나(Grafana)를 연결해 인그레스 컨트롤러의 메트릭을 시각화했어요. 요청 수, 에러율(4xx, 5xx), 응답 시간 등을 실시간으로 보면서 컨트롤러의 자원 사용량을 정밀하게 관찰할 수 있게 되었어요. 이 모니터링 데이터는 나중에 컨트롤러의 사양을 결정하는 아주 중요한 근거가 되었답니다.
STEP 5. 트래픽 폭주 대비 오토스케일링 설정
마지막으로 진행한 핵심 작업은 HPA(Horizontal Pod Autoscaler)를 이용한 인그레스 컨트롤러의 자동 확장 설정이었어요. 특정 이벤트로 인해 갑자기 접속자가 몰리면, 인그레스 컨트롤러의 Pod 개수가 자동으로 늘어나도록 만들었죠.
단순히 Pod 개수만 늘린다고 끝이 아니에요. 컨트롤러가 늘어날 때 로드밸런서가 이 새로운 Pod들을 즉시 인식할 수 있도록 설정하는 것이 핵심이었어요. 이 과정을 통해 저희 서비스는 갑작스러운 트래픽 변동에도 안정적으로 대응할 수 있는 체력을 갖추게 되었어요. 인그레스 도입 하나만으로 비용 절감, 관리 효율화, 그리고 안정성 확보라는 세 마리 토끼를 모두 잡을 수 있었던 셈이죠.
인그레스 설정 시 사용할 수 있는 유용한 어노테이션(Annotation) 예시예요.
nginx.ingress.kubernetes.io/proxy-body-size: 파일 업로드 크기 제한 설정nginx.ingress.kubernetes.io/rewrite-target: 경로 재작성 규칙 설정nginx.ingress.kubernetes.io/limit-rps: 초당 요청 수 제한(Rate Limiting)
자주 하는 실수와 해결법
인그레스를 처음 운영하다 보면 누구나 한 번쯤은 당황스러운 상황을 마주하게 돼요. 저희 팀이 겪었던 실제 사례들을 바탕으로 정리해 보았으니, 비슷한 상황이 생긴다면 꼭 참고해 보세요.
❌ 경로(Path) 설정 오류로 인해 404 에러가 발생해요
왜 발생하는가: 인그레스의 Path 규칙이 실제 애플리케이션이 기대하는 경로와 일치하지 않기 때문이에요. 예를 들어 애플리케이션은 `/users`로 시작하는데 인그레스는 `/api/users`로 요청을 보내고 있다면 매칭이 안 돼요.
✅ 해결법: `rewrite-target` 어노테이션을 사용하여 인그레스가 받은 경로를 애플리케이션이 원하는 경로로 변환해 주거나, 애플리케이션의 베이스 경로를 인그레스 설정에 맞춰 조정하세요.
❌ 대용량 파일 업로드 시 413 Request Entity Too Large 에러가 떠요
왜 발생하는가: Nginx의 기본 파일 업로드 제한 용량이 생각보다 작기 때문이에요.
✅ 해결법: 인그레스 리소스의 어노테이션에 `nginx.ingress.kubernetes.io/proxy-body-size` 값을 원하는 용량(예: 50m)으로 명시해 주세요.
❌ TLS 인증서 적용 후 사이트에 ‘안전하지 않음’ 경고가 떠요
왜 발생하는가: Secret 리소스에 인증서가 제대로 담기지 않았거나, 인그레스 설정에서 `tls` 섹션을 누락했을 가능성이 커요.
✅ 해결법: `kubectl get secret` 명령어로 인증서가 올바르게 생성되었는지 확인하고, 인그레스 YAML 파일의 `spec.tls` 부분에 해당 Secret 이름이 정확히 적혀 있는지 다시 한번 점검하세요.
❌ 백엔드 서비스로 요청이 전달되지 않고 타임아웃이 발생해요
왜 발생하는가: 서비스의 포트(Port) 설정이 잘못되었거나, 인그레스 컨트롤러와 백엔드 Pod 간의 네트워크 통신이 차단되었을 때 발생해요.
✅ 해결법: 인그레스가 가리키는 `serviceName`과 `servicePort`가 실제 서비스 리소스와 정확히 일치하는지 확인하고, 네트워크 정책(NetworkPolicy)이 통신을 막고 있지는 않은지 체크하세요.
❌ 헤더(Header) 정보가 유실되어 인증에 실패해요
왜 발생하는가: 프록시 서버를 거치면서 클라이언트의 실제 IP나 호스트 정보가 사라지는 경우가 있어요.
✅ 해결법: `use-forwarded-headers` 설정을 활성화하여 클라이언트의 원본 정보를 전달하도록 설정하세요.
자주 묻는 질문
Q. 인그레스 컨트롤러를 Nginx 말고 다른 걸 써도 괜찮을까요?
물론이에요. 클라우드 환경에 최적화된 기능을 원한다면 AWS ALB 컨트롤러를, 가볍고 빠른 성능을 원한다면 Kong이나 Traefik 같은 대안도 아주 훌륭한 선택지예요. 다만, 처음 시작하신다면 자료가 가장 많은 Nginx를 강력히 추천드려요.
Q. 서비스가 너무 많아지면 인그레스 컨트롤러 하나로 감당이 안 되지 않을까요?
인그레스 컨트롤러는 수천 개의 규칙도 충분히 처리할 수 있도록 설계되어 있어요. 다만, 컨트롤러 자체의 리소스(CPU/Memory)가 부족해지면 전체 서비스에 영향을 주므로, 앞서 말씀드린 것처럼 HPA를 통해 컨트롤러의 규모를 유연하게 조절하는 것이 핵심이에요.
Q. 인그레스와 로드밸런서(Service Type: LoadBalancer)를 같이 쓸 수도 있나요?
네, 가능해요. 보통 로드밸런서는 인그레스 컨트롤러를 노출하는 용도로 하나만 사용하고, 개별 서비스들은 인그레스 뒤에 숨겨서 관리하는 것이 가장 이상적인 구조예요.
Q. 경로 기반 라우팅을 할 때 보안상 위험한 점은 없나요?
하나의 IP(로드밸런서)로 여러 서비스가 접속하기 때문에, 만약 컨트롤러 자체가 해킹당하면 모든 서비스가 위험해질 수 있어요. 그래서 컨트롤러의 보안 패치를 주기적으로 진행하고, 컨트롤러 접근 권한을 엄격히 관리하는 것이 중요해요.
인그레스 운영을 위한 최종 점검과 다음 단계
지금까지 실제 인그레스 운영 사례를 통해 도입 배경부터 설정, 문제 해결까지 모두 살펴보았어요. 인그레스는 단순한 기술적 도구가 아니라, 클라우드 비용을 절감하고 운영 효율을 극대화하는 전략적인 선택이에요. 처음에는 설정할 것이 많아 복잡해 보일 수 있지만, 한 번 제대로 구축해 두면 운영의 차원이 달라지는 것을 느끼실 수 있을 거예요.
- 비용 절감을 위해 서비스별 로드밸런서 대신 인그레스를 도입하세요.
- Nginx 인그레스 컨트롤러는 가장 안정적이고 자료가 풍부한 선택지예요.
- 인그레스 컨트롤러는 반드시 고가용성(HA) 구조로 구성해야 해요.
- 경로(Path) 설정 시 Prefix와 Exact 방식의 차이를 명확히 구분하세요.
- TLS 인증서는 Cert-manager를 활용해 자동화하는 것이 운영에 유리해요.
- 트래픽 변동에 대비해 컨트롤러에 HPA 설정을 반드시 적용하세요.
자, 이제 배운 내용을 바탕으로 실천할 차례예요. 너무 거창하게 시작하기보다는 작은 테스트 환경에서부터 차근차근 적용해 보는 것을 추천드려요.
- 오늘 할 일: 테스트용 쿠버네티스 클러스터에 Helm을 설치하고 Nginx 인그레스 컨트롤러를 배포해 보세요.
- 이번 주 할 일: 간단한 웹 서비스 두 개를 띄우고, 인그레스를 통해 경로 기반 라우팅이 잘 되는지 확인해 보세요.
- 실행 직전 할 일: 실제 운영 환경에 적용하기 전, 위에서 언급한 ‘자주 하는 실수’ 리스트를 체크리스트로 만들어 점검하세요.
직접 적용해 보시다가 설정이 꼬이거나 예상치 못한 에러 메시지가 나온다면, 주저하지 말고 댓글로 질문을 남겨 주세요. 함께 고민하며 해결해 나가면 좋겠습니다. 실습 환경에서 직접 명령어를 입력해 보는 것만큼 확실한 공부는 없으니까요!
관련해서 더 깊이 있는 내용이 궁금하시다면 아래 글들도 함께 읽어보시면 큰 도움이 될 거예요.
– 쿠버네티스 인그레스 기본 개념 완벽 정리 글
– 안정적인 쿠버네티스 클러스터 구축 입문 가이드