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.