Kalıcı Depolama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Kalıcı Depolama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

20 Ağustos 2025 Çarşamba

Kubernetes StatefulSet ve Kalıcı Depolama: Gerçek Dünya Rehberi ve İyi Uygulamalar

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.