Orchestrarea Aplicațiilor cu Stare cu StatefulSet și Headless Service în Kubernetes (kubectl)

Ghid avansat pentru StatefulSets în Kubernetes: gestionarea bazelor de date și sistemelor distribuite (PostgreSQL, Kafka, Redis) cu identitate de rețea stabilă, volume persistente dedicate și servicii Headless fără IP virtual.

Sintaxă comandă
kubectl get statefulsets | kubectl rollout status statefulset/postgres-cluster

Aplicațiile distribuite cu stare (baze de date cu replicare primar-secundar, clustere Kafka, Zookeeper, Elasticsearch) nu pot fi orchestrate prin Deployment-uri obișnuite, deoarece Pod-urile unui Deployment sunt interschimbabile, au nume aleatorii generate dinamic (ex: backend-7d9f8b-x2k4) și împart aceleași volume de disc. StatefulSet rezolvă această problemă oferind trei garanții fundamentale:

  1. Identitate ordinală stabilă: Pod-urile sunt numite secvențial: db-0, db-1, db-2. La repornire, Pod-ul își recapătă exact același nume.
  2. Stocare persistentă dedicată: Prin volumeClaimTemplates, fiecare replică primește propriul său volum de disc (PVC) independent, care nu este șters chiar dacă Pod-ul este oprit.
  3. Ordine strictă de pornire și actualizare: db-0 trebuie să fie complet pornit și sănătos înainte ca db-1 să fie inițializat.
StatefulSet cu Headless Service (cluster-ip: None)
# 1. Serviciul Headless (permite accesarea directă a fiecărui Pod prin DNS intern):
apiVersion: v1
kind: Service
metadata:
  name: postgres-headless
spec:
  clusterIP: None # Fără IP virtual comun!
  selector:
    app: postgres
  ports:
    - port: 5432
      name: postgres

---
# 2. Obiectul StatefulSet:
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: "postgres-headless"
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:16-alpine
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: pgdata
              mountPath: /var/lib/postgresql/data
  # Șablonul care provizionează dinamic un volum independent per Pod:
  volumeClaimTemplates:
    - metadata:
        name: pgdata
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: "fast-ssd"
        resources:
          requests:
            storage: 20Gi

Datorită serviciului Headless, fiecare instanță poate fi apelată direct prin adresa sa DNS stabilă: postgres-0.postgres-headless.default.svc.cluster.local (utilizat de replica secundară pentru a se sincroniza cu nodul primar).