본문 바로가기
IT/k8s

[k8s] 쿠버네티스 Ingress Controller 비교: Nginx, Traefik, HAProxy 장단점 분석

by 수누다 2026. 5. 18.

[쿠버네티스] Ingress Controller 비교: Nginx, Traefik, HAProxy 장단점 분석

안녕하세요, 13년차 인프라 엔지니어입니다. 쿠버네티스를 운영하면서 가장 자주 마주하는 고민 중 하나가 바로 외부 트래픽을 어떻게 효율적으로 서비스에 연결할까 하는 부분일 겁니다. 저도 처음엔 NodePort나 LoadBalancer 서비스만으로 충분하다고 생각했어요. 하지만 서비스가 많아지고, TLS(Transport Layer Security) 인증서 관리나 경로 기반 라우팅 같은 복잡한 요구사항들이 생기면서 Ingress(인그레스, 외부 트래픽 진입점)의 중요성을 절실히 깨달았습니다.

특히 어떤 Ingress Controller를 사용해야 할지 결정하는 건 늘 어려운 선택이었어요. Nginx, Traefik, HAProxy... 저마다 장단점이 명확해서 어떤 상황에 어떤 걸 써야 좋을지 항상 고민하게 되더라고요. 제가 홈랩과 실제 프로덕션 환경에서 다양한 Ingress Controller들을 직접 써보고 겪었던 삽질 경험을 바탕으로, 오늘은 이 세 가지 주요 Ingress Controller들의 특징과 장단점을 꼼꼼하게 비교해 보려고 합니다. 혹시 어떤 Ingress Controller를 선택해야 할지 막막하셨다면, 이 글이 여러분의 고민을 덜어줄 수 있기를 바랍니다!

그림 1: 쿠버네티스 Ingress Controller를 통한 외부 트래픽 라우팅 개요

1. 쿠버네티스 Ingress Controller, 왜 필요한가?

쿠버네티스 클러스터 내의 애플리케이션들은 기본적으로 클러스터 내부에서만 접근 가능합니다. 외부에서 이 서비스들에 접근하게 하려면 몇 가지 방법이 있죠. 대표적으로 NodePortLoadBalancer 타입의 Service를 사용하는 건데요.

  • NodePort: 모든 워커 노드의 특정 포트를 열어서 서비스에 접근하게 합니다. 간단하지만 포트 관리가 어렵고, 트래픽 분산 기능을 직접 구현해야 하는 단점이 있어요.
  • LoadBalancer: 클라우드 제공업체의 로드밸런서를 프로비저닝하여 외부 IP를 통해 서비스에 접근하게 합니다. 편리하지만, 서비스 하나당 로드밸런서가 하나씩 할당되어 비용 부담이 커질 수 있고, 복잡한 라우팅 규칙을 적용하기 어렵습니다.

여기서 Ingress가 등장합니다. Ingress는 클러스터 외부에서 내부 서비스로 들어오는 HTTP/HTTPS 트래픽을 관리하는 API 오브젝트예요. 쉽게 말해, '외부 트래픽의 문지기' 역할을 한다고 보시면 됩니다. 하나의 외부 IP와 포트를 통해 여러 서비스로 트래픽을 분산하고, 도메인 기반 라우팅, 경로 기반 라우팅, TLS 종료(Termination) 등을 처리할 수 있게 해줍니다.

그리고 이 Ingress 리소스에 정의된 규칙들을 실제로 읽고 구현하여 트래픽을 라우팅해주는 것이 바로 Ingress Controller입니다. Ingress Controller는 클러스터 내부에서 Pod 형태로 동작하며, Ingress 리소스의 변경을 감지하고, 그 규칙에 따라 실제 로드밸런싱 설정을 동적으로 업데이트합니다. 마치 웹 서버나 리버스 프록시처럼 동작하는 셈이죠. 결국 Ingress는 '규칙'이고, Ingress Controller는 그 '규칙을 실행하는 엔진'이라고 이해하시면 편할 겁니다.

