müfettiş
Moderatör
- Katılım
- 20 Ocak 2024
- Mesajlar
- 325
- Tepkime puanı
- 1
- Puanları
- 18
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).
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).