Middle
Pro jakou aplikaci je vhodné použít StatefulSet místo Deployment a proč?
sobes.tech AI
Odpověď od AI
StatefulSet by měl být použit pro aplikace, které vyžadují:
- Stabilní síťovou identifikaci. Podům je přiřazen jedinečný, trvalý hostname ve formátu
<název-statefulsetu>-<index-podu>. - Stabilní, trvalé úložiště. Každé replikě Podu je přiřazen vlastní PersistentVolume. I po restartu Podu zůstávají data s ním spojena.
- Uspořádané nasazení a škálování. Pody jsou vytvářeny a odstraňovány v přesně definovaném pořadí (vzestupně pro tvorbu, sestupně pro odstraňování).
- Uspořádaná nebo paralelní aktualizace. Podporuje jak postupné (rolling update), tak paralelní (in-place nebo parallel) aktualizace, s kontrolou pořadí.
Příklady takových aplikací:
- Databáze (MySQL, PostgreSQL, MongoDB)
- Zprostředkovatelé zpráv (Kafka, RabbitMQ)
- Cache systémy (Redis, Memcached)
- Distribuované souborové systémy (například Ceph, pokud běží v Kubernetes)
- Jakákoli aplikace, která potřebuje uchovávat stav mezi restarty a mít konstantní identifikaci.
Na rozdíl od Deployment, kde jsou Pody zaměnitelné a bez stavu, StatefulSet garantuje jedinečnost a zachování stavu pro každou repliku, což je kritické pro aplikace závislé na trvalém úložišti a stabilní síťové identifikaci.
Příklad nejjednoduššího StatefulSetu pro databázi:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Nutné pro stabilní síťovou identifikaci Podů
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 produkci používejte Secrets
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Cesta, kam se připojuje trvalé úložiště
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # Název šablony PVC
spec:
accessModes: [ "ReadWriteOnce" ] # Režim přístupu
resources:
requests:
storage: 10Gi # Požadovaný objem úložiště