Sobes.tech
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é:

  1. Stabilná sieťová identifikácia. Pod-y získavajú jedinečný, trvalý hostname vo formáte <statefulset-name>-<pod-index>.
  2. 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.
  3. 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í).
  4. 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