Sari la conținutul principal

PostgreSQL și stocarea persistentă

Service-ul PostgreSQL​

Aplicăm mai întâi Service-ul headless:

kubectl apply -f k8s/20-postgres-service.yaml
kubectl get service postgres -n cc-lab3

Manifestul conține:

spec:
clusterIP: None
selector:
app: postgres

Valoarea clusterIP: None indică un Service headless. Acesta nu oferă un IP virtual pentru load balancing, ci permite descoperirea directă a Pod-urilor gestionate de StatefulSet.

StatefulSet-ul PostgreSQL​

Fișierul k8s/21-postgres-statefulset.yaml declară o singură replică:

spec:
serviceName: postgres
replicas: 1

Configurația bazei este preluată din ConfigMap și Secret:

env:
- name: POSTGRES_DB
valueFrom:
configMapKeyRef:
name: ticketing-config
key: DB_NAME
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: ticketing-db-secret
key: DB_PASSWORD

volumeClaimTemplates​

StatefulSet-ul nu declară un volum temporar. El cere Kubernetes să creeze un PVC stabil pentru fiecare replică:

volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

Pentru replica cu ordinalul 0, PVC-ul va avea numele data-postgres-0. Volumul este montat în directorul real folosit de PostgreSQL:

volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data

Lansarea bazei de date​

Aplicați manifestul:

kubectl apply -f k8s/21-postgres-statefulset.yaml
kubectl rollout status statefulset/postgres -n cc-lab3

Inspectați resursele create:

kubectl get statefulset,pods,pvc,pv -n cc-lab3
kubectl describe statefulset postgres -n cc-lab3
kubectl describe pvc data-postgres-0 -n cc-lab3

Ar trebui să observați:

  • Pod-ul postgres-0
  • PVC-ul data-postgres-0 în starea Bound
  • un PersistentVolume asociat PVC-ului
  • Pod-ul PostgreSQL în starea Running și Ready.

Readiness pentru PostgreSQL​

Containerul folosește pg_isready:

readinessProbe:
exec:
command:
- /bin/sh
- -c
- exec pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"

Pod-ul poate exista și procesul poate rula înainte ca baza să accepte conexiuni. Readiness separă aceste două stări.

notă

PVC-ul are un ciclu de viață diferit de Pod. Recrearea Pod-ului nu recreează automat datele și nu schimbă PVC-ul care îi este asociat.