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:
- 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. - 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. - Ordine strictă de pornire și actualizare:
db-0trebuie să fie complet pornit și sănătos înainte cadb-1să fie inițializat.
# 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).