Bir Kubernetes kümesinde podların sürekli IP değiştirmesi sürdürülebilir bir uygulama mimarisinin önündeki en büyük engeldir. Service bileşeni bu değişken pod kümelerinin önüne geçilmez bir sanal IP ve DNS katmanı koyarak sistemin dış dünya ile iletişimini standardize eder. Bu dökümanda pratik bir uygulama üzerinden önce Pod ayağa kaldıracak ardından ClusterIP, NodePort ve Kubernetes servislerini devreye alacağız. Trafik yönetiminin mutfağında yer alan Endpoints yapısını inceleyerek kube proxy servisinin iptables ve IPVS kullanarak trafiği nasıl yönlendirdiğini adım adım göreceğiz.
Test Ortamının Kurulması ve Apache Entegrasyonu
Ağ katmanındaki trafiği simüle edebilmek adına küme içerisinde bir hedef nokta oluşturuyoruz. Apache imajı kullanarak hazırladığımız bu Pod yapısı servislerin yönlendirme yapabileceği bir son nokta görevi görecek. Dosya içeriğindeki app web-sunucu ifadesi servislerin hangi kaynağa trafik göndereceğini anlamasını sağlayan kritik bir parametredir.
apiVersion: v1
kind: Pod
metadata:
name: httpd-pod
labels:
app: web-sunucu
spec:
containers:
- name: apache-container
image: httpd:latest
ports:
- containerPort: 80*Soyutlama Katmanı (Abstraction Layer): Ppodların sürekli değişen IP’lerini gizleyerek, kullanıcıya basit ve değişmez bir arayüz sunan yapıdır.
Uygulama
kubectl apply -f pod.yaml
kubectl get pods -o wideKubernetes ağında labels yani etiket alanı hayati bir rol oynar. Servisler hedef alacağı grupları bu etiketler sayesinde tespit eder. Bir uygulama silinip tekrar açıldığında yeni bir IP adresi alsa dahi servis yapısı bu değişikliği arka planda çözer. Böylece dışarıdan gelen kullanıcı hiçbir teknik değişim hissetmeden bağlantısına devam eder.
Veritabanı Güvenliği İçin ClusterIP Kullanımı
Dış dünyaya kapalı bir iletişim kanalı kurmak istiyorsanız ClusterIP yapısını tercih etmelisiniz. Kubernetes içerisinde varsayılan olarak sunulan bu servis sadece dahili ağ üzerinden trafik kabul eder. Bu özellik sayesinde hassas verilerin bulunduğu servisleri internet korsanlarından ve dış tehditlerden tamamen izole edebilirsiniz.

Dahili Servis Kurulumu
Aşağıdaki tanım, 80 portu üzerinden gelen talepleri, hedef podun 80 portuna yönlendiren bir iç ağ servisidir.
apiVersion: v1
kind: Service
metadata:
name: ic-servis
spec:
type: ClusterIP
selector:
app: web-sunucu
ports:
- protocol: TCP
port: 80
targetPort: 80Selector (Seçici): Servisin, hangi podlara trafik göndereceğini belirlemek için kullandığı etiket mekanizmasıdır.
Uygulama
kubectl apply -f clusterip.yamlCluster içinden test etmek için
kubectl run test --image=busybox -it --rm -- wget -qO- http://ic-servisService IP sabit kalır, Pod değişse bile trafik kesilmez.
port→ Servisin cluster içindeki portutargetPort→ Pod içindeki uygulamanın portu
Sunucu Portu Üzerinden Trafik Yönlendirme
Uygulamanızı belirli bir port aralığı kullanarak dışarıya sunmak isterseniz NodePort yapısını kullanabilirsiniz. Bu servis türü sunucu makinelerin dış IP adreslerini kullanarak trafiği küme içerisine taşır. Karmaşık yapılandırmalar gerektirmediği için özellikle başlangıç aşamasındaki test projelerinde büyük kolaylık sağlar.

