Ana içeriğe geç
Kategoriye Dön

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.

Okuma süresi: 18 dk DevOps & Otomasyon
traefikreverse proxyload balancerdockerkubernetesssldevops
Yazar
REXE Teknoloji Ağ ve Güvenlik Ekibi
Editör
REXE Teknoloji Teknik Yayın Editörü
İlk yayın
Son güncelleme

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

hljs yaml
# 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ı

hljs yaml
# 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:

hljs yaml
# Ö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

hljs yaml
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ı)

hljs yaml
# 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

hljs yaml
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

hljs yaml
# 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:

hljs bash
# 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

hljs bash
# 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)

hljs yaml
# 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

hljs yaml
# 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

hljs yaml
# traefik.yml - TCP entrypoint
entryPoints:
  mysql:
    address: ":3306"
  redis:
    address: ":6379"
hljs yaml
# config/tcp.yml
tcp:
  routers:
    mysql-router:
      entryPoints:
        - mysql
      rule: "HostSNI(`*`)"
      service: mysql-service

  services:
    mysql-service:
      loadBalancer:
        servers:
          - address: "mysql:3306"
hljs yaml
# 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

hljs yaml
# 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.

Sık Sorulan Sorular

Traefik ile Nginx arasındaki temel fark nedir?

Traefik, Docker/Kubernetes ile derin entegrasyona sahip ve servisleri otomatik olarak keşfeder. Nginx statik yapılandırma gerektirir ve her değişiklikte reload gerekir. Traefik dinamik yapılandırma destekler ve sıfır downtime ile güncellenir. Nginx daha olgun ve yüksek trafikte daha iyi performans gösterebilir. Mikroservis ortamları için Traefik, geleneksel web sunucuları için Nginx tercih edilir.

Traefik dashboard'u production'da nasıl güvende tutarım?

Dashboard'u asla insecure modda (port 8080) production'da açmayın. Traefik container'ına label ekleyerek dashboard'u HTTPS üzerinden basic auth ile koruyun. IP whitelist middleware ile erişimi belirli IP'lerle sınırlayın. Alternatif olarak dashboard'u tamamen devre dışı bırakıp Prometheus/Grafana ile izleme yapabilirsiniz.

Let's Encrypt wildcard sertifikası için DNS challenge nasıl yapılandırılır?

traefik.yml'de certificatesResolvers altında dnsChallenge provider'ını ayarlayın. Cloudflare için 'provider: cloudflare' ve 'CF_DNS_API_TOKEN' environment variable'ı gereklidir. Diğer DNS provider'ları için ilgili API anahtarlarını environment variable olarak tanımlayın. DNS challenge, HTTP challenge'a kıyasla daha güvenlidir ve wildcard sertifika almayı mümkün kılar.

Traefik'te middleware sırası önemli midir?

Evet, middleware'ler tanımlandıkları sırayla uygulanır. Genellikle önerilen sıra: IP whitelist → Rate limit → Auth → Headers. Yanlış sıralama beklenmedik davranışlara yol açabilir. Örneğin auth middleware'ini rate limit'ten önce koyarsanız, kimlik doğrulanmamış istekler de rate limit'e dahil edilir.

Traefik ile zero-downtime deployment nasıl yapılır?

Docker Swarm veya Kubernetes'te rolling update kullanın. Traefik, yeni container'lar hazır olduğunda otomatik olarak trafiği yönlendirir. Health check yapılandırması kritiktir: sağlıklı olmayan container'lara trafik gönderilmez. 'traefik.http.services.myapp.loadbalancer.healthcheck.path=/health' label'ı ile health check endpoint'i tanımlayın.

Traefik'te birden fazla domain için tek sertifika (SAN) nasıl alınır?

Traefik, her domain için ayrı sertifika alır. Birden fazla domain için router rule'unda 'Host(`a.com`) || Host(`b.com`)' kullanın. Her domain için ayrı sertifika otomatik olarak alınır. Wildcard sertifika için DNS challenge gereklidir. SAN sertifikası için manuel yapılandırma veya harici sertifika kullanımı gerekebilir.

İlgili Makaleler

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.

20 dk
ansibleotomasyoninfrastructure as code
Ağ TrafiğiGelen GbpsGiden Gbps