Traefik Docker 설정

Mon Jan 11 2021

CI/CD의 일환으로 treafik을 사용하려고 하고 있다. 이것도 그냥 간단하게 Docker swarm만 써도 될걸 과한 욕심을 부리는건가 싶긴 한데.. 간만에 엄청난 삽질을 했다.

어느 정도 성과를 본 것 같고 잊어버리지 않기 위해서 일기 쓰는 중.

시작 전에

다음과 같은 사항은 미리 파악해 둘 것을 권장한다. 그래야 나처럼 시간낭비를 안한다..

  1. traefik에 대한 명확한 개념 이해.
    당연한 얘긴데, 나는 너무 쉽게 생각하고 이 부분을 쓱 훑어넘겼다가 크게 후회했다. 그래서 이 문서에서도 아래 단락에 간단하게나마 설명할 예정이다.
  2. Quick Start는 반드시 1회 수행해볼 것
    읽으면 그렇구나 하는데 백번 읽어봐야 한번 실행해보는 것만큼 와닿기가 쉽지 않다.
  3. traefik 문서를 읽을 때에는 버전을 확인해볼 것
    구글에서 검색하다보면 공식문서든, 블로그 article이든 여러 출처의 문서가 나오는데 최신버전에 대한 문서와 구 버전에 대한 문서가 섞여있다. 문서가 설명하는게 어느 버전의 traefik인지 모르면 막상 문제가 생겼을때 원인을 파악하기가 쉽지 않다.
    참고로, 이 문서는 traefik v2.3을 기준으로 작성되었다.
  4. Docker에 대한 이해
    이건 케이스 바이 케이스인데 물론 내게 해당하는 케이스였다..
    나처럼 Docker를 쓴지 좀 되었거나 Docker를 아예 접해본 적이 없다면 Docker부터 배운다음에 시도하는 것이 좋다. 경우에 따라서 Docker를 전혀 쓰지 않을 수도 있겠지만 아마 좀 귀찮을 것이다..

What is traefik

traefik-arch Welcome 문서에서는 traefik을 Edge router 라고 설명하고 있다.

서비스를 펀쿨섹 재미있고, 쉽게 퍼블리싱할 수 있게 해준다는데, 내가 머리가 나빠서 그런지 전혀 쉽지 않았음..

그림을 보면 알 수 있듯이 traefik은 라우팅 외에도 SSL, Metric, Logging, Load balancing 등등 여러가지 역할을 하고 있지만 역시 주요한 역할은 서비스 디스커버리와 라우팅이라고 볼 수 있겠다.

즉, 인터넷 상에서 들어오는 Request에 적절하게 대응하고, 해당하는 서비스로 연결하는 것을 알아서 해준다는 것으로 보면 되겠다. 이걸 수동으로 한다면 아마 보통 다음과 같은 프로세스를 거칠 것이다:

  1. 새 서비스 (예를 들면 API 서버라든가)를 서버에서 실행시킨다.
  2. 클라이언트가 접촉해오는 Endpoint 지점에 Path, Port, Header 등등 조건을 지정하고 라우팅 시킨다. (아마 보통 Nginx 또는 Apache를 쓸 것이다.)
  3. 경우에 따라 fallback, SSL, Load balancing 같은 설정을 적절하게 설정한다.

이 프로세스는 처음 서비스를 지정할 때 뿐이고 서비스 업데이트를 한다던가 하는 경우가 되면 한참 더 해메게 될 것이다. 게다가 서비스가 커지면 커질 수록 이전 세팅이 어떻게 되어 있는지 찾기가 더 힘들어진다.

Concepts

traefik-concepts-2

그래서 traefik은 Edge Router와 Auto Service Discovery라는 기능을 제공하는데 문서에서도 자백하듯이 Edge Router라는 것은 결국 Nginx로 주구장창 사용하던 Reverse proxy와 거의 같아서 더 설명할 것은 별로 없고,
Auto Service Discovery는 서비스 배포, 인스턴스 증감 등의 이유로 서비스 상에 변동이 일어났을 때 실시간으로 라우팅에 대응시키는 역할을 한다.

Entrypoints / Routers / Service

이 세가지 개념은 traefik이 Request 처리 흐름을 이해하는데 아주 중요하다. Request가 traefik으로 전달되면 Entrypoint -> Router (+middleware) -> Service 순으로 처리되며 각각 다음과 같이 동작한다.

  • Entrypoints
    hostname, port, protocol(tcp/udp)와 같은 조건으로 request들을 특정 Entrypoint로 분류한다. 그 외에도 다른 설정들이 존재하며 Entrypoint에 대한 설정은 static configuration으로써 traefik이 처음 구동될 때 적용된다.
  • Routers
    각 Router마다 처리할 Entrypoint를 명시하고 해당 Entrypoint에서 전달되는 Request를 middleware로 처리하거나, 지정된 Service로 전달한다. 이 과정에서 Hostname, header, method 등을 조건으로 지정하는 Rule을 설정할 수 있다.
  • Services
    Request의 최종 목적지를 설정한다. Service configuration은 Router config와 함께 Dynamic Configuration에 해당하여, traefik 실행시점과 별개로 service를 배포할 때 지정할 수 있다.

Providers

traefik은 혼자서 모든것을 처리하는 만능 자동화툴 같지만 사실 상당 부분을 다른 Orchastrator이나 분산 시스템 관리도구에 의존한다. 이것을 traefik에서는 Provider라고 부르며, 서비스를 실제로 배포하거나 서비스 디스커버리 같은 기능을 수행하고 traefik은 request와 provider 사이에서 조율하는 역할을 한다. 가장 많이 사용되는 것이 컨테이너의 대부인 Docker인데, K8s/Marathon/Rancher 등 다른 Orchastrator도 지원한다.

실습

사실 Quick start랑 거의 비슷하지만 조금 더 깊이 있게 설명해보겠다.

traefik 실행

traefik은 단독 바이너리로도 사용할 수 있지만 요즘 대세인 Docker Container로도 사용할 수 있고, 각종 Document들도 Docker 실행을 기준으로 설명하는 것을 보면 현업에서도 Docker Container를 가장 보편적으로 사용하는 것 같다.
나는 문서를 너무 대충 읽어서 이 부분까지도 헷갈렸는데 treafik이 실행하는 Docker와 Provider로서의 Docker를 구분해서 생각해야 traefik 구조를 이해하기 쉬울 것이다.

(당연히 Docker가 설치되어 있다는 가정하에) 다음과 같은 명령어로 실행할 수 있다.

docker run -d -p 8080:8080 -p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik:v2.3

8080포트와 80포트를 호스트와 바인딩 시키는 것은 클라이언트측 Request를 traefik Entrypoint와 연결시킬 통로를 여는 것이라고 보면 되고, 호스트 파일 시스템의 traefik.toml을 컨테이너에 마운트시키는 것은 static configuration과정이다.

SHARE
snark

닉네임은 Snark이지만 어째선지 썸네일은 Jabberwocky