Traefik Nedir? Nasıl Kurulur?
7 min read

Traefik Nedir? Nasıl Kurulur?

Traefik, açık kaynaklı bir reverse proxy ve load balancer olarak öne çıkan yazılımdır. Özellikle mikroservis mimarileri için tasarlanmıştır.
Traefik Nedir? Nasıl Kurulur?
Photo by Chinmay B / Unsplash

Traefik, reverse proxy ve load balancer olarak görev yapan açık kaynaklı bir yazılımdır. Özellikle microservice mimarileri için tasarlanmıştır ve Docker, Kubernetes, Swarm gibi container orchestration sistemleri ile entegrasyonu sağlayacak şekilde geliştirilmiştir. Traefik; HTTP, HTTPS, TCP, UDP gibi protokolleri destekler ve esnek bir konfigürasyon yapısına sahiptir.

Traefik'in en önemli özelliklerinden ikisi reverse proxy ve load balancer özellikleridir. Hızlıca ne olduklarına bakalım;

  • Reverse Proxy: Gelen istekleri hedef uygulama sunucularına yönlendirir. Öncelikle, gelen istekleri alır, içindeki bilgileri değerlendirir ve uygun backend sunucuya yönlendirir. Bu sayede, dış dünyayla iletişim kuran uygulama sunucularını korur ve gizler. Normal proxy kullanıcıları gizlerken, reverse proxy ise sunucuları gizler.
  • Load Balancing: Gelen trafiği birden fazla uygulama sunucusu arasında dengeler. Bu, yüksek erişimli ve performanslı uygulama sunucu altyapıları için önemlidir. Traefik, belirli bir backend'e gelen trafiği dengeleyerek yüksek kullanılabilirlik ve hızlı yanıt süreleri sağlar.

Traefik, reverse proxy ve load balancing yetenekleri dışında SSL/TLS desteği ve gelişmiş routing özellikleri ile, başta mikroservice mimarileri ve container orchestration sistemleri kullanılarak geliştirilen modern uygulamalar için uygundur. Bu sayede, uygulama altyapısının esnek, ölçeklenebilir ve güvenli bir şekilde yönetilebilmesini sağlar.

Traefik'in sunduğu önemli özelliklere değindikten sonra artık bileşenleri tanımakla devam edebiliriz.

1. Traefik Bileşenleri Nelerdir?

Traefik; EntryPoints, Routers, Middlewares ve Services kavramları üzerine kuruludur. Bu sebeple ilk olarak bu kavramları anlamak adına kısa bir özet geçelim.

  • EntryPoints:
    • EntryPoints, Traefik'in gelen ağ trafiğini karşıladığı ve yönlendirdiği noktalardır.
    • Bir EntryPoint, belirli bir portu dinleyen ve belirli bir protokolü (HTTP veya HTTPS gibi) destekleyen bir ağ noktasını temsil eder.
    • Örneğin, HTTP trafiğini dinlemek için "web" adlı bir EntryPoint tanımlayabilirsiniz.
entryPoints:
  web:
    address: ":80"
  • Routers:
    • Routers, gelen istekleri belirli bir servise yönlendiren ve bu yönlendirmeyi belirli kurallara göre gerçekleştiren yapıları temsil eder.
    • Bir Router, belirli bir EntryPoints'a bağlıdır ve gelen isteklerin hangi servise yönlendirileceğini belirlemek için belirli kuralları içerir.
    • Örneğin, belirli bir domain adına veya path'e göre yönlendirme kuralları belirleyebilirsiniz.
routers:
  my-router:
    rule: "Host(`example.com`) || (PathPrefix(`/api`) && Method(`GET`))"
    service: my-service
  • Middlewares:
    • Middlewares, gelen istekleri veya çıkan yanıtları değiştirmek, güvenlik önlemleri uygulamak veya başka özelleştirmeler yapmak için kullanılan ara katmanlardır.
    • Her Router, bir veya daha fazla Middleware'a bağlanabilir. Middlewares, genellikle belirli işlevleri gerçekleştirmek için kullanılır. Örneğin otomatik HTTPS yönlendirmesi, rate limiting, basit kimlik doğrulama gibi ara katmanlar ekleyebilirsiniz.
