
인그레스 운영 사례, 왜 지금 고민해야 할까요?
클라우드 환경에서 쿠버네티스로 서비스를 운영하다 보면 어느 순간 예상치 못한 비용 폭탄을 마주하게 돼요. 서비스 하나를 띄울 때마다 별도의 LoadBalancer 타입을 사용하여 외부 노출을 시도하다 보면, 클라우드 업체로부터 날아오는 청구서에 깜짝 놀라는 경험을 하게 됩니다. 처음에는 서비스가 몇 개 없어서 괜찮았지만, 마이크로서비스 아키텍처(MSA)로 전환하며 서비스 개수가 수십 개로 늘어나면 상황은 심각해져요.
각 서비스마다 개별적인 로드밸런서를 할당하는 방식은 비용 효율성 측면에서 매우 불리할 뿐만 아니라, 관리해야 할 엔드포인트가 너무 많아져 운영 복잡도가 기하급수적으로 상승합니다. DNS 설정부터 SSL 인증서 적용까지, 모든 서비스에 대해 동일한 작업을 반복하는 것은 개발자의 소중한 시간을 낭비하는 일이에요. 바로 이 지점에서 우리는 인그레스 운영 사례를 통해 더 효율적인 트래픽 관리 방법을 찾아야 합니다.
인그레스(Ingress)는 단순히 외부 요청을 내부로 전달하는 통로가 아니에요. 하나의 진입점을 통해 여러 서비스로 경로를 분기하고, 보안 설정을 통합하며, 트래픽의 흐름을 제어하는 스마트한 관문 역할을 수행합니다. 이번 글에서는 실제 운영 환경에서 겪었던 시행착오와 이를 인그레스로 어떻게 해결했는지, 그리고 도입 후 어떤 변화가 있었는지를 생생하게 나누어 보려고 해요.
이 글을 끝까지 읽으시면 다음과 같은 내용을 완벽하게 이해할 수 있어요.
- 로드밸런서 남발로 인한 비용 문제를 해결하는 전략
- 인그레스 컨트롤러를 선택하고 설정하는 실무 절차
- 실제 운영 중 마주하는 트래픽 제어 및 보안 적용 방법
- 도입 과정에서 겪은 뼈아픈 실수와 이를 방지하는 노하우
사전 준비, 기본 이해와 체크리스트
인그레스를 본격적으로 도입하기 전에 반드시 짚고 넘어가야 할 핵심 개념들이 있어요. 단순히 설정 파일(YAML)을 작성하는 법을 아는 것보다, 내가 구축하려는 환경이 어떤 구조로 동작하는지 이해하는 것이 훨씬 중요합니다. 인그레스는 인그레스 리소스(Ingress Resource)라는 규칙 설정 파일과, 그 규칙을 실제로 실행하는 인그레스 컨트롤러(Ingress Controller)라는 엔진으로 나뉘어 작동한다는 점을 명심하세요.
무턱대고 가장 유명한 엔진을 설치하기보다는, 우리 팀의 요구사항과 예산, 운영 역량에 맞는 컨트롤러를 선택해야 합니다. 예를 들어, 단순한 경로 기반 라우팅만 필요하다면 가벼운 설정만으로도 충분하지만, 복잡한 트래픽 제어나 서비스 메시 기능이 필요하다면 더 고도화된 솔루션을 검토해야 해요. 준비 단계에서 선택을 잘못하면 나중에 인프라 구조 전체를 뜯어고쳐야 하는 불상사가 생길 수 있습니다.
인그레스 컨트롤러 선택 기준 비교
운영 환경에서 가장 많이 고려되는 세 가지 선택지를 비교해 보았습니다. 우리 조직의 상황에 가장 적합한 모델이 무엇인지 판단해 보세요.
| 비교 항목 | Nginx Ingress | Traefik | Istio (Gateway) |
|---|---|---|---|
| 주요 특징 | 가장 대중적이며 방대한 레퍼런스 | 클라우드 네이티브 및 동적 설정 강점 | 강력한 서비스 메시 기능 포함 |
| 설정 난이도 | 중간 (Annotation 활용) | 낮음 (자동 감지 기능) | 높음 (학습 곡선 가파름) |
| 추천 상황 | 범용적인 서비스 운영 시 | 빠른 변화가 필요한 환경 | 복잡한 마이크로서비스 제어 시 |
대부분의 초기 도입 사례에서는 Nginx Ingress Controller를 가장 많이 선택해요. 커뮤니티가 워낙 활발해서 문제가 생겼을 때 구글링만으로도 해결 방법을 찾기가 매우 수월하기 때문입니다. 하지만 우리 서비스가 수백 개의 마이크로서비스로 쪼개져 있고, 서비스 간의 통신 보안과 세밀한 관찰 가능성(Observability)이 최우선이라면 Istio 같은 솔루션을 고려하는 것이 장기적으로 유리할 수 있습니다.
인그레스는 클러스터 내부의 트래픽을 관리하는 것이 아니라, 클러스터 외부에서 들어오는 트래픽을 적절한 서비스로 전달하는 역할을 수행해요. 따라서 인그레스가 제대로 작동하려면 클러스터 외부에 최소 하나 이상의 진입점(보통 LoadBalancer 타입의 서비스)이 필요합니다.
인그레스 도입을 통한 단계별 트래픽 최적화 과정
저희 팀은 기존에 서비스마다 개별 로드밸런서를 사용하던 방식에서 탈피하여, 인그레스를 중심으로 한 통합 트래픽 관리 체계를 구축하기로 결정했습니다. 이 과정은 단순히 도구를 설치하는 것을 넘어, 인프라의 구조를 재설계하는 작업이었어요. 실제 적용 과정을 5단계로 나누어 상세히 설명해 드릴게요.
STEP 1. 문제 상황 정의와 비용 구조 개선
도입 전 상황은 그야말로 비효율의 극치였습니다. 서비스가 15개였는데, 각 서비스마다 클라우드 로드밸런서가 하나씩 붙어 있었어요. 이로 인해 매달 발생하는 고정 비용이 상당했고, 무엇보다 새로운 마이크로서비스를 배포할 때마다 인프라 팀에 로드밸런서 생성을 요청해야 하는 번거로움이 있었습니다. 개발 속도가 인프라 속도에 발목을 잡히는 상황이었죠.
우선 목표를 명확히 세웠습니다. 단 하나의 외부 로드밸런서만 사용하고, 그 뒤에서 인그레스가 모든 도메인과 경로(Path)를 분기 처리하도록 만드는 것이었습니다. 이렇게 하면 클라우드 비용을 약 70% 이상 절감할 수 있을 것으로 예상했습니다.
STEP 2. Nginx Ingress Controller 설치 및 기본 설정
가장 먼저 선택한 도구는 Nginx Ingress Controller였습니다. 저희는 설치의 편의성과 설정 관리의 일관성을 위해 Helm을 사용하기로 했어요. Helm 차트를 이용하면 복잡한 설정값들을 `values.yaml` 파일 하나로 관리할 수 있어 매우 효율적입니다.
설치 과정에서 가장 신경 쓴 부분은 컨트롤러 자체의 리소스 할당량입니다. 모든 트래픽이 이 컨트롤러를 거쳐 가기 때문에, 컨트롤러가 과부하를 받으면 클러스터 전체 서비스가 마비될 수 있어요. 그래서 CPU와 메모리 제한(Limit)을 평소보다 넉넉하게 잡고, 트래픽 급증에 대비해 Horizontal Pod Autoscaler (HPA)를 설정하여 컨트롤러 Pod 자체도 자동으로 확장되도록 구성했습니다.
STEP 3. 도메인 및 경로 기반 라우팅 구현
이제 실제 서비스를 연결할 차례입니다. 저희는 두 가지 방식을 혼합하여 사용했어요. 첫 번째는 호스트(Host) 기반 라우팅이고, 두 번째는 경로(Path) 기반 라우팅입니다.
예를 들어, 메인 웹 서비스는 `example.com`으로 접속하고, API 서버는 `api.example.com`이라는 별도의 서브도메인을 사용하도록 설정했습니다. 또한, 동일한 도메인 내에서도 `/shop`으로 들어오면 쇼핑 서비스로, `/user`로 들어오면 사용자 관리 서비스로 연결되도록 경로를 나누었습니다. 이를 위해 작성한 인그레스 설정 예시는 다음과 같은 논리적 구조를 가집니다.
- `api.example.com` → `api-service:8080`
- `example.com/shop` → `shop-service:80`
- `example.com/user` → `user-service:3000`
이 설정을 통해 개발자들은 서비스가 늘어나더라도 인프라 팀의 도움 없이 스스로 인그레스 리소스만 생성하면 즉시 외부 노출을 완료할 수 있게 되었어요. 이는 개발 생산성을 비약적으로 향상시키는 결과로 이어졌습니다.
STEP 4. SSL/TLS 인증서 자동화 적용
보안은 타협할 수 없는 영역입니다. 모든 서비스에 HTTPS를 적용해야 하는데, 서비스가 늘어날 때마다 수동으로 인증서를 발급하고 갱신하는 것은 불가능에 가까웠어요. 이를 해결하기 위해 우리는 Cert-manager를 도입했습니다.
Cert-manager를 설치하고 Let’s Encrypt와 연동해 두면, 인그레스 설정에 특정 어노테이션(Annotation) 하나만 추가하는 것만으로도 인증서 발급부터 자동 갱신까지 모든 과정이 알아서 진행됩니다. 이제 더 이상 인증서 만료 날짜를 달력에 적어두고 불안해할 필요가 없게 되었어요. 보안 설정의 자동화는 운영 실수를 줄이는 가장 강력한 방법 중 하나입니다.
STEP 5. 카나리(Canary) 배포를 통한 안정적 운영
마지막으로, 새로운 버전의 서비스를 배포할 때 발생하는 리스크를 최소화하기 위해 인그레스의 Canary 기능을 활용했습니다. 신규 버전(v2)을 바로 전체 사용자에게 배포하는 대신, 전체 트래픽의 5%만 v2로 흘려보내고 나머지 95%는 기존 버전(v1)으로 유지하는 방식입니다.
만약 5%의 트래픽에서 에러율이 급증하거나 응답 시간이 느려진다면, 즉시 트래픽 비율을 0으로 돌려버리면 됩니다. 사용자들은 장애를 거의 느끼지 못한 채 서비스가 안정화될 시간을 벌 수 있죠. 이러한 정교한 트래픽 제어는 인그레스가 단순한 전달자가 아니라, 고도화된 운영 도구임을 증명해 주었습니다.
인그레스 규칙이 너무 복잡해지면 하나의 오타가 전체 클러스터의 트래픽 라우팅을 망가뜨릴 수 있습니다. 반드시 설정 적용 전 `kubectl apply –dry-run=client` 명령어로 문법을 확인하고, 테스트 환경에서 먼저 검증하는 습관을 가지셔야 해요.
자주 하는 실수와 해결법 및 FAQ
실제 운영 현장에서는 이론과 다른 수많은 변수가 발생합니다. 저희 팀이 인그레스를 운영하며 겪었던 가장 아찔했던 순간들과 그 해결책을 정리해 보았습니다.
자주 하는 실수와 해결법
❌ 실수: 404 Not Found 에러가 지속적으로 발생해요
왜 발생하는가: 인그레스의 경로(Path) 설정과 서비스의 실제 컨텍스트 경로가 일치하지 않거나, 인그레스 컨트롤러가 해당 서비스를 찾지 못할 때 발생합니다. 특히 인그레스 리소스에 정의된 서비스 이름이나 포트 번호에 오타가 있는 경우가 많아요.
✅ 해결법: `kubectl describe ingress [인그레스이름]` 명령어를 사용하여 인그레스가 바라보고 있는 엔드포인트가 올바른지 확인하세요. 또한, 컨트롤러의 로그를 살펴보고 요청이 어떤 규칙에 매칭되지 않았는지 파악하는 것이 가장 빠릅니다.
❌ 실수: 502 Bad Gateway 에러가 떠요
왜 발생하는가: 인그레스 컨트롤러는 요청을 받았지만, 뒤에 있는 Pod가 요청을 처리할 준비가 되지 않았거나 포트가 잘못 연결되었을 때 발생합니다. Pod가 CrashLoopBackOff 상태이거나, 서비스(Service)의 타겟 포트가 애플리케이션이 실제 사용하는 포트와 다를 때 자주 나타나요.
✅ 해결법: 먼저 해당 Pod의 상태가 `Running`인지 확인하고, `kubectl get endpoints` 명령어를 통해 서비스에 실제 Pod의 IP가 제대로 매핑되어 있는지 체크하세요.
❌ 실수: SSL 인증서 적용 후 접속이 안 돼요
왜 발생하는가: 인증서가 제대로 발급되지 않았거나, 인그레스 설정에 TLS 섹션이 누락되었을 때 발생합니다. 또한, Cert-manager가 인증서를 발급받는 과정에서 DNS 챌린지에 실패했을 가능성도 큽니다.
✅ 해결법: `kubectl get certificate`로 인증서 상태가 `Ready`인지 확인하세요. 만약 아니라면 `kubectl describe challenge`를 통해 인증 실패 원인을 파악해야 합니다.
❌ 실수: 트래픽이 특정 Pod로만 몰려요
왜 발생하는가: 인그레스 컨트롤러가 로드밸런싱을 수행하지만, 애플리케이션 레벨의 세션 유지(Sticky Session) 설정이 없거나, 서비스의 세션 결합(Session Affinity) 설정이 잘못되었을 때 발생합니다.
✅ 해결법: 인그레스의 어노테이션을 사용하여 `nginx.ingress.kubernetes.io/affinity: “cookie
성공적인 인그레스 운영을 위한 마무리
지금까지 인그레스 운영 사례를 통해 트래픽 관리의 효율성을 높이는 과정과 실무적인 노하우를 살펴보았습니다. 인그레스 도입은 단순히 기술적인 변화를 넘어, 클라우드 비용을 절감하고 개발팀의 운영 자율성을 확보하는 중요한 전략적 선택입니다.
처음에는 설정 하나에 서비스가 멈출까 봐 두렵기도 하겠지만, 오늘 공유해 드린 시행착오를 거울삼아 차근차근 적용해 보신다면 분명 안정적인 인프라를 구축하실 수 있을 거예요. 기술은 결국 문제를 해결하기 위해 존재하는 것이니까요.
- 인그레스는 비용 절감과 관리 통합을 위한 필수 요소예요.
- Nginx Ingress는 범용성이 높고, Cert-manager를 통한 SSL 자동화가 권장돼요.
- 경로와 호스트 기반 라우팅을 적절히 혼합하여 구조를 설계하세요.
- Canary 배포 기능을 활용하면 업데이트 리스크를 획기적으로 낮출 수 있어요.
- 404, 502 에러는 인그레스 리소스와 엔드포인트 매핑을 먼저 확인하세요.
성공적인 전환을 위해 지금 바로 시작할 수 있는 액션 플랜을 제안해 드립니다.
- 오늘 할 일: 현재 사용 중인 로드밸런서의 개수와 비용을 리스트업해 보세요.
- 이번 주 할 일: 테스트 클러스터에 Helm을 이용해 Nginx Ingress Controller를 설치해 보세요.
- 실행 직전 할 일: 실제 운영 환경에 적용하기 전, 반드시 Canary 배포 시나리오를 검증해 보세요.
실습 환경에서 직접 적용해 보시다가 막히는 부분이나, 본인만의 독특한 운영 경험이 있다면 언제든 댓글로 질문을 남겨 주세요. 함께 고민하며 더 나은 인프라를 만들어 가요!
관련하여 더 깊은 내용이 궁금하시다면 아래 글들도 함께 읽어보시길 권장합니다.