Kubernetes üzerinde çalışan Podlar doğası gereği kalıcı değildir ve her yeni kurulumda farklı IP adresleri alırlar. Bu durum sürdürülebilir bir erişim için engel teşkil ederken Service nesnesi sabit bir IP adresi ve DNS ismi sağlayarak sorunu kökten çözer. Rehberimiz kapsamında şu adımları izleyeceğiz
- Temel bir Pod kurulumu gerçekleştirmek
- ClusterIP, NodePort ve LoadBalancer servis yapılarını kurmak
- Servis türleri arasındaki farkları uygulama üzerinden görmek
- Endpoints mantığını ve kube proxy modlarının teknik detaylarını incelemek
Pod Kurulumu ve Kaynak Tanımlama Süreci
Deney sürecine başlamadan önce aşağıdaki adımları izleyerek hedef sistemimizi hazır hale getiriyoruz
YAML dosyası üzerinden kaynağı küme içinde aktif etmek Bu işlemler sonucunda servislerin trafiği yönlendirebileceği kararlı bir uygulama birimi elde etmiş oluyoruz.
- Apache temel imajını kullanan bir Pod tanımlamak
- Servislerin erişimini sağlamak için gerekli etiketleri eklemek
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 wideSistemdeki etiketleme mantığı servislerin doğru hedeflere yönlenmesini sağlar. Herhangi bir pod yenilendiğinde ortaya çıkan adres farklılıkları servis katmanı tarafından otomatik olarak yönetilir. Bu sayede altyapıdaki hareketlilik erişim kalitesini etkilemez ve bağlantılar her zaman güncel kalır.
ClusterIP ile Küme İçi Güvenli Bağlantı
Varsayılan servis türü olan ClusterIP sayesinde uygulamalarınız küme dışına çıkmadan birbirleriyle haberleşebilir. Bu yöntem özellikle dış erişime ihtiyaç duymayan arka plan servisleri için idealdir. Veritabanı katmanlarını korumak ve izole etmek amacıyla en sık tercih edilen ağ çözümüdür.

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
Dış Dünyadan Uygulamaya Erişim Portları
NodePort servisi sayesinde küme dışındaki kullanıcılar uygulamaya doğrudan bir port üzerinden ulaşabilir. Kubernetes her düğümde özel bir geçit oluşturarak gelen trafiği ilgili podlara iletir. Bu yapı özellikle demo gösterimleri ve yerel geliştirme ortamları için hızlı ve etkili bir dışa açılma yöntemi sunar.

NodePort ile Harici Makine Erişimi
NodePort kullanarak hazırlanan yapılandırmalar küme dışı trafiğin içeriye akmasını sağlar. Atanan port numarası ve sunucunun dış IP adresi kullanılarak oluşturulan bağlantı dizesi uygulamayı erişilebilir kılar. Bu basit ama etkili yöntem özellikle dış sistemlerin küme kaynaklarına hızla ulaşması gereken senaryolarda tercih edilir.
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
Üretim ortamlarındaki yoğun trafiği karşılamak için geliştirilen LoadBalancer servisi internete açık projelerin temel taşıdır. Bulut sağlayıcıların ağ katmanıyla entegre bir şekilde çalışarak uygulamanın dış dünyaya açılmasını sağlar. Atanan statik IP adresi üzerinden tüm dünyadan gelen talepleri içeriye profesyonelce dağıtır.

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.
Süreklilik Analizi ve Otomatik Yenileme
Kubernetes servisleri podların yaşam döngüsünden bağımsız bir şekilde görev yapar. Test amacıyla kullanılan bir podu sildiğinizde sistem anında yenisini oluşturur ve servis bu yeni üyeyi hemen tanır. Bu özellik sayesinde altyapıda ne kadar hareketlilik olursa olsun dışarıdan gelen istekler her zaman doğru hedefe ulaşır.
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.
İşletim Sistemi Seviyesinde Trafik Yönetimi
Servisler aslında mantıksal birer tanımdan ibarettir ve trafiği yöneten asıl güç kube proxy servisidir. Her düğümde kurulu olan bu araç gelen paketlerin doğru podlara ulaşması için işletim sistemine kurallar ekler. Varsayılan iptables modu her kuralı sırayla taradığı için devasa sistemlerde gecikme yaratabilir. Buna karşılık IPVS modu kuralları optimize edilmiş tablolar üzerinde tutarak yüksek trafikli ortamlarda hız ve kararlılık sağlar.
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.