Kubernetes Ağ Yönetimi Ve Servis Türleri

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.

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

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

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.

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

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

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.

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

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.

Yorum yapın