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

İç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

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.