middlewares:
  my-middleware:
    redirectScheme:
      scheme: "https"
      permanent: true
  • Services:
    • Services, bir Router'ın yönlendirdiği istekleri gerçek uygulama sunucularına yönlendiren yapıları temsil eder.
    • Bir Service, genellikle bir mikroservisi veya bir uygulama sunucusunu temsil eder ve bu servise yönlendirilen trafik, bu servisin kullanılabilirlik ve performansına dayalı olarak dağıtılır.
services:
  my-service:
    loadBalancer:
      servers:
        - url: "http://backend1"
        - url: "http://backend2"

2. Traefik Nasıl Kurulur?

Kubernetes cluster'ınızda Traefik'i kurmanın en kolay yolu Helm chart kullanmaktır. Aşağıdaki komutlarla Traefik'i cluster'ınızda hızlıca aktif edebilirsiniz.

helm repo add traefik https://traefik.github.io/charts
helm repo update
helm install traefik traefik/traefik

Ardından cluster'ınız içinde Traefik release'ini görebilirsiniz.

Eğer farklı kurulum seçenekleri görmek istiyorsanız Traefik Installation Documentation sayfasını ziyaret edebilirsiniz.

💡
Güvenlik sebebiyle Helm Chart ile birlikte dashboard erişimi aktif olarak gelmiyor. Bu sebeple pod'un 9000 portuna port-forwarding yaparak veya service resource'a traefik:9000 portunu target ekleyerek dashboard'a erişebilirsiniz.

Traefik pod'umuzun 9000 portuna port-forwarding yaptıktan sonra artık localhost:9000/dashboard/ adresinden dashboard'a erişebiliriz.

kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000

3. Traefik Provider ve Konfigürasyon

Traefik'in "provider" kavramı, Traefik'in konfigürasyonunu dinamik bir şekilde yönetmek ve yönlendirmeleri otomatik olarak algılamak için kullanılan bir bileşen sistemini ifade eder. Traefik, çeşitli konfigürasyon kaynaklarına (providers) bağlanabilir ve bu kaynaklardan gelen bilgileri kullanarak dinamik olarak yönlendirme kuralları, servis bilgileri ve diğer konfigürasyonları günceller.

Traefik'in farklı konfigürasyon sağlayıcıları (providers) vardır ve bunlar, çeşitli ortamlarda çalışan uygulama altyapılarına uyum sağlamak üzere tasarlanmıştır. Bazı Traefik provider'lar şu şekildedir:

  • Docker
  • Kubernetes Ingress, IngressRoute ve Gateway API
  • File
  • Consul
  • Redis
  • HTTP

Liste uzayıp gidiyor fakat siz detaylı listeye Supported Providers kısmından ulaşabilirsiniz. Biz Kubernetes cluster'ımız için Helm Chart ile de birlikte gelen Ingress ve IngressRoute (KubernetesCRD) providerlarını kullanacağız.

3.1. Kubernetes Ingress İle Traefik Konfigürasyonu

En sık kullanılan ve burada da örneği göstereceğimiz provider olan KubernetesIngress, aslında bir Kubernetes Ingress Controller nesnesidir ve cluster'daki servislere erişimi yapılandırırken Ingress nesnelerini kullanır.