Harici Bağlantıların Yapılandırılması
NodePort yapısı sayesinde küme sınırları dışındaki herhangi bir istemcinin uygulamaya ulaşması mümkün hale gelir. Bu modelde sunucu makinesinin IP adresi ile sistem tarafından atanan özel port numarası birleşerek dış erişim yolunu oluşturur. Böylece yerel ağdaki veya internetteki bir kullanıcı doğrudan bu adres üzerinden sisteme giriş yapabilir.
apiVersion: v1
kind: Service
metadata:
name: dis-erisim-servisi
spec:
type: NodePort
selector:
app: web-sunucu
ports:
- port: 80
targetPort: 80
nodePort: 32000Düğüm (Node): Üzerinde podların çalıştığı, fiziksel veya sanal bir sunucu makinesidir.
Uygulama
kubectl apply -f nodeport.yamlHizmetin ayrıntılarını görüntülemek için
kubectl describe service dis-erisim-servisiErişim formatı
http://NodeIP:32000NodePort 30000–32767 arası bir port aralığı kullanır. Production’da doğrudan tercih edilmez çünkü her Node dış dünyaya açılmış olur.
LoadBalancer ile Kesintisiz Dış Erişim
Uygulamanızı son kullanıcılarla buluşturmak için LoadBalancer servis tipinden yararlanabilirsiniz. Bulut servis sağlayıcıları ile entegre olan bu model her proje için benzersiz bir dış IP adresi tahsis eder. Yük dengeleme özellikleri sayesinde gelen trafiği düğümler arasında eşit şekilde dağıtarak performans kaybını önler.

Yük Dengeleyici Servisini Kurma
apiVersion: v1
kind: Service
metadata:
name: ana-giris-servisi
spec:
type: LoadBalancer
selector:
app: web-sunucu
ports:
- port: 80
targetPort: 80Kontrol et:
kubectl get service ana-giris-servisiEXTERNAL-IP alanı dolduğunda uygulama internete açılmıştır.
LoadBalancer (Yük Dengeleyici): Gelen yoğun trafiği karşılayıp, arka plandaki sunuculara (node’lara) eşit ve sağlıklı bir şekilde dağıtan cihaz veya yazılımdır.
Kesintisiz Bağlantı ve Servis Kararlılığı
Kubernetes servislerinin en çarpıcı yeteneği altyapıdaki değişimlere karşı sunduğu dirençtir. Mevcut bir pod birimini sistemden tamamen silseniz ve yerine yenisi gelse dahi servis yapısı bu durumdan etkilenmez. Uygulama birimini yeniden oluşturduğunuzda servis katmanı aradaki bağı otomatik olarak korumaya devam eder.
kubectl delete pod httpd-podYeni Pod oluşur. Service otomatik olarak yeni IP’yi Endpoints listesine ekler. Kullanıcı bağlantısı kesilmez.
Endpoints’i kontrol edelim.
kubectl get endpoints ic-servisKaynakların Temizlenmesi
kubectl delete pod httpd-pod
kubectl delete service ic-servis dis-erisim-servisi ana-giris-servisiEndpoint: Bir servisin trafiği yönlendirdiği podların o anki gerçek IP adreslerinin tutulduğu dinamik listedir.
Iptables ve IPVS Arasındaki Performans Farkları
Kubernetes kümesinde ağ trafiğini yöneten kube proxy iki farklı çalışma modu sunar. Yaygın olarak kullanılan iptables modu Linux çekirdeğinin klasik kural dizilerini kullanarak yönlendirme yapar. Ancak binlerce servisin bulunduğu büyük ölçekli projelerde bu liste uzadıkça performans kayıpları görülebilir. IPVS teknolojisi ise kuralları bir hash tablosunda saklayarak servis sayısından bağımsız bir şekilde paketleri milisaniyeler içinde hedefe ulaştırır.
Sık Sorulan Sorular
Trafik Pod’lara hangi mantıkla dağıtılır?
Varsayılan olarak kube-proxy, trafiği Pod’lara rastgele dağıtır. Eğer aynı kullanıcının hep aynı Pod’a gitmesini isterseniz, servis tanımına sessionAffinity: ClientIP eklemeniz gerekir.
Servis IP’si var ama trafik gitmiyor, neden?
En büyük şüpheli Selector uyuşmazlığıdır. Servisdeki etiket ile Pod’daki etiket birebir aynı değilse bağ kurulamaz. Ayrıca Pod hazır durumunda değilse, servis trafiği o Pod’a yönlendirmez.
NodePort yerine neden LoadBalancer tercih edilmeli?
NodePort 30000+ gibi portlar kullanır ve güvenliği zayıflatır. LoadBalancer ise profesyoneldir. Size standart bir IP (80/443 portu gibi) verir ve bulut altyapısıyla tam uyumlu çalışarak trafiği dengeler.
IPVS modu iptables’dan neden daha hızlıdır?
iptables, kuralları uzun bir liste olarak tutar. Servis arttıkça bu listeyi taramak sistemi yorar. IPVS ise kuralları bir Hash Tablosu içinde saklar. Bu sayede 10 servis ile 10.000 servis arasında yönlendirme hızı açısından hiçbir fark oluşmaz.