Kubernetes StatefulSet Nedir?

Kubernetes StatefulSet, dağıtımı yapılan uygulamaların durumlarını (state) korumak için Pod'lara benzersiz ve kalıcı id ve hostname sunan Kubernetes nesnesidir. Özellikle, veritabanları, mesaj kuyrukları, özel uygulama stateleri gibi stateful (durumsal) uygulamaların dağıtımını desteklemek amacıyla tasarlanmıştır.

StatefulSet nesnesini anlamak için ReplicaSet nesnesi ile kıyaslama yapabiliriz. Bir ReplicaSet pod'ları oluştururken onlara rastgele isimler verir. Fakat StatefulSet, pod'ları sıralı bir şekilde ve düzenli sayılardan oluşan isimlerden oluşturur.

StatefulSet, her bir pod için benzersiz bir isim ve ağ kimliği (FQDN) atayarak podların durumunu korur ve yönetir. Bu özellik, her bir podun kendi benzersiz durumunu sürdürmesini ve verilerin tutarlılığını sağlamasını mümkün kılar. Veritabanları gibi durumsal uygulamaların verilerini tutması gereken durumlar için bu büyük bir avantajdır.

Bir ReplicaSet, kapanan bir pod yerine yine rastgele bir isimle pod oluştururken, Statefulset kapanan pod'un aynı ismiyle yeni bir pod oluşturur.

StatefulSet, pod'ların sırasını ve kimliğini koruyarak dağıtım, ölçeklendirme ve güncelleme süreçlerini yönetir. Pod'ları tek tek yönetebilir ve belirli bir sıra veya zamanlama dikkate alınarak işlem yapabilir. Bu, uygulamanın veri durumunu korurken operasyonel süreçleri kontrol etmeyi sağlar.

Scale down işleminde ise, önce en yüksek numaralı id'ye sahip pod ilk sonlandırılır.

StatefulSet, volume claim template ile oluşturulan her pod için PersistentVolumeClaim oluşturur.

Bu sayede eğer bir pod scale down veya başka bir sebeple sonlansa dahi PersistentVolumeClaim'i silinmez. Aynı isimle yeni oluşturulan pod bu PVC'i kullanmaya devam eder.

1. StatefulSet Nasıl Oluşturulur?

Bir StatefulSet oluşturmak için aşağıdaki manifest örneğini inceleyebilirsiniz. ReplicaSet'den farklı olarak volumeClaimTemplates parametresinin yeni geldiğine dikkat ediniz.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: my-service
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: data-volume
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data-volume
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: my-storage-class
        resources:
          requests:
            storage: 1Gi

Bu YAML örneği, my-statefulset adında bir StatefulSet oluşturur. StatefulSet'in replica sayısı 3 olarak belirlenmiştir. Pod'ları seçmek için app: my-app etiketi kullanılır. Pod şablonunda my-container adında bir konteyner tanımlanır ve 8080 portunu dinler. Ayrıca, data-volume adında bir volumeClaimTemplates tanımlanır. Bu, her pod için bir veri birimi oluşturur ve her biri 1Gi boyutunda olacak şekilde depolama talep eder.

Manifest dosyası hazır olduktan sonra kubectl create veya kubectl apply komutlarından birisi ile Deployment'ı oluşturabilirsiniz.

 kubectl create -f file-deployment.yaml --record

StatefulSet, özellikle veritabanları, mesaj kuyrukları, özel uygulama durumları gibi durumsal uygulamaların dağıtımı ve yönetimi için tercih edilmelidir. ReplicationController veya ReplicaSet gibi diğer kaynak denetleyicileriyle karşılaştırıldığında, StatefulSet pod'ların durumunu koruma, benzersiz isimlendirme ve ağ kimlikleri sağlama, sıra ve kimlik koruması gibi durumsal uygulamaların özel gereksinimlerini daha iyi karşılar.


Sıradaki yazı ile eğitim serisine devam edebilirsiniz.

Kubernetes Cluster’a Kullanıcı Eklemek ve Sertifika Oluşturmak
Kubernetes Cluster’a kullanıcı eklemek ve sertifika oluşturmak, Kubernetes kümelerinize erişimi kontrol etmek için önemli bir adımdır.