Traefik Reverse Proxy: Docker ve Kubernetes için Modern Load Balancer
Traefik kurulumu, Docker provider ile otomatik servis keşfi, Let's Encrypt SSL, middleware yapılandırması, dashboard, Kubernetes Ingress Controller ve yük dengeleme.
İçindekiler
Traefik Reverse Proxy: Docker ve Kubernetes için Modern Load Balancer
Traefik, mikroservis mimarileri için tasarlanmış modern bir edge router ve reverse proxy'dir. Docker ve Kubernetes ile derin entegrasyonu sayesinde servisleri otomatik olarak keşfeder ve yönlendirir.
Traefik Nedir?
Traefik'in temel özellikleri:
- Otomatik servis keşfi: Docker/Kubernetes label'ları ile otomatik routing
- Let's Encrypt entegrasyonu: Otomatik SSL sertifikası yönetimi
- Middleware sistemi: Auth, rate limiting, redirect, headers
- Dashboard: Gerçek zamanlı izleme arayüzü
- Çoklu provider: Docker, Kubernetes, Consul, etcd desteği
- TCP/UDP routing: HTTP dışı protokol desteği
Traefik v3, v2'ye kıyasla daha iyi performans ve yeni özellikler sunar. Bu rehber Traefik v3 üzerine odaklanmaktadır.
Traefik v3 Kurulumu
Docker Compose ile Kurulum
# docker-compose.yml
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "8080:8080" # Dashboard (production'da kapatın)
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./config:/etc/traefik/config:ro
- traefik_certs:/certs
networks:
- traefik-net
labels:
- "traefik.enable=true"
# Dashboard
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hash"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
volumes:
traefik_certs:
networks:
traefik-net:
external: true
traefik.yml Yapılandırması
# traefik.yml
global:
checkNewVersion: true
sendAnonymousUsage: false
api:
dashboard: true
insecure: false # Production'da false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
http3:
advertisedPort: 443
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /certs/acme.json
httpChallenge:
entryPoint: web
# DNS challenge (wildcard için)
# dnsChallenge:
# provider: cloudflare
# resolvers:
# - "1.1.1.1:53"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-net
file:
directory: /etc/traefik/config
watch: true
log:
level: INFO
filePath: /var/log/traefik/traefik.log
accessLog:
filePath: /var/log/traefik/access.log
bufferingSize: 100
Docker Provider ile Otomatik Routing
Docker label'ları ile servisleri otomatik olarak Traefik'e kaydedin:
# Örnek uygulama
services:
webapp:
image: nginx:alpine
networks:
- traefik-net
labels:
# Traefik'i etkinleştir
- "traefik.enable=true"
# HTTP router
- "traefik.http.routers.webapp.rule=Host(`app.example.com`)"
- "traefik.http.routers.webapp.entrypoints=websecure"
- "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
# Servis portu
- "traefik.http.services.webapp.loadbalancer.server.port=80"
# Middleware uygula
- "traefik.http.routers.webapp.middlewares=security-headers,rate-limit"
networks:
traefik-net:
external: true
Çoklu Servis Örneği
services:
api:
image: myapi:latest
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
- "traefik.http.services.api.loadbalancer.server.port=3000"
# Health check
- "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.api.loadbalancer.healthcheck.interval=30s"
frontend:
image: myfrontend:latest
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`example.com`) || Host(`www.example.com`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
- "traefik.http.services.frontend.loadbalancer.server.port=80"
networks:
traefik-net:
external: true
Middleware Yapılandırması
Statik Middleware (traefik.yml veya config dosyası)
# config/middlewares.yml
http:
middlewares:
# Güvenlik başlıkları
security-headers:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
forceSTSHeader: true
contentTypeNosniff: true
frameDeny: true
referrerPolicy: "strict-origin-when-cross-origin"
customResponseHeaders:
X-Powered-By: ""
Server: ""
# Rate limiting
rate-limit:
rateLimit:
average: 100
burst: 50
period: 1m
sourceCriterion:
ipStrategy:
depth: 1
# Basic auth
basic-auth:
basicAuth:
users:
- "admin:$apr1$xyz$hashedpassword"
removeHeader: true
# IP whitelist
ip-whitelist:
ipAllowList:
sourceRange:
- "192.168.1.0/24"
- "10.0.0.0/8"
# Redirect www to non-www
www-redirect:
redirectRegex:
regex: "^https://www\\.(.*)"
replacement: "https://${1}"
permanent: true
# Compress
compress:
compress:
excludedContentTypes:
- text/event-stream
Label ile Middleware
labels:
# Middleware tanımla ve uygula
- "traefik.http.middlewares.myapp-auth.basicauth.users=user:$$apr1$$hash"
- "traefik.http.middlewares.myapp-ratelimit.ratelimit.average=50"
- "traefik.http.middlewares.myapp-ratelimit.ratelimit.burst=20"
- "traefik.http.routers.myapp.middlewares=myapp-auth,myapp-ratelimit"
# Redirect middleware
- "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-https.redirectscheme.permanent=true"
Dashboard
# Güvenli dashboard yapılandırması
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$xyz$$hash"
Basic auth şifresi oluşturma:
# htpasswd ile şifre oluştur
echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
# Veya openssl ile
echo "admin:$(openssl passwd -apr1 'sifreniz')" | sed -e 's/\$/\$\$/g'
Kubernetes Ingress Controller
Helm ile Kurulum
# Traefik Helm deposunu ekle
helm repo add traefik https://traefik.github.io/charts
helm repo update
# Traefik kur
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
--set deployment.replicas=2 \
--set ports.web.redirectTo.port=websecure \
--set ingressRoute.dashboard.enabled=true
IngressRoute (Traefik CRD)
# ingressroute.yml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: webapp-ingress
namespace: default
spec:
entryPoints:
- websecure
routes:
- match: Host(`app.example.com`)
kind: Rule
services:
- name: webapp-service
port: 80
middlewares:
- name: security-headers
tls:
certResolver: letsencrypt
Middleware CRD
# middleware.yml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: default
spec:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
contentTypeNosniff: true
frameDeny: true
TCP/UDP Routing
# traefik.yml - TCP entrypoint
entryPoints:
mysql:
address: ":3306"
redis:
address: ":6379"
# config/tcp.yml
tcp:
routers:
mysql-router:
entryPoints:
- mysql
rule: "HostSNI(`*`)"
service: mysql-service
services:
mysql-service:
loadBalancer:
servers:
- address: "mysql:3306"
# Docker label ile TCP
labels:
- "traefik.tcp.routers.mysql.rule=HostSNI(`*`)"
- "traefik.tcp.routers.mysql.entrypoints=mysql"
- "traefik.tcp.services.mysql.loadbalancer.server.port=3306"
Yük Dengeleme
# Birden fazla instance ile yük dengeleme
services:
api:
image: myapi:latest
deploy:
replicas: 3
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.services.api.loadbalancer.server.port=3000"
# Sticky sessions
- "traefik.http.services.api.loadbalancer.sticky.cookie=true"
- "traefik.http.services.api.loadbalancer.sticky.cookie.name=traefik_session"
- "traefik.http.services.api.loadbalancer.sticky.cookie.secure=true"
# Health check
- "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.api.loadbalancer.healthcheck.interval=10s"
- "traefik.http.services.api.loadbalancer.healthcheck.timeout=3s"
Sonuç
Traefik, modern mikroservis altyapıları için güçlü bir reverse proxy ve load balancer çözümüdür. Docker ve Kubernetes ile derin entegrasyonu, otomatik SSL yönetimi ve zengin middleware ekosistemi ile production ortamlarında güvenilir bir seçimdir. Label tabanlı yapılandırması sayesinde her servis kendi routing kurallarını tanımlayabilir.
İlgili Makaleler
Docker Compose Rehberi: Çok Konteynerli Uygulama Yönetimi
Docker Compose ile çok konteynerli uygulama tanımlama, servis bağımlılıkları, environment variables, health check, scaling ve production deployment. Kapsamlı rehber.
GitHub Actions ile Otomatik Deployment: CI/CD Pipeline Kurulumu
GitHub Actions ile CI/CD pipeline oluşturma, Docker build ve push, SSH ile sunucuya deployment, test otomasyonu, secrets yönetimi ve workflow optimizasyonu.
Ansible ile Sunucu Otomasyonu: Infrastructure as Code
Ansible kurulumu, inventory dosyası, playbook yazımı, rol yapısı, değişkenler, şifreli vault, ad-hoc komutlar ve sunucu yapılandırma otomasyonu. Adım adım rehber.