
Kubernetes Service Türleri: ClusterIP, NodePort, LoadBalancer
2026-07-07 · 10 dk okuma
Kubernetes'te Pod'lar geçicidir — ölür, yeniden doğar, IP'leri değişir. Service, bir grup Pod'un önüne kararlı bir erişim noktası koyar. Ama "nereden" erişileceği Service türüne göre değişir. Üç ana tür var.
ClusterIP (varsayılan)
Yalnızca cluster içinden erişilebilen bir sanal IP verir. Dış dünyaya kapalıdır. Mikroservislerin birbiriyle konuşması için idealdir — örneğin API'nin veritabanına erişmesi.
NodePort
Her node'un belirli bir portunu (30000-32767 arası) uygulamana açar. <node-ip>:<port> ile dışarıdan erişebilirsin. Basit ama üretim için kaba — genelde geliştirme/test veya bir load balancer'ın arkasında kullanılır.
LoadBalancer
Bulut sağlayıcısından (AWS, GCP, Azure) gerçek bir dış yük dengeleyici oluşturur ve tek bir genel IP verir. Üretimde dış trafiği karşılamanın standart yoludur.
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 8080Hangisini ne zaman?
- ClusterIP: iç servis-servis iletişimi (varsayılan)
- NodePort: hızlı test veya özel ağ kurulumları
- LoadBalancer: üretimde tek servisi internete açmak
- Çok sayıda HTTP servisi için: Ingress + ClusterIP (tek LB, çok yol)
Vaka: 'Servise erişemiyorum' — teşhis
Service oluşturdun ama curl cevap vermiyor. %90 sebep: Service'in selector'ı hiçbir Pod'a uymuyor (yani Endpoints boş). Teşhis akışı:
- 1kubectl get endpoints <svc> → boşsa selector eşleşmiyor demektir
- 2kubectl get pods --show-labels → Pod etiketleri Service selector'ıyla aynı mı?
- 3targetPort, konteynerin gerçekten dinlediği portla eşleşiyor mu?
- 4Cluster içinden test et (dış türü değiştirmeden önce)
$ kubectl get svc webNAME TYPE CLUSTER-IP PORT(S) AGEweb ClusterIP 10.96.0.20 80/TCP 3m$ kubectl get endpoints webNAME ENDPOINTS AGEweb <none> 3m # ⚠ boş! Selector hiçbir Pod'a uymuyor.$ kubectl get pods --show-labelsweb-xyz 1/1 Running app=web-api # Pod etiketi 'app=web-api'# Service selector'ı 'app=web' → uyuşmuyor. Selector'ı düzelt:$ kubectl get endpoints webNAME ENDPOINTS AGEweb 10.244.0.7:8080,10.244.0.8:8080 1m # ✓ artık dolu$ kubectl run tmp --rm -it --image=busybox -- wget -qO- web:80<h1>OK</h1> # ✓ cluster içinden erişim çalışıyor
Not
Altın kural: erişim sorununda ÖNCE 'kubectl get endpoints'e bak. Boşsa sorun Service türünde (NodePort/LB) değil, selector/etiket eşleşmesindedir. Türü değiştirmek bunu çözmez.
Mini görev
Bir Deployment (app=web) + ClusterIP Service oluştur ama Service selector'ını kasıtlı yanlış yaz (app=api). Endpoints'in boş olduğunu gör, busybox Pod'undan erişimin başarısız olduğunu doğrula, selector'ı düzelt ve erişimi geri getir.
Uygulamalı görev — tarayıcıda dene
Bu türleri gerçek bir cluster üzerinde deneyip trafiği izlemek kavramı kalıcı kılar — Cloudpuz'un Kubernetes lab'ları tam bunu sunuyor.
Resmi kaynaklar
Son doğrulama: 2026-07-17
Sıkça Sorulan Sorular
Kubernetes'te Service nedir?
Kubernetes'te Pod'lar geçicidir; ölür, yeniden doğar ve IP'leri değişir. Service, bir grup Pod'un önüne kararlı bir erişim noktası koyar. Ancak uygulamaya nereden erişilebileceği seçilen Service türüne göre değişir.
ClusterIP, NodePort ve LoadBalancer arasındaki fark nedir?
ClusterIP yalnızca cluster içinden erişilebilen sanal bir IP verir ve dış dünyaya kapalıdır. NodePort her node'un 30000-32767 aralığında bir portunu açar ve `<node-ip>:<port>` ile dışarıdan erişim sağlar. LoadBalancer ise bulut sağlayıcısından gerçek bir dış yük dengeleyici oluşturup tek bir genel IP verir.
Hangi Kubernetes Service türü ne zaman kullanılır?
ClusterIP iç servis-servis iletişimi için kullanılır ve varsayılandır. NodePort hızlı test veya özel ağ kurulumları için uygundur. LoadBalancer üretimde tek bir servisi internete açmak için standart yoldur; çok sayıda HTTP servisi için ise Ingress + ClusterIP (tek LB, çok yol) tercih edilir.
Kubernetes'te servise erişemiyorum, nasıl teşhis ederim?
Vakaların yaklaşık %90'ında sebep, Service'in selector'ının hiçbir Pod'a uymaması, yani Endpoints'in boş olmasıdır. Önce `kubectl get endpoints <svc>` çalıştır; boşsa selector eşleşmiyordur. Ardından `kubectl get pods --show-labels` ile Pod etiketlerinin Service selector'ıyla aynı olup olmadığını ve targetPort'un konteynerin dinlediği portla eşleşip eşleşmediğini kontrol et.
Kubernetes'te Service türünü değiştirmek erişim sorununu çözer mi?
Hayır. Erişim sorununda önce `kubectl get endpoints`'e bakılmalıdır; Endpoints boşsa sorun Service türünde (NodePort/LoadBalancer) değil, selector/etiket eşleşmesindedir. Türü değiştirmek bu durumu çözmez.
Okumak yetmez — dene.
Bu konuları tarayıcıda gerçek terminalde uygula.