
인그레스 도입이 절실했던 순간들
새로운 마이크로서비스를 배포할 때마다 클라우드 비용 고지서를 보며 한숨을 내쉰 적이 있나요? 서비스가 하나둘 늘어날 때마다 각각 별도의 LoadBalancer 타입을 생성하다 보면, 어느새 수십 개의 공인 IP가 할당되고 비용은 감당하기 힘들 정도로 불어나요. 서비스 간의 라우팅 규칙을 관리하는 것도 점점 복잡해지죠.
단순히 포트를 열어주는 NodePort 방식으로는 보안과 확장성 문제를 해결하기 어렵고, 매번 새로운 외부 IP를 관리하는 일은 운영 팀의 업무 부담을 가중시켜요. 서비스가 10개를 넘어가는 시점부터는 체계적인 입구 관리가 반드시 필요해져요.
이런 문제를 겪고 있는 백엔드 개발자나 데브옵스 엔지니어를 위해 준비했어요. 인그레스 운영 사례를 통해 실제 환경에서 어떻게 트래픽을 효율적으로 제어하고 비용을 절감했는지 생생하게 공유할게요.
이 글을 읽고 나면 다음과 같은 내용을 얻어갈 수 있어요.
- 서비스 타입별 차이점과 인그레스 선택 기준
- 실무에서 바로 쓰는 인그레스 설정 및 구성 단계
- 트래픽 제어를 위한 고급 라우팅 기법
- 운영 중 마주치는 흔한 오류와 해결 방법
인그레스 적용 전 꼭 알아야 할 핵심 개념
인그레스를 무작정 설치하기 전에, 현재 우리 클러스터가 사용하는 서비스 노출 방식이 무엇인지 명확히 구분해야 해요. 단순히 ‘외부 접속이 된다’는 사실보다 어떤 계층에서 트래픽을 처리하느냐가 운영의 성패를 가르기 때문이에요.
쿠버네티스에서 외부 트래픽을 내부 서비스로 전달하는 방식은 크게 세 가지로 나뉘어요. 각 방식은 비용, 보안, 관리 편의성 측면에서 뚜렷한 차이가 있어요. 아래 표를 통해 현재 상황에 어떤 방식이 가장 적합한지 판단해 보세요.
| 서비스 타입 | 주요 특징 | 장점 | 단점 |
|---|---|---|---|
| NodePort | 모든 노드의 특정 포트를 개방 | 설정이 매우 단순함 | 포트 관리 어려움, 보안 취약 |
| LoadBalancer | 클라우드 제공자의 LB 활용 | 안정적인 외부 노출 | 서비스마다 비용 발생 |
| Ingress | L7 계층의 규칙 기반 라우팅 | 비용 절감, 경로/호스트 제어 | 컨트롤러 추가 설치 필요 |
인그레스는 단순한 연결 통로가 아니에요. L7(Application Layer) 계층에서 동작하며, HTTP 헤더, 경로(Path), 호스트(Host) 정보를 보고 트래픽을 적절한 서비스로 배달해 주는 똑똑한 안내원 역할을 수행해요. 따라서 도메인 기반의 멀티 테넌시 환경을 구축하거나, 특정 경로에 따라 다른 마이크로서비스로 연결해야 할 때 가장 강력한 힘을 발휘하죠.
인그레스 자체는 규칙을 정의하는 ‘설정값’일 뿐이에요. 실제로 트래픽을 받아 처리하는 엔진은 Ingress Controller(예: Nginx, Kong, Traefik)가 담당한다는 사실을 잊지 마세요.
준비 단계에서 체크해야 할 리스트를 정리해 드릴게요. 설정을 시작하기 전에 이 항목들이 준비되었는지 확인해 보세요.
- 사용할 도메인 네임(FQDN)이 확보되었는가?
- 인그레스 컨트롤러를 설치할 수 있는 권한이 있는가?
- SSL/TLS 인증서를 관리할 Cert-manager 같은 도구가 준비되었는가?
- 클라우드 환경이라면 인그레스 컨트롤러용 LoadBalancer 생성 권한이 있는가?
이 조건들이 충족되었다면, 이제 본격적으로 인그레스를 클러스터에 적용하고 실제 트래픽을 흘려보낼 준비가 끝난 거예요.
실전! 인그레스 구축 및 운영 5단계
이제 실제 운영 환경과 유사한 시나리오를 바탕으로 인그레스를 단계별로 구축해 볼게요. 우리가 만들 서비스는 `api.example.com`으로 들어오는 트래픽을 `/v1`은 인증 서비스로, `/v2`는 주문 서비스로 나누어 보내는 구조예요.
STEP 1. 인그레스 컨트롤러 설치하기
인그레스 규칙을 해석할 엔진이 필요해요. 가장 대중적이고 안정적인 Nginx Ingress Controller를 Helm을 이용해 설치하는 것이 가장 효율적이에요. 명령어를 통해 빠르게 배포할 수 있고, 이후 설정 변경도 용이하거든요.
먼저 헬름 레포지토리를 추가하고 설치 명령어를 실행해요. 이때 클라우드 환경이라면 컨트롤러 자체가 하나의 LoadBalancer 타입 서비스로 생성되어 외부 IP를 할당받게 돼요. 이렇게 하면 모든 서비스가 이 하나의 IP를 통해 접속할 수 있는 통로가 만들어지는 셈이죠.
설치가 완료되면 kubectl get svc -n ingress-nginx 명령어로 할당된 외부 IP를 확인해 보세요. 이 IP가 바로 우리 서비스의 유일한 대문이 될 거예요.
STEP 2. 인그레스 리소스 정의 및 경로 설정
이제 엔진(Controller)에게 어떤 규칙을 따를지 알려주는 ‘설정 파일’을 작성해야 해요. YAML 파일에 도메인 주소와 경로, 그리고 연결할 서비스 이름을 명시하는 작업이에요. 여기서 주의할 점은 경로 설정 시 슬래시(/) 처리를 정확히 해야 한다는 점이에요.
예를 들어, 다음과 같은 구성 파일을 작성할 수 있어요.
경로 기반 라우팅(Path-based Routing)을 사용할 때는 `pathType: Prefix`를 주로 사용하여 특정 경로로 시작하는 모든 요청을 해당 서비스로 보내도록 설정하는 것이 안전해요.
설정 파일에는 `host: api.example.com`과 같은 호스트 정보와, `path: /v1` -> `service: auth-svc`와 같은 매핑 정보가 포함돼요. 이 파일을 클러스터에 적용하면, 인그레스 컨트롤러가 실시간으로 감지하여 트래픽 경로를 업데이트해요. 별도의 재시작 없이도 설정이 즉시 반영된다는 것이 인그레스의 큰 장점이죠.
STEP 3. SSL/TLS 인증서 적용으로 보안 강화
실제 서비스에서 HTTP 접속은 보안상 매우 위험해요. 따라서 HTTPS 적용은 선택이 아닌 필수죠. 과거에는 인증서를 수동으로 업로드하고 관리했지만, 요즘은 Cert-manager를 사용해 Let’s Encrypt 인증서를 자동으로 발급받고 갱신하는 방식을 선호해요.
인그레스 설정 파일에 tls 섹션을 추가하고, 미리 생성된 Secret 이름을 지정해 주기만 하면 돼요. 그러면 인그레스 컨트롤러가 클라이언트와 통신할 때 해당 인증서를 사용하여 암호화된 연결을 맺어줘요. 이제 사용자는 안전하게 우리 API를 호출할 수 있게 되었어요.
STEP 4. 어노테이션(Annotation)을 활용한 고급 제어
인그레스의 진가는 Annotation을 활용할 때 나타나요. Nginx 인그레스 컨트롤러는 수많은 기능을 어노테이션 하나로 조절할 수 있게 지원해요. 예를 들어, 클라이언트의 요청 본문 크기를 제한하거나, 타임아웃 시간을 조절하는 등의 작업이 가능하죠.
실제 운영 중에는 다음과 같은 설정들이 자주 쓰여요.
nginx.ingress.kubernetes.io/proxy-body-size: 업로드 파일 용량 제한nginx.ingress.kubernetes.io/proxy-connect-timeout: 연결 타임아웃 시간 설정nginx.ingress.kubernetes.io/rewrite-target: 경로 재작성(Rewriting) 기능
특히 Rewrite Target은 매우 중요한데, 외부에서는 `/api/v1/user`로 들어오지만 내부 서비스는 `/user`라는 경로만 이해할 때, 중간에서 경로를 깎아주는 역할을 수행해 줘요. 이를 통해 서비스 코드를 수정하지 않고도 유연한 라우팅이 가능해져요.
STEP 5. 카나리(Canary) 배포로 트래픽 분할하기
새로운 버전의 서비스를 배포할 때 모든 사용자를 대상으로 바로 적용하는 것은 위험해요. 이때 인그레스의 카나리 기능을 사용하면 전체 트래픽의 일부(예: 10%)만 새 버전으로 보내서 안정성을 테스트할 수 있어요.
방법은 간단해요. 기존 인그레스와 똑같은 호스트 정보를 가진 새로운 인그레스 리소스를 만들고, nginx.ingress.kubernetes.io/canary: "true"와 nginx.ingress.kubernetes.io/canary-weight: "10" 어노테이션을 추가하면 돼요. 이렇게 하면 10%의 사용자만 새 서비스로 연결되므로, 혹시 모를 장애 발생 시에도 피해 범위를 최소화할 수 있어요. 이는 현대적인 데브옵스(DevOps) 환경에서 매우 핵심적인 운영 전략이에요.
카나리 설정을 할 때 기존 인그레스와 호스트 이름이 완전히 동일해야 하며, 가중치(weight) 설정이 정확한지 반드시 확인해야 해요. 설정 오류로 인해 트래픽이 엉뚱한 곳으로 흐를 수 있거든요.
자주 하는 실수와 해결법 및 FAQ
인그레스를 운영하다 보면 예상치 못한 에러 메시지를 마주하게 돼요. 당황하지 말고, 아래의 사례들을 통해 문제의 원인을 파악해 보세요.
자주 하는 실수와 해결법
❌ 404 Not Found 에러가 발생해요
왜 발생하는가: 인그레스에 정의된 경로(Path)와 실제 서비스가 제공하는 경로가 일치하지 않거나, pathType 설정이 잘못되었기 때문이에요.
✅ 해결법: 인그레스 설정의 경로를 확인하고, 필요하다면 rewrite-target 어노테이션을 사용하여 경로를 재작성해 주세요.
❌ 503 Service Unavailable 에러가 떠요
왜 발생하는가: 인그레스 컨트롤러가 요청을 전달할 백엔드 서비스(Pod)를 찾지 못하거나, Pod가 준비되지(Ready) 않은 상태일 때 발생해요.
✅ 해결법: kubectl get pods로 서비스의 Pod 상태를 확인하고, 서비스의 셀렉터(Selector)가 Pod의 라벨과 일치하는지 점검하세요.
❌ 504 Gateway Timeout 에러가 발생해요
왜 발생하는가: 백엔드 서비스의 처리가 너무 오래 걸려서 인그레스 컨트롤러의 기본 타임아웃 시간을 초과했기 때문이에요.
✅ 해결법: 인그레스 어노테이션을 통해 proxy-read-timeout과 proxy-send-timeout 값을 늘려주세요.
❌ SSL 핸드셰이크(Handshake) 오류가 발생해요
왜 발생하는가: 인증서가 만료되었거나, Secret에 저장된 인증서 파일 형식이 잘못되었을 때 발생해요.
✅ 해결법: kubectl get secret으로 인증서 존재 여부를 확인하고, 인증서의 도메인 이름과 실제 접속 도메인이 일치하는지 체크하세요.
❌ 트래픽이 특정 서비스로만 쏠려요
왜 발생하는가: 카나리 가중치 설정이 제대로 반영되지 않았거나, 인그레스 컨트롤러의 캐시 문제일 수 있어요.
✅ 해결법: 어노테이션 오타를 확인하고, 인그레스 컨트롤러의 로그를 살펴보며 설정 업데이트 여부를 확인하세요.
자주 묻는 질문
Q. 인그레스와 게이트웨이 API(Gateway API)의 차이는 무엇인가요?
인그레스는 기존의 표준적인 방식이지만, 설정이 단순한 만큼 복잡한 트래픽 제어를 하기에는 한계가 있어요. 게이트웨이 API는 인그레스를 보완하기 위해 나온 차세대 표준으로, 역할(Role)을 분리하여 더 세밀하고 계층적인 트래픽 관리가 가능하도록 설계되었어요. 현재는 인그레스가 주류지만, 점차 게이트웨이 API로 전환되는 추세예요.
Q. 인그레스 컨트롤러를 여러 개 운영할 수 있나요?
네, 가능해요. 예를 들어 외부 공개용 인그레스 컨트롤러와 내부 관리용 인그레스 컨트롤러를 별도로 운영하여 보안 경계를 나눌 수 있어요. 각 컨트롤러는 서로 다른 IngressClass를 사용하여 구분해요.
Q. 비용을 줄이기 위해 인그레스를 쓰는 게 정말 효과적인가요?
네, 매우 효과적이에요. 서비스마다 개별적인 LoadBalancer를 생성하면 클라우드 비용이 기하급수적으로 늘어나지만, 인그레스를 통해 하나의 LoadBalancer로 수십 개의 서비스를 라우팅하면 비용을 획기적으로 절감할 수 있어요.
Q. 인그레스 설정 변경이 실제 트래픽에 반영되는 데 시간이 얼마나 걸리나요?
보통은 수 초 내외로 아주 빠르게 반영돼요. 하지만 설정이 매우 복잡하거나 컨트롤러의 리소스가 부족한 상황이라면 약간의 지연이 생길 수 있으니 모니터링이 필요해요.
Q. Nginx 외에 다른 컨트롤러를 써도 괜찮을까요?
물론이에요. 서비스의 요구사항에 따라 Kong(API 게이트웨이 기능 강점), Traefik(클라우드 네이티브 최적화), Istio(서비스 메시 통합) 등 다양한 선택지가 있으니 환경에 맞춰 선택하시면 돼요.
성공적인 인그레스 운영을 위한 마무리
지금까지 인그레스 운영 사례를 통해 실제 서비스에 어떻게 적용하고 문제를 해결하는지 살펴보았어요. 인그레스는 단순히 트래픽을 전달하는 도구를 넘어, 서비스의 확장성과 비용 효율성을 결정짓는 핵심적인 인프라 요소예요.
- 서비스가 늘어나면 비용 절감을 위해 반드시 인그레스를 도입하세요.
- Nginx 인그레스 컨트롤러와 Helm을 사용하면 설치와 관리가 쉬워져요.
- 경로(Path)와 호스트(Host) 기반 라우팅을 적절히 활용하세요.
- 어노테이션을 통해 타임아웃, 용량 제한 등 세밀한 제어를 수행하세요.
- SSL/TLS 인증서는 Cert-manager로 자동화하는 것이 정신 건강에 이로워요.
- 카나리 배포를 활용해 배포 리스크를 최소화하세요.
운영을 시작하기 위해 오늘 바로 실행할 수 있는 단계를 제안해 드릴게요.
- 오늘 할 일: 현재 운영 중인 클러스터의 서비스 타입들을 확인하고, LoadBalancer 비용이 얼마나 발생하는지 계산해 보세요.
- 이번 주 할 일: 개발 환경(Dev/Staging)에 Nginx 인gress Controller를 설치하고 테스트용 도메인을 연결해 보세요.
- 실행 직전 할 일: 실무 적용 전, 어노테이션 설정값이 우리 서비스의 특성(예: 큰 파일 업로드 여부)과 맞는지 검토하세요.
인그레스 설정 중에 막히는 부분이 있거나, 특정 에러가 해결되지 않는다면 주저하지 말고 댓글로 질문을 남겨 주세요. 함께 고민하고 해결 방법을 찾아볼게요!
함께 읽으면 좋은 글: