Kubernetes StatefulSets Nedir? Veritabanlarını Konteynerda Çalıştırmak

müfettiş

Moderatör
Katılım
20 Ocak 2024
Mesajlar
325
Tepkime puanı
1
Puanları
18
images (9).png


Kubernetes StatefulSets Nedir? Veritabanlarını Konteynerda Çalıştırmak​

Giriş: "Unutkan" Podlardan "Hafızalı" Podlara​

Kubernetes'in (K8s) doğası "Stateless" (Durumsuz) uygulamalar için tasarlanmıştır. Bir Web sunucusu (Nginx) düşünün; 5 kopyası (Replica) vardır. Biri çökerse K8s yerine yenisini açar. Yeni açılan Pod'un isminin web-x9z2 olması veya IP adresinin değişmesi önemli değildir. Çünkü o Pod veri tutmaz, sadece trafiği karşılar.

Ancak iş Veritabanı (MySQL, Redis, Kafka, Cassandra) çalıştırmaya gelince senaryo değişir. Veritabanlarının "kimliğe" ve "hafızaya" ihtiyacı vardır.

  • Bir veritabanı Pod'u öldüğünde, yerine gelen yeni Pod'un aynı disk verisine ulaşması gerekir.
  • Cluster (Küme) içindeki diğer üyeler, onu rastgele bir isimle değil, sabit bir kimlikle tanımalıdır (Master/Slave ilişkisi için).
Standart Deployment objesi bunu yapamaz. İşte bu sorunu çözmek için StatefulSets icat edilmiştir.

StatefulSet vs. Deployment: Fark Nedir?​

Deployment objesinde Pod'lar "birbirinin yerine geçebilen" (Interchangeable) askerlerdir. StatefulSet'te ise her Pod'un "benzersiz bir karakteri" vardır.

1. Sabit Ağ Kimliği (Sticky Identity)​

Deployment, Podlara rastgele isimler verir (app-54321, app-98765).StatefulSet ise sıralı ve sabit isimler verir: mysql-0, mysql-1, mysql-2.Eğer mysql-0 çökerse, K8s onu yeniden başlattığında ismi yine mysql-0 olur. Bu, veritabanı replikasyonu için hayati önem taşır.

2. Sıralı Başlatma ve Kapatma (Ordered Deployment)​

Deployment'ta 3 Pod istediğinizde hepsi aynı anda (paralel) başlar.StatefulSet'te ise sıra vardır: Önce mysql-0 başlar ve hazır (Ready) olana kadar mysql-1 başlamaz. Bu, Master düğümün Slave düğümlerden önce ayağa kalkmasını garanti eder.

Kalıcı Depolama: Volume Claim Templates​

StatefulSet'in en büyük sihri depolama yönetimindedir.Deployment'ta bir PVC (Persistent Volume Claim) tanımlarsanız, tüm Podlar aynı diski paylaşır (ReadWriteMany). Bu çoğu veritabanı için veri bozulması demektir.

StatefulSet ise volumeClaimTemplates kullanır. Bu şablon sayesinde:
  • mysql-0 için otomatik olarak data-mysql-0 diski oluşturulur.
  • mysql-1 için data-mysql-1 diski oluşturulur.Eğer mysql-0 Pod'u silinip başka bir Node'da yeniden başlarsa, K8s otomatik olarak data-mysql-0 diskini o Node'a bağlar (Attach). Veri asla kaybolmaz ve Pod kimliğini kaybetmez.

Headless Service ve DNS​

StatefulSet'ler genellikle bir Headless Service (ClusterIP: None) ile birlikte çalışır. Bu özel servis türü, bir IP adresi (Load Balancer) sağlamak yerine, Podların DNS isimlerini doğrudan döndürür.Böylece uygulamanız mysql-0.service.default.svc.cluster.local adresine giderek doğrudan Master veritabanına yazabilir.

Ne Zaman Kullanmalıyız?​

  • Gerekli: MySQL (Master/Slave), PostgreSQL, Kafka, Zookeeper, Elasticsearch, Cassandra gibi dağıtık ve durumlu sistemler.
  • Gereksiz: Nginx, Apache, Node.js API'leri gibi durumsuz (Stateless) uygulamalar. (Bunlar için Deployment daha hızlı ve esnektir).

Sonuç​

K8s üzerinde veritabanı çalıştırmak ("Stateful Workloads") zordur ve dikkatli yönetim gerektirir. StatefulSet, bu zorluğu yönetilebilir hale getirir. Ancak unutmayın; veritabanını K8s içinde yönetmek (yedekleme, upgrade, failover) ciddi bir operasyonel yük getirir. Amazon RDS veya Google Cloud SQL gibi yönetilen servisler hala daha konforlu bir seçenektir.
 
Geri
Üst