Traefik에 동적 구성 제공하기
출처: Traefik에 동적 구성 제공하기 (Providing Dynamic Configuration to Traefik)
본문
Traefik에 동적 (라우팅) 구성 제공하기
동적 구성—이제는 라우팅 구성이라고도 불려요—은 Traefik이 들어오는 요청을 올바른 서비스로 라우팅하는 방법을 정의해요. 이것은 Traefik의 핵심 구성 요소와 프로바이더를 설정하는 설치 구성(과거에는 정적 구성이라고 불렸어요)과는 구별돼요.
환경과 선호도에 따라 이 라우팅 구성은 여러 가지 방법으로 제공할 수 있어요:
-
파일 또는 구조화된 프로바이더: TOML 또는 YAML 파일을 사용해요.
-
Docker 및 ECS 프로바이더: 컨테이너 라벨을 사용해요.
-
Kubernetes 프로바이더: 어노테이션을 사용해요.
-
KV 프로바이더: 키-값 쌍을 사용해요.
-
기타 프로바이더 (Consul, Nomad 등): 태그를 사용해요.
파일 프로바이더 사용하기
파일 프로바이더를 사용하면 TOML 또는 YAML 구문을 사용해 정적 파일에 라우팅 구성을 정의할 수 있어요. 이 방법은 서비스를 자동으로 발견할 수 없는 환경이거나, 구성을 수동으로 관리하는 것을 선호할 때 이상적이에요.
파일 프로바이더 활성화
파일 프로바이더를 활성화하려면 Traefik 설치 구성에 다음을 추가하세요:
YAML
providers:
file:
directory: "/path/to/dynamic/conf"
TOML
[providers.file]
directory = "/path/to/dynamic/conf"
파일 프로바이더를 사용해 라우터와 서비스를 선언하는 예시
파일 (YAML)
http:
routers:
my-router:
rule: "Host(`example.com`)"
service: my-service
services:
my-service:
loadBalancer:
servers:
- url: "http://localhost:8080"
파일 (TOML)
[http]
[http.routers]
[http.routers.my-router]
rule = "Host(`example.com`)"
service = "my-service"
[http.services]
[http.services.my-service.loadBalancer]
[[http.services.my-service.loadBalancer.servers]]
url = "http://localhost:8080"
Docker와 ECS에서 라벨 사용하기
Docker 또는 Amazon ECS를 사용할 때, 컨테이너 라벨로 라우팅 구성을 정의할 수 있어요. 이 방법은 추가 파일 없이 Traefik이 서비스를 자동으로 발견하고 구성을 적용하게 해줘요.
Docker 예시 Docker 컨테이너를 배포할 때 라벨을 지정해 라우팅 규칙과 서비스를 정의할 수 있어요:
services:
my-service:
image: my-image
labels:
- "traefik.http.routers.my-router.rule=Host(`example.com`)"
- "traefik.http.services.my-service.loadbalancer.server.port=80"
ECS 예시 ECS에서는 태스크 정의 라벨을 사용해 같은 효과를 얻을 수 있어요:
{
"containerDefinitions": [
{
"name": "my-service",
"image": "my-image",
"dockerLabels": {
"traefik.http.routers.my-router.rule": "Host(`example.com`)",
"traefik.http.services.my-service.loadbalancer.server.port": "80"
}
}
]
}
Kubernetes 프로바이더 사용하기
Kubernetes 프로바이더의 경우, 네이티브 Ingress 또는 커스텀 리소스(예: IngressRoute)를 사용해 Traefik을 구성할 수 있어요. Ingress 또는 IngressRoute 정의의 어노테이션을 통해 라우팅 규칙과 미들웨어 설정을 정의할 수 있어요. 예를 들어:
Kubernetes 예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
namespace: apps
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.priority: "42"
traefik.ingress.kubernetes.io/router.tls: "true"
traefik.ingress.kubernetes.io/router.tls.options: apps-opt@kubernetescrd
spec:
rules:
- host: my-domain.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
tls:
- secretName: supersecret
KV 프로바이더에서 키-값 쌍 사용하기
KV 프로바이더의 경우 키-값 쌍으로 Traefik을 구성할 수 있어요.
예시
etcd
# 라우터 규칙 설정
etcdctl put /traefik/http/routers/my-router/rule "Host(`example.com`)"
# 라우터와 연결된 서비스 정의
etcdctl put /traefik/http/routers/my-router/service "my-service"
# 서비스의 백엔드 서버 URL 설정
etcdctl put /traefik/http/services/my-service/loadbalancer/servers/0/url "http://localhost:8080"
Redis
# 라우터 규칙 설정
redis-cli set traefik/http/routers/my-router/rule "Host(`example.com`)"
# 라우터와 연결된 서비스 정의
redis-cli set traefik/http/routers/my-router/service "my-service"
# 서비스의 백엔드 서버 URL 설정
redis-cli set traefik/http/services/my-service/loadbalancer/servers/0/url "http://localhost:8080"
ZooKeeper
# 라우터 규칙 설정
create /traefik/http/routers/my-router/rule "Host(`example.com`)"
# 라우터와 연결된 서비스 정의
create /traefik/http/routers/my-router/service "my-service"
# 서비스의 백엔드 서버 URL 설정
create /traefik/http/services/my-service/loadbalancer/servers/0/url "http://localhost:8080"
다른 프로바이더에서 태그 사용하기
Consul과 Nomad 같은 라벨을 지원하지 않는 프로바이더의 경우, 태그를 사용해 라우팅 구성을 제공할 수 있어요.
예시
Consul / Nomad
{
"Name": "my-service",
"Tags": [
"traefik.http.routers.my-router.rule=Host(`example.com`)",
"traefik.http.services.my-service.loadbalancer.server.port=80"
],
"Address": "localhost",
"Port": 8080
}