2. 주요 Ingress Controller 심층 비교 분석

자, 이제 본론으로 들어가서 우리가 주로 사용하는 세 가지 Ingress Controller인 Nginx, Traefik, HAProxy를 하나씩 파헤쳐 봅시다. 제가 직접 써보면서 느꼈던 장단점과 팁들을 솔직하게 공유해 드릴게요.

2.1. Nginx Ingress Controller: 국룰에는 이유가 있죠

Nginx Ingress Controller는 아마 쿠버네티스 환경에서 가장 널리 사용되는 Ingress Controller일 겁니다. 그만큼 안정성과 기능 면에서 검증된 솔루션이라고 할 수 있죠. 저도 처음 쿠버네티스를 도입했을 때 Nginx Ingress부터 시작했습니다.

  • 장점
    • 압도적인 안정성과 성능: Nginx 자체가 고성능 웹 서버이자 리버스 프록시로 유명하죠. Ingress Controller도 그 명성에 걸맞게 안정적이고 뛰어난 성능을 보여줍니다.
    • 풍부한 기능과 설정 옵션: HTTP/HTTPS 라우팅, URL 리라이트(Rewrite), 세션 어피니티(Session Affinity), WAF(Web Application Firewall) 연동 등 다양한 기능을 지원합니다. Nginx 설정 파일에 익숙하다면 복잡한 룰도 구현하기 쉬워요.
    • 넓은 사용자층과 커뮤니티: 워낙 많은 사람이 사용하다 보니, 문제가 생겼을 때 정보를 찾거나 도움을 받기 정말 쉽습니다. Stack Overflow나 GitHub 이슈 등 자료가 많아요.
    • 익숙함: 리눅스에서 Nginx 좀 다뤄봤다 하는 분들은 설정 방식이 익숙해서 빠르게 적응할 수 있습니다.
  • ⚠️ 단점
    • 설정의 복잡성: Nginx ConfigMap이나 Annotation을 통해 Nginx 설정을 직접 제어하는 방식이라, 처음에는 복잡하게 느껴질 수 있어요. 특히 고급 설정으로 가면 Nginx 문법을 알아야 하는 경우가 많습니다.
    • 동적 설정의 제약: Nginx의 특성상 설정 변경 시 리로드가 필요한 경우가 있는데, Ingress Controller가 내부적으로 처리하긴 하지만 완전히 실시간으로 모든 설정을 변경하기는 어렵습니다.
    • CRD(Custom Resource Definition) 미활용: 다른 Ingress Controller들이 CRD를 적극 활용하여 쿠버네티스 네이티브한 설정 경험을 제공하는 반면, Nginx는 Annotation 의존도가 높은 편입니다.

제가 실제로 Nginx Ingress Controller를 사용하면서 느꼈던 건, "역시 국룰은 다르구나" 하는 점이었어요. 대규모 환경에서도 끄떡없이 잘 돌아갔고, 웬만한 라우팅 규칙은 다 구현할 수 있었거든요. 다만, 개발팀에서 새로운 경로를 자주 추가하거나 변경할 때마다 Ingress 리소스를 수정하고 적용하는 과정이 조금 번거롭다고 느낄 때가 있었습니다.

2.2. Traefik Ingress Controller: 개발자를 위한 자동화 끝판왕

