Persistent Volume Claims

Persistent Volume Claims (PVCs) reservieren persistenten Speicher für Pods. Der Speicher überlebt das Löschen eines Pods.

postgres-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres
spec:
  accessModes:
    - ReadWriteOncePod
  storageClassName: local-path   # in k3s standardmäßig vorhanden
  resources:
    requests:
      storage: 1Gi

StatefulSet mit PVC

# Auszug aus postgres-statefulset-with-pvc.yaml
spec:
  containers:
  - name: postgres-container
    image: postgres:18.3-alpine3.23
    env:
    - name: POSTGRES_PASSWORD
      value: secret
    ports:
    - containerPort: 5432
    volumeMounts:
    - name: data
      mountPath: /var/lib/postgresql/
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: postgres

Befehle

kubectl apply -f postgres-pvc.yaml
kubectl get pvc
kubectl describe pvc/postgres

kubectl delete statefulset postgres
kubectl apply -f postgres-statefulset-with-pvc.yaml

kubectl get pvc
kubectl get pv
kubectl describe pv [pv-id]
kubectl get pv [pv-id] -o json | jq .spec.local.path
ls -lah [path-aus-obigem-befehl]

Persistenz testen

kubectl exec -it pod/postgres-0 -- bash
psql -U postgres
CREATE TABLE person (name VARCHAR(255));
INSERT INTO person (name) VALUES ('Christian Trutz');
SELECT * FROM person;
\q
exit

kubectl delete pod postgres-0
kubectl get pods -o wide   # Pod wird neu erstellt

kubectl exec -it pod/postgres-0 -- bash
psql -U postgres
SELECT * FROM person;   # Daten sind noch vorhanden

Access Modes

Modus Beschreibung
ReadWriteOnce Nur ein Node kann lesen/schreiben
ReadOnlyMany Mehrere Nodes können lesen
ReadWriteMany Mehrere Nodes können lesen/schreiben
ReadWriteOncePod Nur ein Pod kann lesen/schreiben