본문 바로가기

Traefik 이란? 본문

Infra

Traefik 이란?

겨울바람_ 2024. 5. 30. 14:21

Traefik 이란?

Traefik은 Nginx, Apache와 같이 웹 서버 앞에서 동작하며 클라이언트로부터의 요청을 웹 서버에 전달하는 역할을 수행하는 Reverse Proxy Server의 일종이다. 

 

오픈소스 Edge Router라는 명칭으로도 불리며, config 파일을 수정해야 하는 번거로움을 가진 Nginx, Apache 등의 다른 툴과 달리 서비스를 배포할 때 서비스가 처리할 수 있는 요청의 특성을 Traefik에 알리는 정보를 첨부하는 것으로, 서비스가 배포될 때 실시간으로 Traefik의 라우팅 규칙을 업데이트 할 수 있다.

 

실제로 Docker 환경에서 사용할 때, docker.sock, label 속성을 통해 적절히 값을 설정해주면 서비스 컨테이너와 Traefik이 실시간으로 연결되는 것을 확인할 수 있다. Traefik 또한 Docker Container를 통한 손쉬운 배포가 가능하다.

 

현재 필자의 개인 서버 또한, Traefik을 통해 Docker Container로 배포된 서비스들을 관리하고 있다. 

Traefik Concept

Traefik은 다음과 같은 구성 요소들로 이루어져있다.

EntryPoint

엔트리포인트는 Traefik으로 들어오는 외부 요청의 진입점으로, 패킷을 어떤 포트로 받을지 정의하고 통신 방식을 정의할 수 있다.

EntryPoints are the network entry points into Traefik. They define the port which will receive the packets, and whether to listen for TCP or UDP. 

Router

라우터는 엔트리포인트를 통해 Traefik으로 들어온 요청을 서비스로 전달하는 역할을 한다. 

A router is in charge of connecting incoming requests to the services that can handle them.

Middleware

라우터와 함께 동작하며, 서비스로 요청 혹은 응답이 도착하기 전에 그것들을 수정할 수 있다. 예를 들어, http 요청을 https 요청으로 변환시키는 역할을 수행하는 역할을 담당할 수 있다.

Attached to the routers, middlewares can modify the requests or responses before they are sent to your service

Service

서비스는 들어오는 요청을 처리할 실제 서비스에 어떻게 도달하게 할 것인지를 구성한다.

Services are responsible for configuring how to reach the actual services that will eventually handle the incoming requests.

Auto Service Discovery

위에서 설명했듯이 Traefik은 전통적인 Reverse Proxy 도구인 Nginx 혹은 Apache 처럼 매번 서비스를 등록하기 위해서 config 파일을 수정해야 하는 번거로움이 없다.

 

이는 서비스가 배포됐을 때, Traefik이 배포된 서비스를 즉각 감지하고 라우팅 규칙을 실시간으로 업데이트 한다는 것을 의미한다. 비슷하게 서비스의 배포가 중단됐을 때, 해당하는 라우팅 규칙 또한 따라서 삭제된다. 

 

즉, Traefik을 사용하는 개발자는 더 이상 배포되는 서비스와 IP주소와 라우팅 규칙 등을 config 파일에 작성하고 동기화 할 필요가 없는 것이다.

 

Traefik은 이와 같은 Auto Service Discovery를 구현하기 위해 Provider에게 API를 호출하여 Entry Point, Router, Service에 대한 정보를 받아온다. 이때 Provider는 오케스트레이터, 컨테이너 엔진, 클라우드 제공업체 또는 키-값 저장소와 같은 인프라 구성 요소가 될 수 있다. 대표적으로는 Docker, K8s 등이 해당된다.

Traefik with Docker Provider

필자의 개인 서버는 언급했듯이 Docker를 Provider로 하여 Traefik을 운영 중이기 때문에 Docker 환경에서의 Traefik 설정 방법에 대해 이야기 해보고자 한다. 

 

우선 Traefik의 설정이 어떤 방식으로 구성되는지 알아보자.

Static Configuration

정적 설정은 설정 파일 작성, CLI 인자 작성, 환경 변수 설정 세 가지 방법 중 하나를 선택하여 Traefik에 대한 설정을 정의할 수 있다. 옵션에 대한 값을 정의하지 않을 경우 기본 값으로 해당 값이 설정된다.

 

Nginx와 Apache 등에서 이루어지는 설정 방식과 유사하며, Traefik의 설정 파일 작성 경로는 다음과 같다.

  • /etc/traefik/
  • $XDG_CONFIG_HOME/
  • $HOME/.config/
  • . (the working directory)

Traefik은 실행 시, 해당 경로에 위치한 traefik.yml 혹은 traefik.yaml, traefik.toml 을 찾아 해당 설정 파일의 내용을 반영하여 실행된다.

Dynamic Configuration

Docker를 Provider로 사용할 경우 동적 설정 방식은 labels를 사용하여 라우터, 서비스, 엔트리 포인트, 로드밸런서, 미들웨어 등의 설정을 정의할 수 있다. 

 

