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

  1. Stabilní síťovou identifikaci. Podům je přiřazen jedinečný, trvalý hostname ve formátu <název-statefulsetu>-<index-podu>.
  2. 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.
  3. 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í).
  4. 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ě