Sobes.tech
Middle

Voor welke toepassing moet je StatefulSet gebruiken in plaats van Deployment en waarom?

sobes.tech AI

Antwoord van AI

StatefulSet moet worden gebruikt voor toepassingen die:

  1. Stabiele netwerkidentificatie vereisen. Pods krijgen een unieke, permanente hostname in het formaat <statefulset-naam>-<pod-index>.
  2. Stabiele, persistente opslag. Elke Pod-replica krijgt een eigen PersistentVolume toegewezen. Zelfs na het opnieuw opstarten van de Pod blijven de gegevens eraan gekoppeld.
  3. Geordende implementatie en schaalvergroting. Pods worden in een strikt gedefinieerde volgorde gemaakt en verwijderd (oplopend voor maken, aflopend voor verwijderen).
  4. Geordende of parallelle update. Ondersteunt zowel stapsgewijze (rolling update) als parallelle (in-place of parallel) updates, met controle over de volgorde.

Voorbeelden van dergelijke toepassingen:

  • Databases (MySQL, PostgreSQL, MongoDB)
  • Berichtbrokers (Kafka, RabbitMQ)
  • Cache-systemen (Redis, Memcached)
  • Gedistribueerde bestandssystemen (bijvoorbeeld Ceph, indien uitgevoerd in Kubernetes)
  • Elke toepassing die toestand moet bewaren tussen herstarts en een constante identificatie nodig heeft.

In tegenstelling tot Deployment, waarbij Pods uitwisselbaar en stateless zijn, garandeert StatefulSet uniciteit en het behoud van toestand voor elke replica, wat cruciaal is voor toepassingen die afhankelijk zijn van persistent opslag en stabiele netwerkidentificatie.

Een eenvoudig voorbeeld van een StatefulSet voor een database:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: "mysql" # Vereist voor stabiele netwerkidentificatie van Pods
  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" # Gebruik Secrets in productie
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql # Pad waar de persistente opslag wordt gekoppeld
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage # Naam van de PVC-sjabloon
    spec:
      accessModes: [ "ReadWriteOnce" ] # Toegangsmodus
      resources:
        requests:
          storage: 10Gi # Aangevraagde opslagruimte