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/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.
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
adresiniA
DNS kaydı iletraefik
isimli service'in load balancer IP adresine yönlendirelim.web.kerteriz.online
adresini CNAME kaydı ilekerteriz.online
adresine yönlendirelim.- Bir adet
nginx
çalıştıranstatic-web
isimli Pod'umuz olsun. web-service
isimli Kubernetes Service nesnesi ile destatic-web
isimli podumuza erişim sağlayalım.- Traefik tarafından kurulumda otomatik oluşturulan
traefik
isimli Ingress Class kullananweb-ingress
isimli Ingress nesnesi ile deweb.kerteriz.online
adresiniweb-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.
Öyleyse ilk olarak domain kayıtlarımızı yaparak başlayalım.
kerteriz.online
adresiniA
DNS kaydı ile traefik service'in load balancer IP adresine yönlendirelim. Çünkü traefik service nesnemiz80
portuna gelen istekleri traefik pod'unun8000
(web) portuna, yaniweb
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
****
****
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ı ilekerteriz.online
adresine yönlendirelim.Böylece son adımdaki Ingress'i oluşturduktan sonraweb.kerteriz.online
adresi üzerindenstatic-web
isimli pod'umuza Traefik web entrypoint'i üzerinden ulaşabileceğiz.
static-web
isimlinginx
ç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ğinstatic-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 deweb.kerteriz.online
adresiniweb-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!