server infra guide series — article 02

모든 트래픽은
여기를 지난다

Traefik은 리버스 프록시이자 로드 밸런서다. 외부 요청을 받아 도메인별로 분배하고, SSL 인증서를 자동 발급하고, 새 서비스를 자동 감지한다. 인프라의 관문이 하는 일을 해부한다.

Part I

Traefik이란 무엇인가

Traefik(192.168.0.230)은 리버스 프록시(Reverse Proxy)이자 로드 밸런서(Load Balancer)다. 인프라에서 관문(Gateway) 역할을 수행한다.

리버스 프록시란 클라이언트와 백엔드 서버 사이에 위치하여, 클라이언트의 요청을 대신 받아 적절한 서버로 전달하는 중간자다. 사용자는 실제 서버의 IP 주소를 알 필요가 없다. gitlab.yourdomain.com에 접속하면 Traefik이 알아서 192.168.0.232로 연결해준다.

사용자는 도메인만 알면 된다.
나머지는 Traefik이 처리한다.

Nginx나 HAProxy 같은 전통적인 리버스 프록시와 달리 Traefik의 강점은 자동화에 있다. 설정 파일을 수동으로 편집하지 않아도 새 서비스가 뜨면 자동으로 라우팅 규칙이 생성된다. Docker 라벨이나 Consul 서비스 등록만으로 끝이다.

Part II

5가지 핵심 기능

Feature 01

트래픽 라우팅

외부 요청을 도메인/경로 기반으로 백엔드 서버에 자동 분배한다. 하나의 IP에서 여러 서비스를 도메인으로 구분하여 운영할 수 있다.

라우팅 예시
gitlab.yourdomain.com
192.168.0.232 Private GitLab
axconnect.yourdomain.com
192.168.0.231 Ax-Connect
evan-app.yourdomain.com
192.168.0.204:8080 Evan Dev Server
Feature 02

자동 SSL 인증서 관리

Let's Encrypt와 연동하여 HTTPS 인증서를 자동으로 발급하고 갱신한다. 개발자가 인증서를 수동으로 발급하거나 만료일을 관리할 필요가 없다. 모든 도메인의 인증서가 한 곳에서 관리된다.

이것이 중앙 집중형 SSL 관리가 필수인 이유다. 여러 서버에서 각자 인증서를 발급하면 Let's Encrypt의 Rate Limit(주당 50개)에 걸릴 수 있고, 인증서 갱신 실패를 추적하기 어렵다.

Feature 03

서비스 디스커버리

Consul(233~235)과 연동하여 새 서비스가 등록되면 자동으로 라우팅 규칙을 생성한다. Docker 컨테이너에 라벨을 붙이거나, Consul에 서비스를 등록하면 Traefik이 이를 감지한다.

설정 파일을 수동으로 편집하고 Traefik을 재시작할 필요가 없다. 서비스가 뜨면 자동으로 접근 가능해진다.

Feature 04

로드 밸런싱

동일한 역할을 하는 서버가 여러 대일 때 트래픽을 분산한다. Consul 클러스터(233~235)가 대표적인 예다. 3대의 Consul 서버에 요청을 고르게 분배하여 한 대에 부하가 집중되는 것을 방지한다.

Feature 05

미들웨어

서비스 코드를 수정하지 않고 프록시 레벨에서 다양한 기능을 처리한다.

인증 — 특정 서비스에 Basic Auth나 IP 화이트리스트 적용. Rate Limiting — 초당 요청 수 제한으로 남용 방지. 헤더 조작 — 보안 헤더 추가, CORS 설정. 이 모든 것이 백엔드 서비스의 코드 변경 없이 가능하다.

Part III

왜 Traefik은 하나여야 하는가

Traefik이 인프라의 관문이라면, 관문은 하나여야 한다. 두 개의 Traefik이 동일한 인프라를 바라보면 무엇이 일어나는가.

중앙 Traefik 1대
라우팅 경로가 단일하다. 모든 트래픽이 예측 가능하게 흐른다.
SSL 인증서가 한 곳에서 관리된다. Rate Limit 걱정 없다.
Consul 연동이 깔끔하다. 하나의 디스커버리 경로.
접근 제어가 통일된다. 미들웨어 정책이 일관적이다.
Traefik 2대 (이중 설치)
라우팅이 이중 경로를 생성한다. 어느 Traefik을 타는지 예측 불가.
SSL 인증서 충돌. 두 곳에서 발급 요청 시 Rate Limit 초과 위험.
Consul 디스커버리 충돌. 각자 다른 규칙 적용 가능.
접근 제어 사각지대 발생. 보안 정책이 일관되지 않는다.

이것이 개발자 서버에 별도 Traefik을 설치하면 안 되는 핵심 이유다. 중앙 Traefik(230)에 라우팅 규칙을 추가하는 것이 정석이다.

올바른 방법 — 중앙 Traefik에 라우팅 추가 # evan의 개발 서비스를 외부에 노출할 때 # Traefik(230) 설정에 규칙을 추가한다 evan-app.yourdomain.com → 192.168.0.204:8080 # SSL, 인증, Rate Limit 모두 중앙에서 통제 # 개발자 서버에 Traefik을 설치하지 않는다
Traefik 관련 주의사항
  1. 개발자 서버에 Traefik, Nginx, HAProxy 등 리버스 프록시를 설치하지 않는다
  2. Let's Encrypt 인증서를 개별 서버에서 발급하지 않는다 — 중앙 Traefik이 담당한다
  3. Consul에 서비스를 수동으로 등록하려 하지 않는다 — Docker 라벨 또는 설정 파일을 사용한다
  4. 외부 접근이 필요한 서비스가 있으면 인프라 관리자에게 Traefik 라우팅 추가를 요청한다
  5. Traefik Dashboard(8080 포트)에 무단 접근하지 않는다 — 라우팅 전체를 볼 수 있는 민감 화면이다

관문이 하나여야
인프라가 안전하다

Traefik의 역할을 이해했다면, 이제 개발자 서버에서 할 수 있는 것과 없는 것을 구분할 차례다.