Middle
Pre ktorého použitia by sa mal použiť StatefulSet namiesto Deployment a prečo?
sobes.tech AI
Odpoveď od AI
StatefulSet je potrebné použiť pre aplikácie, ktorým sú potrebné:
- Stabilná sieťová identifikácia. Pod-y získavajú jedinečný, trvalý hostname vo formáte
<statefulset-name>-<pod-index>. - Stabilné, trvalé úložisko. Každá replika Pod-u má pridelený vlastný PersistentVolume. Aj pri reštarte Pod-u zostávajú jeho údaje priradené k nemu.
- Usporiadané nasadenie a škálovanie. Pod-y sa vytvárajú a odstraňujú v prísne stanovenom poradí (podľa vzostupného indexu pri vytváraní, podľa zostupného pri odstraňovaní).
- Usporiadané alebo paralelné aktualizácie. Podporované sú ako postupné (rolling update), tak aj paralelné (in-place alebo parallel) aktualizácie, ale s možnosťou kontroly poradia.
Príklady takýchto aplikácií:
- Databázy (MySQL, PostgreSQL, MongoDB)
- Messagingové brokeri (Kafka, RabbitMQ)
- Cache systémy (Redis, Memcached)
- Distribuované súborové systémy (napríklad Ceph, ak bežia v Kubernetes)
- Akákoľvek aplikácia, ktorej je potrebné uchovávať stav medzi reštartmi a mať trvalú identifikáciu.
Na rozdiel od Deployment, kde sú Pod-y vzájomne zamenné a stateless, StatefulSet zaručuje jedinečnosť a zachovanie stavu pre každú repliku, čo je kritické pre aplikácie závislé od trvalého ukladania dát a stabilnej sieťovej identifikácie.
Príklad najjednoduchšieho StatefulSet pre databázu:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Je potrebné pre stabilnú sieťovú identifikáciu Pod-ov
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" # V produkcii použiť Secrets
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Cesta, kam sa montuje trvalé úložisko
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # Názov šablóny PVC
spec:
accessModes: [ "ReadWriteOnce" ] # Režim prístupu
resources:
requests:
storage: 10Gi # Požadované množstvo úložiska