Traefik konfigürasyonunun Ingress ile nasıl yapıldığını gösterebilmek için öncelikle basit bir senaryo hazırlayalım:

  • kerteriz.online adresini A DNS kaydı ile traefik isimli service'in load balancer IP adresine yönlendirelim.
  • web.kerteriz.online adresini CNAME kaydı ile kerteriz.online adresine yönlendirelim.
  • Bir adet nginx çalıştıran static-web isimli Pod'umuz olsun.
  • web-service isimli Kubernetes Service nesnesi ile de static-web isimli podumuza erişim sağlayalım.
  • Traefik tarafından kurulumda otomatik oluşturulan traefik isimli Ingress Class kullanan web-ingress isimli Ingress nesnesi ile de web.kerteriz.online adresini web-service isimli servisimize yönlendirelim.

Özetle senaryomuz şu şekilde olacak:

Senaryomuza başlamadan önce hatırlatma olması için şu yazıları okumanızı tavsiye ederiz.

Kubernetes Pod Nedir?
Pod, içinde bir veya birden fazla container’ın çalıştığı en küçük Kubernetes birimidir.
Kubernetes Service Nedir?
Kubernetes Service, bir Pod grubuna sabit bir adresten erişmek için kullanılan bir Kubernetes nesnesidir.
Kubernetes Ingress Nedir?
Kubernetes Ingress, bir HTTP(S) yönlendiricidir ve servislere dışarıdan trafik yönlendirmesi sunar.

Öyleyse ilk olarak domain kayıtlarımızı yaparak başlayalım.

  • kerteriz.online adresini A DNS kaydı ile traefik service'in load balancer IP adresine yönlendirelim. Çünkü traefik service nesnemiz 80 portuna gelen istekleri traefik pod'unun 8000 (web) portuna, yani web entrypoint'ine yönlendirecek ve böylece istekler Traefik tarafından karşılanır hale gelecek.
apiVersion: v1
kind: Service
metadata:
  name: traefik
****
****
spec:
  ports:
    - name: web
      protocol: TCP
      port: 80
      targetPort: web
      nodePort: 31975
    - name: websecure
      protocol: TCP
      port: 443
      targetPort: websecure
      nodePort: 30233
    - name: dashboard
      protocol: TCP
      port: 8080
      targetPort: traefik
      nodePort: 30234
****
****
Dashboard'u bu şekilde açmanızı önermiyoruz. Burada sadece test amaçlı kullanılacaktır.

Bunun için ilk olarak traefik servisinin Load Balancer IP adresine bakalım.

Ardından 45.32.153.75 ip adresini A kaydı olarak domaine ekleyelim.

Artık kerteriz.online adresine gelen istekler 80 portu sayesinde web entrypoint'inden giriş yapıyor. Test etmek isterseniz de 8080 portu üzerinden traefik entrypoint'ini test edebiliriz. Örneğin kerteriz.online:8080/dashboard/ veya kerteriz.online:8080/ping adreslerine bakabilirsiniz.

  • web.kerteriz.online adresini CNAME kaydı ile kerteriz.online adresine yönlendirelim.Böylece son adımdaki Ingress'i oluşturduktan sonra web.kerteriz.online adresi üzerinden static-web isimli pod'umuza Traefik web entrypoint'i üzerinden ulaşabileceğiz.
  • static-web isimli nginx çalıştıran Pod oluşturalım.
apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    app: web
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
  • web-service isimli service'i oluşturalım ve trafiğin static-web isimli poda aktarılması sağlayalım.
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  • web-ingress Ingress nesnesi ile de web.kerteriz.online adresini web-service isimli servisimize yönlendirelim. annotations ile hangi entrypoint'i kullanacağımızı da belirtmeyi unutmuyoruz.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: web.kerteriz.online
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

Ingress nesnesi oluşturulduktan sonra Traefik Ingress Controller provider sayesinde yeni Ingress nesnesini otomatik algılayacak ve Routes olarak kaydını gerçekleştirecektir.

Test için web.kerteriz.online adresine gidelim.

Süper! Traefik servisi dışında başka hiçbir Load Balancer kullanmadan Ingress'leri reverse proxy ve load balancer yetenekleriyle expose etmiş olduk. Artık daha da kurcalayarak birçok özelliğini rahatça keşfe çıkabilirsiniz!