Middle
Dla jakiej aplikacji należy używać StatefulSet zamiast Deployment i dlaczego?
sobes.tech AI
Odpowiedź od AI
StatefulSet powinien być używany dla aplikacji, które wymagają:
- Stabilnej identyfikacji sieciowej. Pod'y otrzymują unikalną, stałą nazwę hosta w formacie
<nazwa-statefulset>-<indeks-poda>. - Stabilnego, trwałego magazynu. Każdej replikacji Pod'a przypisuje się własny PersistentVolume. Nawet po ponownym uruchomieniu Pod'a, jego dane pozostają z nim powiązane.
- Uporządkowanego wdrażania i skalowania. Pod'y są tworzone i usuwane w ściśle określonej kolejności (rosnąco dla tworzenia, malejąco dla usuwania).
- Uporządkowanej lub równoległej aktualizacji. Obsługuje zarówno stopniową (rolling update), jak i równoległą (in-place lub parallel) aktualizację, z możliwością kontroli kolejności.
Przykłady takich aplikacji:
- Bazy danych (MySQL, PostgreSQL, MongoDB)
- Brokerzy wiadomości (Kafka, RabbitMQ)
- Systemy cache (Redis, Memcached)
- Rozproszone systemy plików (np. Ceph, jeśli uruchamiany w Kubernetes)
- Dowolna aplikacja, która wymaga przechowywania stanu między restartami i stałej identyfikacji.
W odróżnieniu od Deployment, gdzie Pod'y są wymienialne i bezstanowe, StatefulSet gwarantuje unikalność i zachowanie stanu dla każdej repliki, co jest krytyczne dla aplikacji zależnych od trwałej pamięci i stabilnej identyfikacji sieciowej.
Przykład najprostszy StatefulSet dla bazy danych:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Niezbędne dla stabilnej identyfikacji sieciowej Pod'ów
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" # W produkcji używać Secrets
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Ścieżka, gdzie montowane jest trwałe przechowywanie
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # Nazwa szablonu PVC
spec:
accessModes: [ "ReadWriteOnce" ] # Tryb dostępu
resources:
requests:
storage: 10Gi # Żądany rozmiar przechowywania