예를 들어, Traefik의 관리 하에 두고싶은 서비스의 도커 컴포즈 파일을 다음과 같이 작성할 경우

  whoami1:
    image: traefik/whoami
    container_name: whoami1
    labels:
      - traefik.http.routers.whoami1.rule=Host(`example.com`) &&
        PathPrefix(`/1`)
      - traefik.http.routers.whoami1.entrypoints=websecure
      - traefik.http.routers.whoami1.tls.certresolver=myresolver
    networks:
      - proxy

자동으로 엔트리 포인트를 연결해주고, Host 도메인과 PathPrefix 경로에 해당하는 라우터와 해당 라우터에 연결된 서비스를 생성하여 실제 실행되는 whoami 서비스와 연결시킨다.

Docker-Compose.yaml

version: "3.8"
networks:
  proxy:
    name: proxy
services:
  traefik:
    image: traefik:v2.9
    container_name: traefik
    command:
      - --api.insecure=false
      - --api.dashboard=true
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myresolver.acme.httpchallenge=true
      - --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
      - --certificatesresolvers.myresolver.acme.email=dev_in_wonderland@naver.com
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
    labels:
      - traefik.enable=true
      - traefik.docker.network=proxy
      - traefik.http.routers.traefik.rule=Host(`web.dev-in-wonderland.pro`) &&
        (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
      - traefik.http.routers.traefik.entrypoints=websecure
      - traefik.http.routers.traefik.tls.certresolver=myresolver
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
      - traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)
      - traefik.http.routers.redirs.entrypoints=web
      - traefik.http.routers.redirs.middlewares=redirect-to-https
      - traefik.http.routers.traefik.middlewares=auth
      - traefik.http.middlewares.auth.basicauth.users=[사용자]:[비밀번호]
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /home/cheshire-cat/traefik:/etc/traefik/
      - /home/cheshire-cat/letsencrypt:/letsencrypt
    networks:
      - proxy
  whoami1:
    image: traefik/whoami
    container_name: whoami1
    labels:
      - traefik.http.routers.whoami1.rule=Host(`web.dev-in-wonderland.pro`) &&
        PathPrefix(`/1`)
      - traefik.http.routers.whoami1.entrypoints=websecure
      - traefik.http.routers.whoami1.tls.certresolver=myresolver
    networks:
      - proxy

 

Traefik의 구성 요소인 EntryPoint, Router, Service, Middleware가 모두 잘 정의된 것을 확인할 수 있다. 주의해야 할 점은 Traefik의 관리하에 운영하고 싶은 서비스의 경우 Traefik과 동일한 네트워크를 사용해야 한다. 

 

traefik에서 정의된 EntryPoint는 web(80), websecure(443) 두 개다. 아래의 whoami1 서비스의 경우 labels 속성에 동적으로 설정된  traefik.http.routers.whoami1.entrypoints=websecure 을 보면, traefik에서 정의한 EntryPoint를 진입점으로 가지는 것을 확인할 수 있다. 

 

traefik.http.routers.whoami1.rule=Host(`web.dev-in-wonderland.pro`) && PathPrefix(`/1`) Routing Rule 부분을 살펴보면 Host가 web.dev-in-wonderland.pro 서브 도메인으로 잡혀있고, 경로는 1로 지정되어 있다. 

 

결과적으로 `web.dev-in-wonderland.pro:443/1` 경로로 들어오는 요청을 whoami1 서비스로 전달한다는 의미다. 

마무리 

Traefik은 Reverse Proxy를 통해 구성할 수 있는 다양한 기능들을 굉장히 손쉽게 서비스에 적용할 수 있도록 해주는 굉장히 편리한 도구다. 해당 포스팅에서는 추가적으로 설명하지는 않았지만 로드 밸런서 기능 또한 동적 설정으로 손쉽게 적용할 수 있으며, HTTPS 사용을 위한 TLS 인증서 발급 또한 쉽게 가능하다.

 

현재 개인 서버를 운영하면서 다수의 서비스에 대한 관리를 Traefik을 통해 이어나가고 있는데, 사용하면 할 수록 굉장히 편리한 점들이 많아 간단하게 소개해볼 겸 해당 포스팅을 작성하게 됐다.

 

추후 Traefik에서 제공하는 다른 기능들, 로드밸런서, 미들웨어 등에 대한 포스팅도 기회가 되면 작성하려고 한다. 

'Infra' 카테고리의 다른 글

[k8s] K8s Storage with OpenEBS  (0) 2024.08.02
[Network] TCP 프로토콜에 대한 이해  (1) 2024.07.23
[k8s] etcd & Raft Alogorithm (2)  (0) 2024.07.12
[k8s] etcd & Raft Algorithm (1)  (0) 2024.07.10
[K8s] k8s Pod 생성 시 벌어지는 일  (0) 2024.07.09
Comments