Traefik Ingress Controller클라우드 네이티브 환경에 최적화된 HTTP 리버스 프록시 및 로드 밸런서예요. 특히 동적인 환경에서 그 진가를 발휘하는데, 저도 홈랩에서 간단한 서비스들을 올릴 때 Traefik을 정말 유용하게 쓰고 있습니다.

  • 장점
    • 뛰어난 동적 설정 기능: 쿠버네티스 Ingress 리소스뿐만 아니라 Service, Deployment 등 다양한 쿠버네티스 리소스를 감지하여 자동으로 라우팅 규칙을 생성합니다. CRD를 적극 활용해서 쿠버네티스 친화적인 설정 경험을 제공해요.
    • 자동 TLS 인증서 관리 (Let's Encrypt): Traefik의 가장 강력한 기능 중 하나입니다. Let's Encrypt와 연동하여 도메인에 대한 TLS 인증서를 자동으로 발급받고 갱신해줍니다. 💡 이거 진짜 편하더라고요! 제가 직접 인증서 갱신하느라 삽질했던 시간이 정말 아깝게 느껴질 정도였습니다.
    • 내장 대시보드: Traefik의 설정과 현재 라우팅되고 있는 서비스들의 상태를 한눈에 볼 수 있는 웹 대시보드를 제공해요. 디버깅이나 모니터링에 정말 유용하거든요.
    • 경량화 및 빠른 시작: Nginx 대비 가볍고 빠르게 시작할 수 있어 개발 환경이나 소규모 클러스터에 특히 적합합니다.
  • ⚠️ 단점
    • Nginx 대비 상대적으로 작은 커뮤니티: 물론 Traefik도 큰 커뮤니티를 가지고 있지만, Nginx만큼은 아닙니다. 아주 특수한 설정이나 문제 발생 시 정보 탐색이 조금 어려울 수 있어요.
    • 고급 설정 시 학습 곡선: 기본적인 설정은 쉽지만, Nginx에서 제공하는 복잡하고 미세한 튜닝 옵션들을 Traefik에서 구현하려면 Traefik의 설정 방식을 익혀야 합니다.
    • 성능: 대부분의 경우 충분하지만, 극단적인 고성능 트래픽 처리나 특정 벤치마크에서는 Nginx가 우위를 보일 수 있어요.

저는 Traefik을 처음 써봤을 때, 자동 Let's Encrypt 기능에 정말 감탄했습니다. 홈랩에 여러 서비스 올리면서 매번 인증서 발급받고 갱신하는 게 귀찮았거든요. Traefik은 이런 번거로움을 한 방에 해결해 줘서 개발자들이 정말 좋아할 만한 툴이라고 생각해요. 동적으로 서비스가 추가되거나 스케일 아웃될 때도 설정 변경 없이 알아서 라우팅 해주는 점도 매우 편리했습니다.

2.3. HAProxy Ingress Controller: 성능과 유연성의 끝판왕

HAProxy Ingress Controller고성능과 높은 유연성이 필요한 환경에서 빛을 발합니다. HAProxy는 이미 오랜 시간 동안 다양한 프로덕션 환경에서 검증된 강력한 로드 밸런서예요. L4(전송 계층) 및 L7(애플리케이션 계층) 로드 밸런싱 기능을 모두 지원하며, 매우 정교한 트래픽 제어가 가능하죠.

  • 장점
    • 극강의 성능과 안정성: HAProxy 자체의 강력한 성능을 그대로 가져옵니다. 대규모 트래픽 처리와 높은 동시 접속 처리에 매우 강해요.
    • 고급 로드 밸런싱 기능: 다양한 로드 밸런싱 알고리즘(Round Robin, Least Connections, Source IP Hashing 등), 세션 유지, 헬스 체크, 서버 가중치 부여 등 섬세한 제어가 가능합니다.
    • L4/L7 지원: 단순히 HTTP/HTTPS뿐만 아니라 TCP 트래픽에 대한 로드 밸런싱도 지원하여 더 넓은 범위의 애플리케이션에 적용할 수 있어요.
    • 매우 유연한 설정: HAProxy의 설정 문법을 통해 매우 복잡하고 정교한 트래픽 처리 룰을 구현할 수 있습니다.
  • ⚠️ 단점
    • 상대적으로 높은 복잡성: Nginx나 Traefik에 비해 설정 파일이 복잡하고, HAProxy 자체의 문법에 대한 이해가 필요해요. 학습 곡선이 좀 가파른 편입니다.
    • 동적 설정의 제약: Nginx와 유사하게, HAProxy의 설정을 동적으로 변경하는 데는 어느 정도 제약이 있습니다. 물론 Ingress Controller가 이를 최적화하지만, Traefik처럼 완전한 자동화를 기대하기는 어렵습니다.
    • 적은 사용자층: Nginx나 Traefik에 비해 쿠버네티스 Ingress Controller로서의 사용자층은 상대적으로 적은 편이에요.

제가 HAProxy Ingress Controller를 써봤던 경험은, "이건 진짜 성능이 중요하거나, 표준적인 Ingress로는 부족한 복잡한 요구사항이 있을 때 쓰는 거구나" 하는 느낌이었습니다. 특히 특정 TCP 포트를 외부로 노출하면서 부하 분산을 해야 할 때 아주 유용하더라고요. 하지만 일반적인 웹 서비스 라우팅에는 Nginx나 Traefik이 더 적합하다고 느꼈어요. 굳이 HAProxy의 강력한 기능을 다 쓰지 않으면서 복잡한 설정을 감당할 필요는 없으니까요.

그림 2: 주요 Ingress Controller들의 핵심 특징 비교

3. 어떤 Ingress Controller를 선택해야 할까요? (선택 가이드)

세 가지 Ingress Controller의 특징을 살펴봤으니, 이제 여러분의 환경과 요구사항에 맞춰 어떤 것을 선택해야 할지 가이드라인을 제시해 드릴게요. "정답은 없다"는 말이 식상하게 들릴 수도 있지만, 인프라 엔지니어의 세계에서는 정말 맞는 말입니다. 각자의 상황에 맞는 최적의 선택이 중요하거든요. 💡

아래 표는 각 Ingress Controller의 주요 특성을 비교하여 선택에 도움을 주기 위한 것입니다.

기준 Nginx Ingress Controller Traefik Ingress Controller HAProxy Ingress Controller
성능 및 안정성 매우 우수 (검증됨) 우수 (대부분의 경우 충분) 최고 (고성능, L4/L7)
설정 복잡도 중 (Annotation, ConfigMap 이해 필요) 하 (CRD 기반, 자동화 강점) 상 (HAProxy 문법 이해 필요)
동적 설정 중 (리로드가 필요할 수 있음) 최상 (실시간, 자동 감지) 중 (Nginx와 유사)
TLS 관리 수동 또는 cert-manager 연동 자동 (Let's Encrypt 내장) 수동 또는 cert-manager 연동
커뮤니티/자료 매우 풍부 풍부 상대적으로 적음
주요 사용 시나리오 일반적인 웹 서비스, 레거시 시스템, 익숙함 중시 클라우드 네이티브, 개발 환경, 자동화, Let's Encrypt 활용 극단적 고성능, 복잡한 L4/L7 규칙, 특정 TCP 서비스

그림 3: 환경과 요구사항에 따른 Ingress Controller 선택 결정 가이드

요약하자면:

  • 가장 보편적이고 안정적인 선택을 원한다면? ➡️ Nginx Ingress Controller. 특히 Nginx에 대한 경험이 많고, 대규모 서비스에서 검증된 안정성을 추구한다면 좋은 선택입니다.
  • 설정의 간결함과 자동화를 선호한다면? ➡️ Traefik Ingress Controller. 특히 Let's Encrypt 자동화와 동적인 서비스 환경에 강점을 보여요. 개발팀이 빠르게 서비스를 배포하고 테스트하는 환경에 안성맞춤입니다.
  • 극단적인 성능이나 L4/L7 고급 기능이 필요하다면? ➡️ HAProxy Ingress Controller. 표준 Ingress로는 해결하기 어려운 복잡한 트래픽 제어나 특정 TCP 서비스 로드 밸런싱에 적합해요. 다만 학습 곡선과 설정 복잡도를 감수해야 합니다.

4. ⚠️ 실제 겪은 삽질 경험과 트러블슈팅 팁

제가 이 바닥에서 13년을 구르면서 느낀 건, 아무리 좋은 툴이라도 삽질은 피할 수 없다는 겁니다. 특히 Ingress Controller는 외부와 내부를 잇는 중요한 컴포넌트라 문제가 생기면 서비스 전체가 먹통이 될 수 있죠. 제가 겪었던 몇 가지 삽질 경험과 해결 팁을 공유해 드릴게요.

  1. Ingress Controller Pod가 Pending 상태? 권한 문제!
    처음 Ingress Controller를 배포했을 때 Pod가 계속 Pending 상태거나 CrashLoopBackOff에 빠지는 경우가 있었습니다. 확인해보니 대부분 RBAC(Role-Based Access Control) 권한 문제더라고요. Ingress Controller는 Ingress, Service, Endpoint 같은 쿠버네티스 리소스들을 읽고 변경해야 하므로, 충분한 권한을 가진 ServiceAccount, ClusterRole, ClusterRoleBinding이 제대로 설정되어 있어야 합니다. 공식 문서의 배포 YAML을 꼭 참고해서 필요한 권한들을 잘 설정해주세요.
  2. TLS 인증서 적용이 안 돼요! Secret 이름 확인 필수!
    HTTPS를 적용하려고 Ingress 리소스에 tls 섹션을 추가했는데, 브라우저에서 계속 "안전하지 않은 연결" 경고가 뜨는 겁니다. 며칠을 헤맸는데, 알고 보니 Ingress 리소스의 secretName 필드에 오타가 있었어요! 🤦‍♂️ 쿠버네티스에서 Secret은 대소문자를 구분하고, 이름 하나라도 틀리면 인식이 안 됩니다. Ingress 리소스의 tls.secretName과 실제 Secret 오브젝트의 metadata.name이 정확히 일치하는지 꼼꼼히 확인해야 합니다. cert-manager를 사용하면 이런 수동적인 오류를 많이 줄일 수 있어서 강력히 추천합니다!
  3. 외부에서 접근이 안 돼요! Service 타입이 문제?
    Ingress Controller 자체는 잘 동작하는데, 외부에서 Ingress IP로 접근이 안 되는 경우가 있었습니다. 이건 대부분 Ingress Controller Service의 타입 설정 문제였어요. 클라우드 환경에서는 보통 type: LoadBalancer를 사용해서 외부 IP를 할당받는데, 온프레미스 환경이나 특정 클러스터에서는 type: NodePortHostPort를 사용해야 할 수도 있습니다. 클러스터의 네트워크 구성과 환경에 맞는 Service 타입을 선택하는 것이 중요해요. MetalLB 같은 온프레미스 로드밸런서 솔루션도 고려해볼 만합니다.
  4. 동일 포트 충돌! 여러 Ingress Controller 사용 시 주의!
    간혹 하나의 클러스터에 여러 종류의 Ingress Controller를 배포하려는 경우가 있습니다. 예를 들어 Nginx와 Traefik을 같이 쓰는 거죠. 이때 주의해야 할 점은 각 Ingress Controller가 사용하는 외부 포트가 겹치지 않아야 한다는 겁니다. 예를 들어 Nginx가 80/443 포트를 NodePort로 사용하고 있는데, Traefik도 동일한 포트로 NodePort를 열려고 하면 충돌이 발생합니다. 각 Ingress Controller에 고유한 외부 포트나 별도의 LoadBalancer Service를 할당해야 합니다.

5. Ingress Controller 동작 검증 및 결과 확인

Ingress Controller와 Ingress 리소스를 배포하고 나면, 제대로 동작하는지 확인하는 과정이 필수입니다. 제가 주로 사용하는 몇 가지 방법을 알려드릴게요.

    1. Ingress 리소스 상태 확인
      가장 먼저 kubectl get ingress 명령어로 Ingress 리소스가 잘 생성되었는지 확인합니다. ADDRESS 컬럼에 Ingress Controller의 외부 IP 주소가 할당되었는지 봐야 해요.
kubectl get ingress -n my-namespace
# 출력 예시:
# NAME             CLASS    HOSTS              ADDRESS          PORTS     AGE
# my-app-ingress   nginx    myapp.example.com   192.168.1.100    80, 443   5m

그리고 kubectl describe ingress <ingress-name> 명령어로 Ingress 리소스의 상세 정보를 확인합니다. Rules 섹션에 정의한 라우팅 규칙들이 제대로 표시되는지, Events 섹션에 오류는 없는지 확인해야 해요.

    1. Ingress Controller Pod 로그 확인
      Ingress Controller Pod의 로그를 확인하는 것은 문제 해결의 첫걸음입니다. kubectl logs -f <ingress-controller-pod-name> -n <ingress-controller-namespace> 명령어로 실시간 로그를 보면서 트래픽이 들어올 때 어떤 동작을 하는지, 오류 메시지는 없는지 파악할 수 있습니다.
    2. 외부에서 curl 테스트
      가장 확실한 방법은 Ingress Controller의 외부 IP(또는 도메인)로 직접 curl 명령어를 날려보는 겁니다.
curl -v http://myapp.example.com/path
curl -v https://myapp.example.com/secure-path

HTTP 응답 코드(200 OK 등)와 실제 서비스의 응답이 제대로 오는지 확인하세요. 특히 HTTPS의 경우 인증서 정보가 올바르게 나오는지도 함께 확인해야 합니다.

  1. Traefik 대시보드 확인 (Traefik 사용 시)
    Traefik Ingress Controller를 사용한다면, 내장된 대시보드를 통해 현재 활성화된 라우터, 서비스, 미들웨어 등의 상태를 시각적으로 확인할 수 있어요. 대시보드 접근 설정은 Traefik 배포 시 함께 구성해야 합니다. 🎉

6. 마무리하며: 13년차 엔지니어의 선택, 그리고 다음 단계

오늘은 쿠버네티스 Ingress Controller의 핵심 플레이어인 Nginx, Traefik, HAProxy의 장단점을 비교하고, 어떤 상황에 어떤 컨트롤러가 적합한지 제 경험을 바탕으로 이야기해 봤습니다.

다시 한번 정리해 보면:

  • Nginx Ingress Controller: 안정성, 성능, 범용성 측면에서 가장 검증된 선택이에요. 대부분의 웹 서비스 환경에 무난하게 적용할 수 있습니다.
  • Traefik Ingress Controller: 동적인 환경, 빠른 개발 주기, 그리고 Let's Encrypt 자동화가 중요하다면 최고의 선택입니다. 홈랩이나 개발/테스트 환경에서 빛을 발하죠.
  • HAProxy Ingress Controller: 극강의 성능과 복잡한 L4/L7 로드 밸런싱 규칙이 필요할 때 고려해볼 만합니다. 하지만 학습 곡선이 높다는 점을 인지해야 해요.

저 같은 13년차 엔지니어에게 "그래서 뭘 추천하냐?"고 물어보신다면... 사실 정답은 없습니다. 😅 하지만 저의 개인적인 경험으로는, 일반적인 웹 서비스라면 Nginx Ingress Controller로 시작해서 안정성을 확보하고, 개발팀의 빠른 배포와 Let's Encrypt 자동화가 절실하다면 Traefik을 고려하는 편입니다. HAProxy는 정말 특수한 경우에만 꺼내 드는 비장의 무기 같은 느낌이랄까요?

Ingress Controller는 쿠버네티스 클러스터의 '얼굴'과 같은 존재입니다. 여러분의 서비스 특성과 운영 환경을 충분히 고려해서 최적의 선택을 하시길 바랍니다. 다음 글에서는 특정 Ingress Controller를 Helm 차트를 이용해 실제로 배포하고 설정하는 과정을 좀 더 자세히 다뤄보도록 하겠습니다. 그때까지 즐거운 쿠버네티스 여정 되세요! 💪

그림 4: Nginx, Traefik, HAProxy Ingress Controller 최종 요약 비교