Traefik, Docker ve Kubernetes gibi orkestratörlerle doğrudan entegre olarak servislerinize giden rotaları otomatik olarak keşfeden ve yapılandıran, dinamik bir ters proxy ve yük dengeleyici olarak çalışan açık kaynaklı bir Edge Router'dır.
Temel Kavramlar
Traefik, dinamik bir yapılandırma modeliyle çalışır; böylece arka uç servisleri değiştiğinde dosyaları elle güncelleme ve servisleri yeniden başlatma ihtiyacı ortadan kalkar. Bu gerçek zamanlı uyum yeteneği, birbirine bağlı birkaç bileşen sayesinde sağlanır.
Provider'lar
Provider'lar, Traefik'in altyapınızla etkileşime girmesini sağlayan bağlayıcılardır. Alttaki orkestratörün API'sini yeni container'lar, servisler veya deployment'lar gibi değişiklikler için izlerler.
Yaygın provider'lar:
* Docker: Docker daemon olaylarını ve container label'larını izler.
* Kubernetes: Kubernetes API'sini Ingress, IngressRoute, Service ve Endpoint kaynakları için izler.
* File: Yapılandırmayı statik YAML veya TOML dosyalarından okur.
* Consul, etcd, ZooKeeper: Dinamik yapılandırma için key-value store'larla entegre olur.
Yönlendirme Yapılandırması
Traefik, gelen istekleri tanımlı bir yönlendirme akışıyla işler:
- EntryPoint'ler: Traefik'in dinlediği portları tanımlayan ağ dinleyicileridir (örneğin 80 portunda
web, 443 portundawebsecure). - Router'lar: Router'lar gelen istekleri tanımlı kurallara göre analiz eder (örneğin
Host(),PathPrefix(),Headers()). Bir istek router'ın kuralıyla eşleşirse iletilir. Router'lar ayrıca hangi EntryPoint'leri dinleyeceklerini belirtir ve Middleware uygulayabilirler. - Middleware'ler: İstekleri servise ulaşmadan önce ya da yanıtları istemciye gönderilmeden önce değiştirebilen bileşenlerdir. Zincirlenebilirler.
- Servisler: Servisler, gerçek arka uç uygulama örneklerine nasıl ulaşılacağını tanımlar. Bir servis genellikle uygulamanızın bir veya daha fazla IP adresine ve portuna işaret eder. Traefik, istekleri bir servisin birden fazla örneği arasında dengeleyebilir.
Akış şöyledir: İstek -> EntryPoint -> Router -> Middleware(ler) -> Servis -> Arka uç uygulaması.
Öne Çıkan Özellikler
Otomatik Servis Keşfi
Traefik, Docker ve Kubernetes gibi orkestratörlerle doğrudan entegre olur. Metadata'yı (örneğin Docker label'ları, Kubernetes annotation'ları veya Custom Resource'lar) okuyarak servisleri otomatik keşfeder ve yönlendirme yapılandırmasını herhangi bir manuel müdahale ya da yeniden başlatma gerektirmeden dinamik olarak günceller. Bu, ayrı proxy yapılandırma dosyaları tutma ihtiyacını ortadan kaldırır.
SSL/TLS Sonlandırma
Traefik, SSL/TLS sonlandırma için yerleşik destek sunar. ACME (Automatic Certificate Management Environment) protokolü üzerinden Let's Encrypt kullanarak sertifikaları otomatik olarak sağlayabilir ve yenileyebilir; HTTP-01, TLS-ALPN-01 ve DNS-01 doğrulamalarını destekler. Özel sertifikalar da yapılandırılabilir.
Yük Dengeleme
Traefik bir yük dengeleyici olarak çalışır ve gelen trafiği bir servisin birden fazla örneği arasında dağıtır.
Kullanılabilir yük dengeleme stratejileri:
* Round Robin: İstekleri sırayla her sunucuya dağıtır.
* Weighted Round Robin: Trafik dağılımını kontrol etmek için sunuculara ağırlık atanmasına izin verir.
* Sticky Sessions: Belirli bir istemciden gelen isteklerin her zaman aynı sunucuya yönlendirilmesini sağlar.
Middleware'ler
Middleware'ler, istekleri veya yanıtları değiştirmek için esnek bir yol sunar. Belirli router'lara ya da global olarak uygulanabilirler.
Yaygın middleware örnekleri:
* Kimlik doğrulama: Basic authentication (BasicAuth), Digest authentication.
* Rate Limiting: Bir istemcinin belirli bir süre içinde yapabileceği istek sayısını kontrol eder.
* Header düzenleme: İstek/yanıt header'larını ekleme, kaldırma veya değiştirme.
* Yönlendirmeler: HTTP'den HTTPS'e yönlendirme, kalıcı yönlendirmeler.
* IP beyaz/kara listesi: İstemci IP adreslerine göre erişimi kısıtlama.
Panel
Traefik, yapılandırılmış router'lara, servislere ve middleware'lere gerçek zamanlı genel bakış sunan web tabanlı bir panel içerir. Yöneticilerin aktif yapılandırmayı incelemesine ve trafiği izlemesine olanak tanır.
Docker ile Traefik
Traefik'i Docker ile entegre etmek, Traefik'i bir container olarak çalıştırmayı ve Docker daemon soketine erişmesine izin vermeyi gerektirir. Servis yapılandırması genellikle uygulama container'ları üzerindeki Docker label'ları ile yönetilir.
Örnek docker-compose.yml Kurulumu
Aşağıdaki örnek, Traefik ve örnek bir whoami uygulamasının kurulumu için bir docker-compose.yml dosyasını gösterir.
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false # Yalnızca traefik.enable=true olan servisleri yayınla
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.myresolver.acme.tlschallenge=true # Let's Encrypt için
- --certificatesresolvers.myresolver.acme.email=your-email@example.com
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json # Sertifikalar için kalıcı depolama
ports:
- "80:80"
- "443:443"
- "8080:8080" # Traefik panelini yayınla
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro" # Provider erişimi için Docker soketini bağla
- "./letsencrypt:/letsencrypt" # ACME sertifikaları için kalıcı depolama
labels:
# Panel servisinin kendisi için Traefik'i etkinleştir
- "traefik.enable=true"
# Traefik paneli için router
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.service=api@internal" # Dahili Traefik API servisi
- "traefik.http.routers.traefik-dashboard.tls.certresolver=myresolver"
# Panel için basic authentication middleware'i (gerçek htpasswd hash'i ile değiştirin)
- "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth@docker"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=user:$$apr1$$YOUR_HTPASSWD_HASH"
networks:
- web
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true" # Bu servis için Traefik'i etkinleştir
- "traefik.http.routers.whoami.rule=Host(`whoami.yourdomain.com`)" # Yönlendirme kuralını tanımla
- "traefik.http.routers.whoami.entrypoints=websecure" # websecure (HTTPS) üzerinde dinle
- "traefik.http.routers.whoami.tls.certresolver=myresolver" # Let's Encrypt resolver'ını kullan
networks:
- web
networks:
web:
external: true # Web'e açık tüm servisler için harici bir ağ kullan
Not: docker-compose up -d komutunu çalıştırmadan önce harici ağı docker network create web ile oluşturun.
dashboard-auth için htpasswd hash'ini echo $(htpasswd -nb user password) ile üretin.
Kubernetes ile Traefik
Traefik, Kubernetes ile API'si üzerinden entegre olur; standart Ingress kaynaklarını ve gelişmiş yapılandırmalar için kendi Custom Resource Definition'larını (CRD) kullanır. Önerilen kurulum yöntemi Helm'dir.
Helm ile Kurulum
helm repo add traefik https://traefik.github.io/charts
helm repo update
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
-f values.yaml
values.yaml dosyası genellikle Traefik'in EntryPoint'lerini, Provider'larını ve ACME resolver'larını (örneğin Let's Encrypt için myresolver) yapılandırır.
Custom Resource Definition (CRD) ile Yapılandırma
Traefik, Kubernetes yeteneklerini kendi CRD'leriyle genişletir ve standart Ingress'ten daha fazla kontrol sunar:
* IngressRoute: Yönlendirme kurallarını, entry point'leri ve ilişkili servisleri, TLS yapılandırması ve middleware'ler dahil olmak üzere tanımlar. Standart Kubernetes Ingress'ine göre daha güçlü bir alternatiftir.
* Middleware: IngressRoute'lara uygulanabilen, yeniden kullanılabilir istek/yanıt düzenleyicilerini tanımlar.
* TraefikService: Yük dengeleme stratejileri ve harici servisler dahil olmak üzere arka uç servislerinin daha ayrıntılı tanımlanmasına olanak tanır.
Örnek Kubernetes Yapılandırması
Bu örnek, bir whoami uygulaması için Kubernetes Deployment, Service ve IngressRoute kaynaklarını gösterir.
# whoami-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- containerPort: 80
---
# whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
selector:
app: whoami
ports:
- protocol: TCP
port: 80
targetPort: 80
---
# whoami-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: whoami-ingressroute
spec:
entryPoints:
- websecure # 'websecure' entry point'inin Traefik'in Helm values dosyasında tanımlı olduğu varsayılır
routes:
- match: Host(`whoami.yourdomain.com`)
kind: Rule
services:
- name: whoami # Kubernetes 'whoami' Service'ine işaret eder
port: 80
tls:
certResolver: myresolver # Let's Encrypt için 'myresolver' tanımının Traefik'in Helm values dosyasında olduğu varsayılır
Karşılaştırma: Traefik ile Geleneksel Proxy'ler (Nginx/HAProxy)
| Özellik | Traefik | Nginx/HAProxy (geleneksel) |
|---|---|---|
| Yapılandırma modeli | Dinamik, API tabanlı, otomatik keşif | Statik dosyalar, manuel güncelleme, reload/restart gerektirir |
| Servis keşfi | Docker, K8s, Consul vb. için yerleşik | Harici araçlar (örneğin consul-template) veya manuel yapılandırma gerektirir |
| SSL/TLS yönetimi | Otomatik Let's Encrypt entegrasyonu | Manuel kurulum, otomasyon için harici araçlar veya script'ler |
| Dinamik ortamlarda karmaşıklık | Düşük, doğal entegrasyon, basit label/CRD | Yüksek, otomasyon için karmaşık script veya orkestrasyon gerekir |
| Panel | Yerleşik web arayüzü | Genellikle yok, üçüncü taraf izleme araçları |
| Birincil kullanım senaryosu | Mikroservisler, kısa ömürlü container'lar, cloud-native ortamlar | Kararlı, uzun ömürlü servisler, yüksek performanslı edge proxy |
İzleme ve Panel
Traefik paneli, mevcut yönlendirme yapılandırmasını görselleştirmek ve Traefik'in durumunu izlemek için grafik bir arayüz sunar. Bir web tarayıcısı üzerinden, genellikle 8080 portundan erişilebilir (Docker örneğinde yapılandırıldığı gibi). Güvenlik açısından paneli basic authentication gibi bir middleware ile korumak standart uygulamadır.
En İyi Uygulamalar
- Traefik'i izole edin: Güvenliği artırmak ve yönetimi kolaylaştırmak için Traefik'i özel bir ağda veya ayrı bir Kubernetes namespace'inde çalıştırın.
- Paneli güvenceye alın: Traefik panelini her zaman kimlik doğrulama ile (örneğin
BasicAuthmiddleware'i) koruyun ve yalnızca yetkili kişilere açık olduğundan emin olun. - ACME için kalıcı depolama: Let's Encrypt sertifikaları için ACME depolama yolunun (örneğin
/letsencrypt/acme.json) kalıcı depolamaya bağlandığından emin olun. Bu, container yeniden başlatıldığında veya yeniden dağıtıldığında sertifika kaybını önler. - En az yetki: Docker soketini (
/var/run/docker.sock) bağlarken Traefik'in gereken en az yetkiyle çalıştığından emin olun. Yazma erişimi gerekmiyorsa salt okunur bağlama (:ro) kullanmayı değerlendirin. exposedbydefault=false: Docker provider'ları için--providers.docker.exposedbydefault=falseayarı, güvenlik ve yönetim açısından iyi bir uygulamadır. Bu, yayınlanması gereken container'larda açıkçatraefik.enable=truelabel'ı bulunmasını gerektirir.
