Traefik Nedir? Nasıl Kurulur?
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/traefikArdı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.
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.onlineadresiniADNS kaydı iletraefikisimli service'in load balancer IP adresine yönlendirelim.web.kerteriz.onlineadresini CNAME kaydı ilekerteriz.onlineadresine yönlendirelim.- Bir adet
nginxçalıştıranstatic-webisimli Pod'umuz olsun. web-serviceisimli Kubernetes Service nesnesi ile destatic-webisimli podumuza erişim sağlayalım.- Traefik tarafından kurulumda otomatik oluşturulan
traefikisimli Ingress Class kullananweb-ingressisimli Ingress nesnesi ile deweb.kerteriz.onlineadresiniweb-serviceisimli servisimize yönlendirelim.
Özetle senaryomuz şu şekilde olacak:

Senaryomuza başlamadan önce hatırlatma olması için şu yazıları okumanızı tavsiye ederiz.
Öyleyse ilk olarak domain kayıtlarımızı yaparak başlayalım.
kerteriz.onlineadresiniADNS kaydı ile traefik service'in load balancer IP adresine yönlendirelim. Çünkü traefik service nesnemiz80portuna gelen istekleri traefik pod'unun8000(web) portuna, yaniwebentrypoint'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
****
****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.onlineadresini CNAME kaydı ilekerteriz.onlineadresine yönlendirelim.Böylece son adımdaki Ingress'i oluşturduktan sonraweb.kerteriz.onlineadresi üzerindenstatic-webisimli pod'umuza Traefik web entrypoint'i üzerinden ulaşabileceğiz.

static-webisimlinginxç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-serviceisimli service'i oluşturalım ve trafiğinstatic-webisimli 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-ingressIngress nesnesi ile deweb.kerteriz.onlineadresiniweb-serviceisimli servisimize yönlendirelim.annotationsile 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!
