Middle
Hangi uygulama için Deployment yerine StatefulSet kullanılmalı ve neden?
sobes.tech yapay zeka
AI'dan gelen yanıt
StatefulSet, aşağıdaki durumlar için kullanılmalıdır:
- Stabil ağ tanımlaması gerektiren uygulamalar. Pod'lar,
<statefulset-ismi>-<pod-indeksi>formatında benzersiz ve kalıcı bir ana bilgisayar adı alır. - Stabil ve kalıcı depolama. Her Pod replikasına kendi PersistentVolume atanır. Pod yeniden başlatıldığında bile verileri ona bağlı kalır.
- Sıralı dağıtım ve ölçeklendirme. Pod'lar, kesinlikle tanımlanmış bir sırayla oluşturulur ve silinir (artışta oluşturma, azalmada silme).
- Sıralı veya paralel güncelleme. Hem kademeli (rolling update) hem de paralel (in-place veya parallel) güncellemeleri destekler, ancak sıralama kontrolü ile.
Bunlara örnek uygulamalar:
- Veritabanları (MySQL, PostgreSQL, MongoDB)
- Mesaj aracıları (Kafka, RabbitMQ)
- Önbellek sistemleri (Redis, Memcached)
- Dağıtık dosya sistemleri (örneğin, Ceph, Kubernetes'te çalıştırıldığında)
- Durum saklaması gereken ve kalıcı tanımlama isteyen herhangi bir uygulama.
Deployment'tan farklı olarak, Pod'lar birbirinin yerine geçebilir ve stateless iken, StatefulSet her replik için benzersizlik ve durum garantisi sağlar, bu da kalıcı depolama ve stabil ağ tanımlamasına bağlı uygulamalar için kritiktir.
Bir veritabanı için en basit StatefulSet örneği:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Pod'ların stabil ağ tanımlaması için gereklidir
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "password" # Üretimde Secrets kullanılmalı
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Kalıcı depolama yoludur
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # PVC şablonunun adı
spec:
accessModes: [ "ReadWriteOnce" ] # Erişim modu
resources:
requests:
storage: 10Gi # Talep edilen depolama alanı