PostgreSQL is een populair relationeel databasebeheersysteem (RDBMS) met functies voor hoge beschikbaarheid, zoals streamingreplicatie, logische replicatie en failover. Door PostgreSQL op Kubernetes te implementeren, kunnen organisaties veerkrachtige systemen bouwen die minimale downtime en hoge gegevensbeschikbaarheid garanderen.
Met Kubernetes StatefulSets kun je PostgreSQL dynamisch schalen op basis van de vraag.
Choose hour server now!
Zorg dat je het volgende hebt:
Kubernetes-cluster (cloud of lokaal): je kunt binnen enkele minuten een cluster opzetten bij Hostman. Voor een lokale omgeving kun je tools gebruiken zoals k3s, minikube, microk8s of kind.

kubectl: dit CLI-hulpmiddel communiceert met je cluster. Het vereist een YAML-configuratiebestand met de clusterdetails (meestal geleverd door je cloudprovider).
Download het bestand eenvoudig via het Hostman-controlepaneel en stel vervolgens de omgevingsvariabele in:

Om verbinding te maken, moet u de KUBECONFIG-omgevingsvariabele dienovereenkomstig instellen.
export KUBECONFIG=/absolute/path/to/file/k8s-cluster-config.yaml
Helm: de Helm CLI is nodig om charts te installeren. Versie 3 is vereist.
Helm is de pakketbeheerder voor Kubernetes, vergelijkbaar met apt voor Ubuntu/Debian. In plaats van afzonderlijke YAML-bestanden te schrijven voor Pods, Services, Volumes, Secrets enz., gebruik je één Helm-opdracht om alles in te stellen.
helm repo add bitnami https://charts.bitnami.com/bitnami
Om uw lokale Helm-repository te synchroniseren met de externe repository:
helm repo update
PostgreSQL vereist permanente opslag zodat gegevens behouden blijven bij een herstart of crash van een pod.
Maak het bestand postgres-local-pv.yaml aan:
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgresql-local-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /mnt/data/postgresql
⚠️ Let op: hostPath verwijst naar een lokaal pad op één node — niet geschikt voor productieomgevingen. Gebruik in plaats daarvan cloud-native opslag (bijv. Ceph, OpenEBS, Portworx, GlusterFS) voor betrouwbaarheid en schaalbaarheid.
Maak vervolgens postgres-local-pvc.yaml aan:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgresql-local-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: manual
De modus ReadWriteOnce betekent dat slechts één node tegelijk mag schrijven/lezen. ReadWriteMany lijkt aantrekkelijk, maar veroorzaakt bij PostgreSQL risico’s op racecondities en gegevenscorruptie.
Pas de manifests toe:
kubectl apply -f postgres-local-pv.yaml
kubectl apply -f postgres-local-pvc.yaml
helm install tutorial-db bitnami/postgresql --set auth.username=bhuwan \
--set auth.password=”AeSeigh2gieshe” \
--set auth.database=k8s-tutorial \
--set auth.postgresPassword=”Ze4hahshez6dop9vaing” \
--set primary.persistence.existingClaim=postgresql-local-pvc \
--set volumePermissions.enabled=true
Controleer na enkele minuten:
kubectl get all

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default tutorial-db-postgresql -o jsonpath="{.data.password}" | base64 -d)
kubectl run tutorial-db-postgresql-client --rm --tty -i --restart='Never' \
--image docker.io/bitnami/postgresql:17.2.0-debian-12-r6 \
--env="PGPASSWORD=$POSTGRES_PASSWORD" \
--command -- psql --host tutorial-db-postgresql \
-U bhuwan -d k8s-tutorial -p 5432
De pod wordt automatisch verwijderd door de --rm vlag. Pas de waarden aan als je een andere release-naam of database gebruikt.
Een StatefulSet is de juiste Kubernetes-resource voor toepassingen met status zoals PostgreSQL. Elk exemplaar krijgt een stabiele netwerkidentiteit en een eigen volume.
Schoon eerst bestaande bronnen op:
helm delete tutorial-db
kubectl delete pvc postgresql-local-pvc
kubectl delete pv postgresql-local-pv
kubectl apply -f postgres-local-pv.yaml -f postgres-local-pvc.yaml
Maak het bestand postgres-statefulset.yaml:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres-statefulset
labels:
app: postgres
spec:
serviceName: "postgresql-headless-svc"
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:17.2
envFrom:
- secretRef:
name: postgresql-secret
ports:
- containerPort: 5432
name: postgresdb
volumeMounts:
- name: pv-data
mountPath: /var/lib/postgresql/db
volumes:
- name: pv-data
persistentVolumeClaim:
claimName: postgresql-local-pvc
Maak het Secret voor de databasewachtwoorden:
kubectl create secret generic postgresql-secret --from-literal=POSTGRES_PASSWORD=Ze4hahshez6dop9vaing
kubectl apply -f postgres-statefulset.yaml
Komt de pod niet verder dan Pending? Maak dan een StorageClass aan:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: manual
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
Controleer eventuele fouten:
kubectl describe pod postgres-statefulset-0
Maak vervolgens een Headless Service voor interne toegang — bestand postgres-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: postgresql-headless-svc
spec:
type: ClusterIP
selector:
app: postgres
ports:
- port: 5432
targetPort: 5432
clusterIP: None
Test de verbinding:
kubectl run tutorial-db-postgresql-client --rm --tty -i --restart='Never' \
--image docker.io/bitnami/postgresql:17.2.0-debian-12-r6 \
--env="PGPASSWORD=Ze4hahshez6dop9vaing" \
--command -- psql --host postgres-statefulset-0.postgresql-headless-svc \
-U postgres -p 5432
Schalen van het StatefulSet:
kubectl scale statefulset postgres-statefulset --replicas=3

Je kunt individuele pods bereiken via de headless service, bijv. postgres-statefulset-1.postgresql-headless-svc.
Choose your server now!
Een Helm-chart is de aanbevolen methode voor complexe of productie-implementaties. Helm automatiseert versiebeheer en verbergt de complexiteit van afzonderlijke Kubernetes-componenten. Met helm template kun je het chart lokaal renderen en de YAML-bestanden aanpassen.
Een Helm-chart is de aanbevolen methode voor complexe of productie-implementaties. Helm automatiseert versiebeheer en verbergt de complexiteit van afzonderlijke Kubernetes-componenten. Met helm template kun je het chart lokaal renderen en de YAML-bestanden aanpassen.
Kubernetes biedt schaalbaarheid, flexibiliteit en automatisering voor PostgreSQL-databases. Door gebruik te maken van StatefulSets, PVC’s, PDB’s en Secrets-beheer, kun je een PostgreSQL-omgeving opzetten die klaar is voor productie.