Kubernetes StatefulSet nedir ve ne zaman kullanılmalı?
StatefulSet, Kubernetes'te durum bilgisi (stateful) gerektiren uygulamalar için tasarlanmış bir çalışma yükü (workload) nesnesidir. Deployment'ların tersine StatefulSet, her Pod'a sabit bir ağ kimliği ve kalıcı depolama (PersistentVolume) sağlar. Veritabanları (PostgreSQL, MySQL), dağıtık dosya sistemleri ve sıralı başlatma gerektiren servislerde StatefulSet tercih edilmelidir.
Temel farklar: Deployment -> değişken kimlik, ephemeral; StatefulSet -> sabit isimlendirme, PVC temelli depolama, sıralı başlatma/durdurma. Bu farklar uygulamanızın veri bütünlüğü ve replikasyon stratejisi açısından kritiktir.
PVC, PV ve StorageClass: Dinamik Provisioning
Kubernetes'te kalıcı depolama için PersistentVolume (PV) ve PersistentVolumeClaim (PVC) kullanılır. Modern küme kurulumlarında StorageClass sayesinde dinamik provisioning mümkün olur. Özellikle dağıtık küme mimarilerinde volumeBindingMode: WaitForFirstConsumer seçeneği, hacimlerin doğru node üzerinde oluşturulmasını sağlayarak topology problemlerini önler.
Örnek StorageClass (kısa):
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs # örnek
volumeBindingMode: WaitForFirstConsumer
parameters:
type: gp3
StatefulSet örneği: PVC template ile basit YAML
Aşağıdaki örnek, her bir Pod için ayrı PVC oluşturan basit bir StatefulSet şablonudur. Bu model, her replikaya ait verinin izole kalmasını sağlar.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-db
spec:
serviceName: "my-db-svc"
replicas: 3
selector:
matchLabels:
app: my-db
template:
metadata:
labels:
app: my-db
spec:
containers:
- name: postgres
image: postgres:14
ports:
- containerPort: 5432
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: fast-ssd
resources:
requests:
storage: 10Gi
Uygulama ve doğrulama adımları
1) StorageClass ve StatefulSet YAML dosyalarınızı hazırlayın. 2) kubectl apply -f storageclass.yaml && kubectl apply -f statefulset.yaml komutlarıyla kaynakları oluşturun. 3) kubectl get pvc --selector=app=my-db ile PVC'lerin oluştuğunu kontrol edin. 4) Pod'ların sıralı şekilde ayağa kalktığını kubectl get pods -l app=my-db --watch ile takip edin.
Güncelleme ve ölçeklendirme stratejileri
StatefulSet'ler rolling update ve ordered update özelliklerine sahiptir. Büyük veri tabanlarında sürüm yükseltmeleri için replica set azaltılarak (kubectl scale --replicas=0) güvenli backup ve snapshot alındıktan sonra güncelleme yapılması önerilir. Ayrıca podManagementPolicy: Parallel ile paralel başlatma sağlanabilir, fakat veritabanı tutarlılığı açısından dikkatle kullanılmalıdır.
Yedekleme, snapshot ve felaket kurtarma
Kubernetes VolumeSnapshot CRD'leri ve CSI sürücüleri sayesinde PVC'lerin snapshot'ları alınabilir. Üretimde anlık yedekler, tutarlılık sağlamak için veritabanının snapshot öncesi flush/lock işlemlerini desteklemelidir. Ayrıca cluster-agnostic yedekleme için veriyi objeye dönüştürmeden (logical dump) kopyalama stratejileri (pg_dump, mysqldump) da değerlendirilmeli.
İyi Uygulamalar ve Performans İpuçları
- StorageClass seçiminde IOPS ve throughput ihtiyaçlarınızı ölçün. - AccessModes'u doğru belirleyin: ReadWriteOnce çoğu veritabanı için yeterlidir. - volumeBindingMode: WaitForFirstConsumer kullanın; özellikle multi-zone ortamlarda kritik. - StatefulSet replika sayısını planlarken quorum tabanlı uygulamalarda ağ gecikmesini göz önünde bulundurun. - Monitoring: PVC doluluk oranı, I/O latency ve throttling metriklerini Prometheus ile takip edin.
Sonuç
StatefulSet ve kalıcı depolama doğru yapılandırıldığında Kubernetes üzerinde durumsal uygulamaları güvenli ve ölçeklenebilir şekilde çalıştırmak mümkündür. Dinamik provisioning, doğru StorageClass parametreleri ve snapshot stratejileri ile veri bütünlüğünü korurken operasyonel yükü azaltabilirsiniz. Her zaman küçük bir test ortamında storage davranışlarını denemek ve performans testleri yapmak en güvenli yoldur.