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:

VlastnostVýznam
Stabilní identitapody jsou db-0, db-1, db-2 – jméno přežije restart
Stabilní síťové jménodb-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.

Reference