StatefulSets
StatefulSets
Deployment bere pody jako zaměnitelné: náhodná jména, náhodné pořadí startu, jedna společná Service. Databáze a clustery potřebují pravý opak.
graph TB
SS[StatefulSet db] --> P0[db-0<br/>PVC data-db-0]
SS --> P1[db-1<br/>PVC data-db-1]
SS --> P2[db-2<br/>PVC data-db-2]
H[Headless Service db<br/>clusterIP: None] -.-> P0
H -.-> P1
H -.-> P2
Co dostanete navíc oproti Deploymentu:
| Vlastnost | Význam |
|---|---|
| Stabilní identita | pody jsou db-0, db-1, db-2 – jméno přežije restart |
| Stabilní síťové jméno | db-0.db.default.svc.cluster.local přes headless Service |
| Vlastní úložiště | volumeClaimTemplates vytvoří jeden PVC na každý pod a nechá ho |
| Řízené pořadí | start 0,1,2; ukončení 2,1,0; rolling update v opačném pořadí |
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: web-headless # headless Service, povinné
replicas: 3
selector:
matchLabels: { app: web }
template:
metadata:
labels: { app: web }
spec:
containers:
- name: web
image: nginx:1.27
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "" # dynamické provisioning tu není
resources:
requests:
storage: 1Gi
Bez StorageClass v tomhle clusteru zůstane volumeClaimTemplates v Pending,
dokud nebude existovat odpovídající PV pro každou repliku – tři repliky
potřebují tři PV. Právě proto lab nejdřív vytvoří /storage1..3 jako tři PV.
Na co se naráží
- Smazání StatefulSetu PVC nesmaže. Je to záměr – vaše data přežijí. Také to
znamená, že opětovné nasazení navazuje na stará data a že úklid je ruční
kubectl delete pvc. - Zmenšení počtu replik PVC také nechá být.
- StatefulSet z aplikace neudělá clusterovanou. Dává identitu a úložiště; replikace je věc aplikace – a tu automatizuje operátor.