Kubernetes Ağ Yönetiminde ClusterIP NodePort ve LoadBalancer

Kubernetes‘deki Pod birimlerinin geçici doğası ağ yönetimini karmaşık hale getirir. Her yeniden başlatma işleminde değişen IP adresleri doğrudan bağlantı kurmayı imkansız kıldığı için Service nesnesi devreye girer. Bu yapı Pod grubunun önünde sabit bir sanal IP ve DNS tanımlayarak kararlı bir soyutlama katmanı inşa eder. Bu incelemede standart bir Pod kurulumunun ardından ClusterIP, NodePort ve LoadBalancer türlerini yapılandıracağız. Ayrıca Endpoints çalışma prensibiyle birlikte kube proxy bileşeninin iptables ve IPVS modları üzerindeki trafik yönlendirme yeteneklerini analiz edeceğiz.

İş Yükü Hazırlığı ve Pod Dağıtımı

Sistem üzerindeki ağ trafiğini ve servis yönlendirmelerini analiz etmek için öncelikle standart bir iş yükü oluşturmamız gerekiyor. Bu senaryoda kararlı yapısıyla bilinen Apache yani httpd imajını tercih ediyoruz. Aşağıdaki yapılandırma dosyası temel bir Pod tanımı yaparken aynı zamanda bu birimi servislerin hedef alabilmesi için özel bir etiketle işaretliyor.

YAML
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 wide

Kubernetes servisleri pod seçimini tamamen etiketler üzerinden gerçekleştirir. Yeniden başlatılan her birim yeni bir kimlik kazansa bile servis bu birimi etiketi sayesinde anında tanır. Bu mekanizma değişken IP adreslerini kullanıcıdan gizleyerek sistemin kararlı çalışmasına olanak tanır.

Dahili Ağ Yönetimi ve ClusterIP

Kubernetes ağının standart servis tipi olan ClusterIP yalnızca küme içi erişimler için tasarlanmıştır. Bu yapı dış dünyaya tamamen kapalı kalarak güvenliği en üst seviyeye çıkarır. Genellikle veritabanı veya iç servis katmanları gibi doğrudan internete açılmaması gereken kritik bileşenler için kullanılır.

Dahili Servis Kurulumu

Aşağıdaki tanım, 80 portu üzerinden gelen talepleri, hedef podun 80 portuna yönlendiren bir iç ağ servisidir.

YAML
apiVersion: v1
kind: Service
metadata:
  name: ic-servis
spec:
  type: ClusterIP
  selector:
    app: web-sunucu
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

Selector (Seçici): Servisin, hangi podlara trafik göndereceğini belirlemek için kullandığı etiket mekanizmasıdır.

Uygulama

kubectl apply -f clusterip.yaml

Cluster içinden test etmek için

kubectl run test --image=busybox -it --rm -- wget -qO- http://ic-servis

Service IP sabit kalır, Pod değişse bile trafik kesilmez.

  • port → Servisin cluster içindeki portu
  • targetPort → Pod içindeki uygulamanın portu

NodePort ile Harici Erişim Sağlama

Kubernetes üzerindeki bir uygulamayı dış dünyaya açmanın en temel yollarından biri NodePort servisidir. Bu yöntem her bir sunucu düğümü üzerinde belirli bir portu rezerve ederek trafiği içeriye aktarır. Genellikle test süreçlerinde veya bulut sağlayıcısı olmayan fiziksel sunucu ortamlarında tercih edilen bir çözümdür.

Dış Trafik İçin Erişim Noktası Belirleme

Kubernetes üzerinde koşan bir servise küme dışındaki bir bilgisayardan ulaşmak için NodePort servisinden yararlanılır. Sistem her bir fiziksel veya sanal makinenin IP adresini bir giriş kapısı olarak kullanır ve bu adrese bir port numarası ekler. Bu sayede dışarıdaki cihazlar uygulamayı sanki yerel bir sunucuymuş gibi kolayca görebilir.

YAML
apiVersion: v1
kind: Service
metadata:
  name: dis-erisim-servisi
spec:
  type: NodePort
  selector:
    app: web-sunucu
  ports:
    - port: 80
      targetPort: 80
      nodePort: 32000

Düğüm (Node): Üzerinde podların çalıştığı, fiziksel veya sanal bir sunucu makinesidir.

Uygulama

kubectl apply -f nodeport.yaml

Hizmetin ayrıntılarını görüntülemek için

kubectl describe service dis-erisim-servisi

Erişim formatı

http://NodeIP:32000

NodePort 30000–32767 arası bir port aralığı kullanır. Production’da doğrudan tercih edilmez çünkü her Node dış dünyaya açılmış olur.

Bulut Entegrasyonlu Yük Dengeleme Sistemi

LoadBalancer servis türü modern bulut sağlayıcıların sunduğu imkanları kullanarak ağ trafiğini yönetir. Sisteme dahil edildiği andan itibaren bulut altyapısı üzerinden bir dış IP adresi atayarak trafiği dengeler. Bu yöntem özellikle yüksek erişilebilirlik gerektiren kurumsal uygulamalar için standart bir yapı sunar.

Yük Dengeleyici Servisini Kurma

YAML
apiVersion: v1
kind: Service
metadata:
  name: ana-giris-servisi
spec:
  type: LoadBalancer
  selector:
    app: web-sunucu
  ports:
    - port: 80
      targetPort: 80

Kontrol et:

YAML
kubectl get service ana-giris-servisi

EXTERNAL-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.

Dinamik Yapılarda Bağlantı Sürekliliği

Service yapısının temel avantajı pod seviyesindeki değişiklikleri kullanıcıya yansıtmamasıdır. Örnek olarak kullandığımız httpd birimini silip yeni bir tane oluşturduğumuzda servis katmanının kesintisiz çalıştığı gözlemlenir. Bu mekanizma modern sistemlerdeki yüksek erişilebilirlik ihtiyacını karşılayan en önemli unsurdur.

kubectl delete pod httpd-pod

Yeni 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-servis

Kaynakların Temizlenmesi

kubectl delete pod httpd-pod
kubectl delete service ic-servis dis-erisim-servisi ana-giris-servisi

Endpoint: Bir servisin trafiği yönlendirdiği podların o anki gerçek IP adreslerinin tutulduğu dinamik listedir.

Kube Proxy ile Trafik Yönlendirme Modları

Servis yapısı fiziksel bir donanım değil API sunucusu üzerinde tutulan dijital bir kayıttır. Asıl trafik yönlendirme görevini her düğümde aktif olarak çalışan kube proxy bileşeni üstlenir. Bu bileşen servis adreslerine gelen istekleri takip eder ve işletim sistemi düzeyinde gerekli ağ kurallarını oluşturur. Standart olarak sunulan iptables modu kuralları bir liste halinde işlerken gelişmiş bir seçenek olan IPVS modu hash tablosu yapısını kullanarak çok daha yüksek performans sunar.

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.

Yorum yapın