Kubernetes Podları Servisler Aracılığıyla Nasıl Açılır?

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

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

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

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.

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.

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

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.

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

İş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.

Yorum yapın