13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Traefik

  • [쿠버네티스] Nginx vs Traefik Ingress Controller 선택 가이드: 13년차 엔지니어의 경험담

    [쿠버네티스] Nginx vs Traefik Ingress Controller 선택 가이드: 13년차 엔지니어의 경험담

    [쿠버네티스] Nginx vs Traefik Ingress Controller 선택 가이드: 13년차 엔지니어의 경험담

    안녕하세요, 13년차 서버실을 지키는 인프라 엔지니어입니다. 쿠버네티스(Kubernetes) 환경에서 애플리케이션을 운영하다 보면, 외부 트래픽을 어떻게 효율적으로 서비스에 연결할지가 항상 큰 고민이 됩니다. 특히 여러 서비스를 운영할수록 이 문제는 더욱 복잡해지죠. 처음엔 저도 단순히 <code>NodePort나 LoadBalancer 서비스를 사용했었는데, 점점 더 많은 도메인과 복잡한 라우팅 규칙을 관리해야 하는 상황에 부딪히더라고요. 이럴 때 필요한 것이 바로 Ingress Controller(인그레스 컨트롤러)입니다.

    오늘은 제가 홈랩(Homelab)에서 Nginx Ingress Controller와 Traefik Ingress Controller를 모두 사용해보면서 겪었던 경험과 두 솔루션의 장단점을 솔직하게 비교해드릴게요. 어떤 상황에서 어떤 Ingress Controller를 선택하는 것이 좋을지 제 경험을 토대로 멘토처럼 알려드리겠습니다. 이 글이 여러분의 쿠버네티스 트래픽 관리 고민을 덜어주면 정말 좋겠어요.

    쿠버네티스 Ingress Controller의 역할과 외부 트래픽 흐름을 보여주는 아키텍처 다이어그램

    쿠버네티스 클러스터 내에서 Ingress Controller가 외부 트래픽을 서비스로 라우팅하는 전체 아키텍처를 보여주는 다이어그램입니다. 외부 로드밸런서에서 Ingress Controller로, 다시 Ingress Rule에 따라 내부 서비스로 트래픽이 흐르는 과정을 시각화합니다.

    Ingress Controller, 대체 뭘까요?

    쿠버네티스에서 Ingress(인그레스, 외부 트래픽 진입점)는 클러스터 내부의 서비스(Service)로 외부 트래픽을 라우팅하는 규칙들을 정의하는 API 오브젝트죠. 쉽게 말해, example.com으로 들어온 요청은 web-service로 보내고, api.example.com/v1으로 들어온 요청은 api-service로 보내는 것과 같은 규칙을 정의하는 거예요. 하지만 Ingress 오브젝트 자체는 단순히 규칙을 정의할 뿐, 실제로 그 규칙에 따라 트래픽을 처리하는 역할을 하지는 않습니다. 바로 이걸 실제로 처리하는 게 Ingress Controller(인그레스 컨트롤러)입니다.

    Ingress Controller는 클러스터 내부에서 실행되는 일종의 역방향 프록시(Reverse Proxy) 또는 로드 밸런서(Load Balancer)로, Ingress 리소스에 정의된 규칙을 읽어 실제 트래픽 라우팅을 수행합니다. 대표적으로 Nginx, Traefik, HAProxy, Envoy 등의 솔루션들이 Ingress Controller로 활용될 수 있습니다. 이 중에서 가장 널리 사용되고 제가 직접 많이 써본 Nginx와 Traefik을 중심으로 이야기해볼게요.

    Nginx Ingress Controller 파헤치기

    Nginx Ingress Controller는 이름에서 알 수 있듯이, 인기 있는 웹 서버이자 역방향 프록시인 Nginx를 기반으로 만들어졌습니다. 오랫동안 인프라 엔지니어들에게 사랑받아온 Nginx의 안정성과 성능을 쿠버네티스 환경에서도 활용할 수 있다는 게 가장 큰 장점이죠. 저도 예전부터 Nginx를 많이 써왔던 터라, 처음 쿠버네티스 Ingress를 접했을 때 가장 먼저 선택하게 된 솔루션입니다.

    ✅ Nginx Ingress Controller의 주요 장점

    • 높은 안정성과 성능: Nginx 자체가 워낙 안정적이고 고성능이어서, 대규모 트래픽 처리에도 강합니다.
    • 광범위한 사용처와 커뮤니티: 가장 널리 사용되는 Ingress Controller 중 하나인 만큼, 자료가 풍부하고 문제가 생겼을 때 도움을 받기 쉽습니다.
    • 풍부한 기능: Nginx의 강력한 기능을 annotation(어노테이션)을 통해 활용할 수 있습니다. (예: 리다이렉트, 인증, 로드밸런싱 알고리즘 등)

    ⚠️ Nginx Ingress Controller의 아쉬운 점

    • 설정의 복잡성: Nginx 설정 파일(nginx.conf)을 직접 다루지 않고 ConfigMap(컨피그맵)이나 annotation으로 간접적으로 설정하다 보니, 특정 고급 기능을 사용하려면 Nginx 설정 문법을 이해하고 annotation을 정확히 알아야 합니다.
    • 동적 업데이트의 한계: 새로운 Ingress 규칙을 적용하거나 기존 규칙을 변경할 때, Nginx 프로세스를 리로드(reload)하는 과정이 필요합니다. 컨트롤러가 자동으로 처리하지만, Traefik에 비해서는 동적이라는 느낌이 덜합니다.

    간단한 Nginx Ingress 리소스 예시를 볼까요? example.com으로 들어오는 요청을 my-service로 라우팅하는 설정입니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      ingressClassName: nginx
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80
    

    Traefik Ingress Controller 만나보기

    Traefik Proxy(트래픽 프록시)는 클라우드 네이티브 환경에 최적화된 최신 역방향 프록시 및 로드 밸런서입니다. 특히 쿠버네티스 Ingress Controller로서의 강점이 두드러지죠. 처음엔 이게 뭔가 싶었는데, 써보니 동적인 설정 관리가 정말 신세계더라고요.

    ✅ Traefik Ingress Controller의 주요 장점

    • 뛰어난 동적 설정: 쿠버네티스의 CRD(Custom Resource Definition, 사용자 정의 리소스 정의)를 적극 활용하여 Ingress 규칙을 실시간으로 업데이트합니다. Nginx처럼 리로딩 과정 없이 즉시 반영돼요.
    • 쉬운 설정 및 대시보드: IngressRoute와 같은 CRD를 통해 직관적인 설정이 가능하고, 웹 대시보드를 기본으로 제공하여 현재 라우팅 상태를 한눈에 파악하기 좋습니다. 저는 홈랩에서 여러 서비스를 띄울 때 이 대시보드가 정말 편하더라고요.
    • 자동 HTTPS (Let’s Encrypt): Let’s Encrypt(렛츠 인크립트)를 내장하여 도메인에 대한 HTTPS 인증서를 자동으로 발급하고 갱신해줍니다. 이거 진짜 편합니다!
    • 간결한 설정: Nginx의 복잡한 annotation 대신, 자체 CRD를 사용해 더 명확하고 간결하게 설정을 정의할 수 있습니다.

    ⚠️ Traefik Ingress Controller의 아쉬운 점

    • Nginx 대비 상대적으로 작은 커뮤니티: Nginx만큼 오랜 역사를 가진 건 아니어서, 자료나 커뮤니티 규모가 상대적으로 작을 수 있습니다. 하지만 성장세가 빠르고 공식 문서가 잘 되어 있습니다.
    • 특정 고급 기능의 복잡성: Nginx가 가진 다양한 모듈만큼의 유연성은 아닐 수 있습니다. 특정 시나리오에서는 Nginx의 annotation이 더 직관적일 때도 있습니다.

    Traefik의 IngressRoute CRD 예시입니다. Nginx Ingress와 동일하게 example.com을 my-service로 라우팅합니다.

    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: my-traefik-ingressroute
    spec:
      entryPoints:
        - web
        - websecure
      routes:
        - match: Host(`example.com`)
          kind: Rule
          services:
            - name: my-service
              port: 80
      tls:
        certResolver: myresolver # Let's Encrypt를 사용하는 경우
    

    실전 비교: Nginx vs Traefik, 어떤 걸 선택해야 할까?

    이제 두 Ingress Controller의 특징을 알았으니, 어떤 상황에서 어떤 것을 선택하는 것이 좋을지 제 경험을 토대로 비교해드릴게요. 사실 정답은 없습니다. 여러분의 환경과 요구사항에 따라 달라지는 거죠.

    Nginx Ingress Controller와 Traefik Ingress Controller의 주요 기능 및 장단점을 비교하는 표

    Nginx Ingress Controller와 Traefik Ingress Controller의 핵심적인 기능, 설정 방식, 성능, 커뮤니티 지원, 자동화 기능 등을 비교하는 표입니다. 사용자가 두 Ingress Controller 중 하나를 선택하는 데 필요한 정보를 요약하여 제공합니다.

    특징 Nginx Ingress Controller Traefik Ingress Controller
    기반 기술 Nginx 웹 서버 Golang으로 개발된 클라우드 네이티브 프록시
    설정 방식 Ingress 리소스 + Annotation, ConfigMap IngressRoute (CRD), Middlewares (CRD)
    동적 설정 변경 시 Nginx 리로드 필요 (자동화) 실시간 반영, 리로드 불필요
    HTTPS (Let’s Encrypt) 외부 Cert-Manager 등 연동 필요 내장 기능으로 자동화 용이
    관리 대시보드 별도 모니터링 툴 연동 (Prometheus, Grafana 등) 기본 제공 웹 대시보드
    커뮤니티/자료 매우 크고 풍부함 상대적으로 작지만 활발하며 성장 중
    성능 오랜 검증을 통한 고성능 클라우드 네이티브 환경에 최적화된 고성능
    사용 편의성 Nginx 지식 필요, Annotation 학습 필요 CRD 기반의 직관적인 설정, 빠른 학습 곡선

    Nginx Ingress Controller 추천하는 경우

    • 레거시 시스템과의 연동: 이미 Nginx 설정을 잘 다루는 팀이 있거나, 기존 Nginx 설정에 익숙하다면 Nginx Ingress Controller가 더 자연스럽게 느껴질 겁니다.
    • 최고의 안정성과 성능이 요구될 때: 미션 크리티컬한 서비스로, 수년간 검증된 Nginx의 안정성과 성능이 절대적으로 필요하다면 좋은 선택입니다.
    • 복잡하고 세밀한 트래픽 제어: Nginx의 다양한 모듈과 세밀한 설정을 통해 고도로 커스터마이징된 트래픽 제어가 필요할 때 유용합니다.

    Traefik Ingress Controller 추천하는 경우

    • 클라우드 네이티브 환경에 대한 높은 이해도와 선호: 쿠버네티스의 CRD를 활용한 동적인 설정에 강점이 있습니다.
    • 빠른 개발 및 배포 주기: 새로운 서비스를 자주 배포하거나 Ingress 규칙이 자주 변경되어야 하는 환경에서 실시간 업데이트는 큰 장점입니다.
    • 간편한 Let’s Encrypt 자동화: 수많은 서비스에 HTTPS를 쉽게 적용하고 싶다면 Traefik이 제공하는 자동화 기능은 정말 강력합니다. 저도 홈랩에서 이 기능 덕분에 HTTPS 적용이 너무 쉬웠어요.
    • 초보자나 소규모 환경: 대시보드와 쉬운 설정 덕분에 초보자도 빠르게 시작하고 관리할 수 있습니다.

    제가 겪었던 삽질과 해결 과정 ⚠️

    저도 처음부터 모든 걸 다 알았던 건 아니죠. 두 Ingress Controller를 사용하면서 꽤나 삽질을 많이 했습니다. 특히 몇 가지 기억에 남는 경험을 공유해볼게요.

    Nginx Ingress Controller 삽질: Annotation 지옥과 ConfigMap 캐싱

    Nginx Ingress Controller를 사용하면서 가장 많이 헷갈렸던 부분은 annotation이었습니다. Nginx의 모든 기능을 annotation으로 매핑하는 게 아니다 보니, 특정 기능(예: 커스텀 에러 페이지, 특정 헤더 추가)을 넣으려 할 때 어떤 annotation을 써야 할지, 아니면 ConfigMap을 수정해야 할지 찾는 데 시간을 많이 썼습니다. 특히 ConfigMap을 수정했을 때 바로 반영이 안 되고 캐싱 때문에 고생했던 기억도 있네요. ConfigMap을 업데이트하면 Nginx Ingress Controller Pod가 재시작되거나 설정이 리로드되는데, 이 과정에서 찰나의 순간 서비스에 영향을 줄까 봐 조마조마했던 적도 많았습니다.

    💡 해결 팁: Nginx Ingress Controller의 공식 문서에 있는 annotation 목록을 즐겨찾기에 등록해두고, ConfigMap 수정 후에는 항상 컨트롤러 로그를 확인하며 제대로 리로드되었는지 확인하는 습관을 들였습니다.

    Traefik Ingress Controller 삽질: CRD 이해와 EntryPoint 설정

    Traefik은 Nginx와는 다르게 IngressRoute라는 자체 CRD를 사용합니다. 처음엔 이 개념이 좀 낯설었어요. 특히 entryPoints와 middlewares 같은 개념들을 이해하는 데 시간이 걸렸죠. 예를 들어, 특정 포트(entryPoint)로 들어오는 요청에만 적용되는 규칙을 만들거나, 인증(middleware)을 추가하는 설정을 하려다가 몇 번이나 실패했는지 모릅니다. 특히 tls 설정에서 certResolver를 제대로 지정하지 않아서 Let’s Encrypt 자동 발급이 안 되는 문제도 겪었고요.

    # 잘못된 IngressRoute 설정 예시 (entryPoints 누락)
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: my-broken-route
    spec:
      routes:
        - match: Host(`broken.example.com`)
          kind: Rule
          services:
            - name: my-service
              port: 80
    # 이 경우, Traefik이 어떤 entryPoint로 트래픽을 받을지 몰라 동작하지 않습니다.
    

    💡 해결 팁: Traefik 공식 문서를 정독하고, 특히 entryPoints와 middlewares 개념을 확실히 이해하는 것이 중요했습니다. 그리고 IngressRoute를 배포하기 전에 항상 Traefik 대시보드를 통해 현재 설정이 어떻게 반영될지 미리 확인하는 습관을 들였어요. 대시보드만큼 직관적인 디버깅 도구가 없더라고요!

    Traefik Ingress Controller 웹 대시보드에서 서비스 목록과 라우팅 규칙을 보여주는 화면

    Traefik Ingress Controller의 웹 대시보드 스크린샷으로, 현재 활성화된 서비스와 라우팅 규칙(IngressRoutes)이 명확하게 표시되어 트래픽 흐름을 시각적으로 파악할 수 있는 화면입니다.

    결론: 당신의 환경에 맞는 Ingress Controller는?

    제가 Nginx와 Traefik을 모두 써보면서 느낀 점은, 두 Ingress Controller 모두 훌륭한 솔루션이라는 것입니다. 다만 각자의 강점과 약점이 뚜렷하다는 것이죠. Nginx는 전통적인 인프라 환경에서 익숙한 안정성과 고성능을 제공하며, 복잡한 설정에 대한 유연성을 가집니다. 반면 Traefik은 클라우드 네이티브 환경의 동적인 특성에 완벽하게 부합하며, 자동화와 사용 편의성에서 큰 강점을 보입니다.

    저의 홈랩 환경에서는 새로운 서비스를 빠르게 올리고 내리며, Let’s Encrypt로 HTTPS를 쉽게 적용해야 하는 경우가 많아서 최종적으로는 Traefik Ingress Controller를 선택하여 운영하고 있습니다. 대시보드를 통해 현재 라우팅 상황을 한눈에 볼 수 있고, 새로운 IngressRoute를 배포하면 바로 적용되는 그 편리함이 정말 매력적이었거든요. 물론 Nginx도 여전히 중요한 역할을 하는 곳이 많습니다. 여러분의 팀 문화, 기존 인프라 스택, 그리고 프로젝트의 요구사항을 신중하게 고려하여 쿠버네티스 트래픽 관리에 최적의 선택을 하시길 바랍니다.

    Nginx Ingress Controller와 Traefik Ingress Controller의 핵심 차이점을 요약한 인포그래픽

    Nginx Ingress Controller와 Traefik Ingress Controller의 주요 특징, 장단점, 추천 사용 사례를 한눈에 비교할 수 있도록 시각적으로 요약한 인포그래픽입니다.

    마무리하며

    쿠버네티스 환경에서 Ingress Controller는 외부와 내부를 연결하는 중요한 다리 역할을 합니다. Nginx와 Traefik 모두 각자의 방식으로 이 역할을 훌륭하게 수행하죠. 어떤 것을 선택하든, 중요한 것은 해당 솔루션의 작동 방식을 이해하고 여러분의 환경에 맞게 최적화하는 것입니다. 제가 겪었던 삽질 경험들이 여러분의 시간과 노력을 아끼는 데 조금이나마 도움이 되었기를 바랍니다.

    다음 글에서는 Traefik을 이용한 Let’s Encrypt 자동화 설정에 대해 좀 더 자세히 다뤄볼까 합니다. 긴 글 읽어주셔서 감사합니다! 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 제가 아는 선에서는 성심성의껏 답변해드리겠습니다. 🎉

  • [K8s] 쿠버네티스 Ingress Controller 비교: Nginx, Traefik, Gateway API 선택 가이드

    [K8s] 쿠버네티스 Ingress Controller 비교: Nginx, Traefik, Gateway API 선택 가이드

    쿠버네티스 Ingress Controller, 뭘 써야 할지 모르겠다면?

    쿠버네티스(Kubernetes)를 처음 도입할 때 가장 많이 막히는 부분 중 하나가 바로 Ingress Controller(인그레스 컨트롤러) 선택이에요. 저도 처음엔 “Nginx 쓰면 되는 거 아닌가?” 하고 무심코 설치했다가, 나중에 Traefik이 더 편하다는 걸 알고 갈아엎은 경험이 있거든요. 그리고 최근엔 Gateway API라는 새로운 표준까지 등장해서 선택지가 더 복잡해졌습니다.

    이 글에서는 쿠버네티스 클러스터 운영에서 가장 중요한 선택 중 하나인 Ingress Controller의 세 가지 주요 선택지를 실제 운영 경험을 바탕으로 비교해 드릴게요. 홈랩부터 프로덕션까지 다양한 환경에서 직접 써본 입장에서 솔직하게 이야기해 보겠습니다.

    쿠버네티스 Ingress Controller 전체 아키텍처 — 외부 트래픽이 인그레스 컨트롤러를 통해 내부 서비스로 라우팅되는 구조

    ▲ 쿠버네티스 클러스터에서 외부 트래픽이 Ingress Controller를 거쳐 내부 서비스로 전달되는 전체 흐름 다이어그램

    Ingress Controller가 뭔지부터 짚고 가자

    쉽게 말해서, Ingress(인그레스)는 외부에서 쿠버네티스 클러스터 안으로 들어오는 HTTP/HTTPS 트래픽을 어떻게 라우팅할지 정의하는 규칙이에요. 근데 이 규칙만 있다고 실제로 동작하는 게 아니에요. 규칙을 실제로 실행해 주는 주체가 바로 Ingress Controller(인그레스 컨트롤러)입니다.

    비유하자면, Ingress 리소스는 “1번 도메인은 A 서비스로, 2번 도메인은 B 서비스로 보내라”는 지시서고, Ingress Controller는 그 지시서를 읽고 실제로 트래픽을 처리하는 리버스 프록시(Reverse Proxy) 서버라고 보시면 됩니다.

    쿠버네티스 자체에는 Ingress Controller가 기본 내장되어 있지 않아요. 그래서 우리가 직접 선택해서 설치해야 합니다. 그리고 이 선택이 생각보다 중요한 결정이거든요.

    왜 선택이 중요한가요?

    • 운영 중에 교체하면 서비스 중단이 발생할 수 있어요
    • 각 컨트롤러마다 지원하는 기능과 설정 방식이 달라요
    • 팀의 기술 스택과 러닝 커브도 고려해야 합니다
    • 트래픽 규모와 패턴에 따라 성능 특성이 다르게 나타나요

    세 가지 선택지 한눈에 비교

    본격적인 비교 전에 전체 그림을 먼저 보시죠.

    항목 Nginx Ingress Controller Traefik Gateway API
    기반 기술 Nginx (리버스 프록시) Go 기반 자체 구현 표준 API (구현체 별도)
    설정 방식 Ingress + Annotation Ingress + CRD Gateway/HTTPRoute CRD
    자동 설정 갱신 지원 (일부 재시작 필요) ✅ 완전 동적 구현체에 따라 다름
    대시보드 별도 설치 필요 ✅ 내장 없음 (구현체 의존)
    학습 난이도 낮음 (Nginx 경험자) 중간 높음
    성숙도 매우 높음 높음 성장 중 (GA 달성)
    멀티 팀 지원 제한적 중간 ✅ 설계 목표
    커뮤니티/레퍼런스 매우 풍부 풍부 성장 중

    Nginx Ingress Controller — 검증된 베테랑

    솔직히 말씀드리면, 저도 처음 쿠버네티스 클러스터 구성할 때 고민 없이 Nginx Ingress를 선택했어요. 이유는 단순했습니다. Nginx를 이미 10년 넘게 써왔으니까요.

    Nginx Ingress Controller는 CNCF(Cloud Native Computing Foundation) 산하 프로젝트인 kubernetes/ingress-nginx와, Nginx Inc.에서 만든 nginxinc/kubernetes-ingress 두 가지가 있어요. 헷갈리시는 분들이 많은데, 커뮤니티에서 주로 쓰는 건 전자인 ingress-nginx입니다.

    Helm으로 설치하기

    # Nginx Ingress Controller Helm 설치
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    
    helm install ingress-nginx ingress-nginx/ingress-nginx \
      --namespace ingress-nginx \
      --create-namespace \
      --set controller.replicaCount=2

    기본 Ingress 리소스 예시

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
        - myapp.example.com
        secretName: myapp-tls
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 80

    Nginx Ingress의 장단점

    ✅ 장점

    • 레퍼런스가 압도적으로 많아요. 구글에서 뭐든 찾을 수 있습니다
    • Nginx에 익숙한 분들은 Annotation으로 세밀한 튜닝이 가능해요
    • 안정성이 검증된 오랜 역사를 가지고 있습니다
    • 대규모 트래픽 처리에 강점이 있어요

    ⚠️ 단점

    • 설정 변경 시 nginx.conf를 reload해야 해서, 대규모 클러스터에선 부담이 될 수 있어요
    • Annotation이 너무 많아서 처음엔 뭘 써야 할지 헷갈립니다
    • 내장 대시보드가 없어서 별도로 Prometheus + Grafana를 구성해야 해요

    Traefik — 쿠버네티스 네이티브의 매력

    Traefik을 처음 접한 건 홈랩에서 Docker Compose로 운영하다가였어요. 당시에 “이거 레이블(Label) 하나 달면 자동으로 라우팅이 된다고?” 하면서 신기해했던 기억이 납니다. 쿠버네티스에서도 비슷한 경험을 할 수 있어요.

    Traefik의 핵심 철학은 동적 설정(Dynamic Configuration)이에요. 새로운 서비스가 배포되면 자동으로 감지해서 라우팅 규칙을 업데이트합니다. Nginx처럼 reload가 없어요.

    Traefik Helm 설치

    # Traefik Helm 설치
    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update
    
    helm install traefik traefik/traefik \
      --namespace traefik \
      --create-namespace \
      --set dashboard.enabled=true \
      --set ingressRoute.dashboard.enabled=true

    Traefik IngressRoute CRD 예시

    Traefik은 표준 Ingress 리소스도 지원하지만, 자체 CRD인 IngressRoute를 쓰면 훨씬 풍부한 기능을 쓸 수 있어요.

    apiVersion: traefik.io/v1alpha1
    kind: IngressRoute
    metadata:
      name: my-app-ingressroute
      namespace: default
    spec:
      entryPoints:
        - websecure
      routes:
        - match: Host(`myapp.example.com`)
          kind: Rule
          services:
            - name: my-app-service
              port: 80
          middlewares:
            - name: my-ratelimit
      tls:
        certResolver: letsencrypt

    Middleware로 Rate Limiting 적용

    apiVersion: traefik.io/v1alpha1
    kind: Middleware
    metadata:
      name: my-ratelimit
    spec:
      rateLimit:
        average: 100
        burst: 50

    💡 Traefik의 진짜 강점은 Let’s Encrypt 인증서 자동 발급이 내장되어 있다는 거예요. cert-manager를 별도로 설치하지 않아도 TLS 인증서를 자동으로 관리해 줍니다. 홈랩에서 이거 하나 때문에 Traefik으로 갈아탔을 정도로 편하더라고요.

    Traefik 내장 대시보드 화면 — 라우터, 서비스, 미들웨어 현황을 한눈에 확인하는 모니터링 인터페이스

    ▲ Traefik 내장 대시보드에서 라우터, 서비스, 미들웨어 현황을 한눈에 확인할 수 있는 화면

    Traefik의 장단점

    ✅ 장점

    • 동적 설정 갱신 — 서비스 변경 시 reload 없이 즉시 반영돼요
    • 내장 대시보드로 라우팅 현황을 바로 확인할 수 있어요
    • Let’s Encrypt 자동 인증서 발급/갱신 내장
    • Middleware로 인증, Rate Limiting, 헤더 조작 등을 깔끔하게 구성 가능

    ⚠️ 단점

    • CRD 방식이 Nginx Annotation과 달라서 러닝 커브가 있어요
    • Nginx에 비해 레퍼런스가 적습니다 (그래도 요즘은 많이 늘었어요)
    • 초대형 클러스터에서의 성능 검증 사례가 Nginx보다 적은 편이에요

    Gateway API — 쿠버네티스 네트워크의 미래

    처음 Gateway API 문서를 읽었을 때 솔직히 “이게 뭐가 다른 건데?” 싶었어요. 근데 알고 보니 기존 Ingress 리소스의 한계를 근본적으로 해결하려는 시도더라고요.

    Gateway API는 SIG Network(쿠버네티스 네트워킹 특별관심그룹)에서 만든 공식 표준이에요. 2023년에 v1.0으로 GA(Generally Available, 정식 출시)를 달성했습니다. Ingress 리소스를 대체하려는 게 아니라, 더 표현력 있고 역할 기반으로 분리된 네트워크 설정을 가능하게 하는 게 목표예요.

    Gateway API의 핵심 개념

    기존 Ingress는 개발자와 인프라 관리자가 같은 리소스를 수정해야 했어요. Gateway API는 역할을 명확히 분리합니다.

    • GatewayClass: 인프라 제공자가 정의 (“이 구현체를 쓸게”)
    • Gateway: 클러스터 운영자가 정의 (“이 포트, 이 프로토콜로 받을게”)
    • HTTPRoute: 개발자가 정의 (“이 경로는 내 서비스로 보내줘”)

    Gateway API 설치 (CRD 먼저)

    # Gateway API CRD 설치
    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.1.0/standard-install.yaml
    
    # 구현체 예시: Nginx Gateway Fabric
    helm install ngf oci://ghcr.io/nginxinc/charts/nginx-gateway-fabric \
      --namespace nginx-gateway \
      --create-namespace

    Gateway와 HTTPRoute 설정 예시

    # Gateway 리소스 (운영자가 관리)
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: main-gateway
      namespace: infra
    spec:
      gatewayClassName: nginx
      listeners:
      - name: https
        port: 443
        protocol: HTTPS
        tls:
          mode: Terminate
          certificateRefs:
          - name: main-tls-cert
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchLabels:
                gateway-access: allowed
    # HTTPRoute 리소스 (개발자가 관리)
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: my-app-route
      namespace: my-app-ns
    spec:
      parentRefs:
      - name: main-gateway
        namespace: infra
      hostnames:
      - myapp.example.com
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /api
        backendRefs:
        - name: api-service
          port: 8080
      - matches:
        - path:
            type: PathPrefix
            value: /
        backendRefs:
        - name: frontend-service
          port: 3000

    보이시나요? Gateway는 인프라팀이 관리하고, HTTPRoute는 각 개발팀이 자기 네임스페이스에서 독립적으로 관리할 수 있어요. 멀티 팀 환경에서 진짜 강력한 구조입니다.

    Gateway API의 장단점

    ✅ 장점

    • 역할 기반 분리로 멀티 팀 환경에 최적화되어 있어요
    • 표현력이 풍부해서 복잡한 라우팅 규칙도 명확하게 표현 가능
    • 쿠버네티스 공식 표준이라 장기적으로 생태계 지원이 확대될 거예요
    • 구현체를 교체해도 HTTPRoute 설정은 그대로 재사용 가능 (이식성)

    ⚠️ 단점

    • 개념이 많아서 처음 배우기가 쉽지 않아요. 저도 꽤 헷갈렸습니다
    • 구현체마다 지원하는 기능이 달라서 사전 확인이 필요해요
    • 소규모 팀이나 단순한 환경에선 오버엔지니어링이 될 수 있어요
    • 레퍼런스와 사례가 아직 Nginx/Traefik에 비해 적습니다

    ⚠️ 실제 트러블슈팅 경험담

    각 컨트롤러를 쓰면서 제가 직접 겪은 문제들을 공유할게요.

    Nginx Ingress — 413 Request Entity Too Large

    파일 업로드 기능이 있는 서비스에서 자꾸 413 에러가 났었어요. Nginx 기본 설정의 client_max_body_size 제한 때문이었는데, Annotation으로 해결했습니다.

    metadata:
      annotations:
        nginx.ingress.kubernetes.io/proxy-body-size: "50m"

    Traefik — 인증서가 갱신 안 되는 문제

    Let’s Encrypt 인증서를 Traefik이 자동으로 갱신해 주는 게 편한데, 어느 날 갑자기 인증서 만료 알림이 왔어요. 알고 보니 acme.json 파일이 저장된 PersistentVolume이 Pod 재시작 시 초기화되는 문제였습니다. acme.json은 반드시 영구 스토리지에 마운트해야 해요.

    # values.yaml에서 persistence 설정
    persistence:
      enabled: true
      storageClass: "longhorn"
      size: 128Mi

    Gateway API — 구현체 호환성 확인 필수

    HTTPRoute의 고급 기능(예: RequestRedirect, URLRewrite)을 사용했는데, 특정 구현체에서 지원하지 않아서 라우팅이 묵묵히 실패하는 경우가 있었어요. 구현체의 Conformance Report(적합성 보고서)를 미리 확인하는 게 중요합니다. Gateway API 공식 문서에서 구현체별 지원 기능표를 제공하고 있어요.

    쿠버네티스 Ingress Controller 모니터링 대시보드 — Prometheus와 Grafana를 활용한 요청 수, 에러율, 레이턴시 시각화

    ▲ Prometheus와 Grafana를 활용한 Ingress Controller 모니터링 대시보드 — 요청 수, 에러율, 레이턴시를 실시간으로 확인

    상황별 선택 가이드

    “그래서 뭘 써야 하나요?” 라고 물어보신다면, 상황에 따라 다르다고 답할 수밖에 없어요. 하지만 경험상 이런 기준으로 선택하시면 크게 후회는 없더라고요.

    Nginx Ingress Controller를 선택하세요, 만약…

    • 팀에 Nginx 경험자가 있고, 레퍼런스가 많은 안정적인 선택을 원할 때
    • 대규모 트래픽을 처리해야 하고 검증된 성능이 필요할 때
    • 기존 Nginx 설정을 쿠버네티스로 마이그레이션할 때
    • 복잡한 Nginx 설정(custom snippet 등)이 필요할 때

    Traefik을 선택하세요, 만약…

    • 홈랩이나 소규모 환경에서 편리하게 운영하고 싶을 때
    • Let’s Encrypt 자동 인증서 관리를 간단하게 하고 싶을 때
    • 내장 대시보드로 라우팅 현황을 빠르게 파악하고 싶을 때
    • 동적 환경에서 서비스 변경이 잦을 때

    Gateway API를 선택하세요, 만약…

    • 여러 팀이 각자의 라우팅 설정을 독립적으로 관리해야 할 때
    • 장기적으로 쿠버네티스 표준에 맞춰 가고 싶을 때
    • 복잡한 트래픽 분산(카나리 배포, A/B 테스트 등)이 필요할 때
    • 구현체 이식성을 확보하고 싶을 때
    쿠버네티스 Ingress Controller 비교 인포그래픽 — Nginx Ingress, Traefik, Gateway API 특징과 선택 기준 요약

    ▲ 환경과 요구사항에 따른 Ingress Controller 선택 가이드 요약 인포그래픽

    마무리 — 정답은 없지만, 기준은 있다

    13년 동안 인프라를 운영하면서 느낀 건, 기술 선택에 절대적인 정답은 없다는 거예요. 중요한 건 내 환경과 팀의 요구사항에 맞는 선택을 하는 겁니다.

    개인적으로는 이렇게 정리하고 싶어요.

    • 처음 시작하는 분들: Nginx Ingress로 시작하세요. 레퍼런스가 많아서 막힐 때 찾기 쉬워요
    • 홈랩이나 소규모 팀: Traefik을 강력 추천합니다. 편의성이 정말 좋아요
    • 엔터프라이즈/멀티 팀 환경: Gateway API를 진지하게 검토해 보세요. 미래 방향성이 여기 있거든요

    그리고 하나 더 — 저는 지금 홈랩에서 Traefik을 쓰고, 회사 프로덕션에서는 Nginx Ingress를 씁니다. 두 개 다 쓸 줄 알면 더 좋아요. 😄

    다음 글에서는 Traefik의 Middleware를 활용한 인증/인가(Authentication/Authorization) 설정을 더 자세히 다룰 예정이에요. cert-manager를 이용한 TLS 자동화 내용도 이전 글에서 다룬 적 있으니 참고해 보세요.

    자주 묻는 질문 (FAQ)

    Q. Nginx Ingress Controller와 Nginx Gateway Fabric은 다른 건가요?

    네, 다릅니다. ingress-nginx는 기존 Ingress API 기반이고, Nginx Gateway Fabric은 Gateway API 표준의 구현체예요. 용도와 설정 방식이 다릅니다.

    Q. 하나의 클러스터에 여러 Ingress Controller를 동시에 쓸 수 있나요?

    가능합니다. ingressClassName을 통해 어떤 컨트롤러를 사용할지 지정할 수 있어요. 다만 운영 복잡도가 올라가니 꼭 필요한 경우에만 권장합니다.

    Q. Gateway API는 Ingress를 완전히 대체하나요?

    장기적으로는 그 방향이지만, 현재는 공존하는 상태예요. 기존 Ingress 리소스가 deprecated되지는 않았고, Gateway API가 더 복잡한 요구사항을 위한 차세대 표준으로 자리잡고 있는 중입니다.