PostgreSQL implementeren op Kubernetes: stap-voor-stap handleiding
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.
Kubernetes-omgeving voorbereiden Link kopiëren
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.
PostgreSQL implementeren met een Helm-chart Link kopiëren
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.
Stap 1: Helm-repository toevoegen Link kopiëren
helm repo add bitnami https://charts.bitnami.com/bitnamiOm uw lokale Helm-repository te synchroniseren met de externe repository:
helm repo updateStap 2: Datapersistentie beheren Link kopiëren
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.yamlStap 3: PostgreSQL installeren met Helm Link kopiëren
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
Stap 4: Testen en verbinden Link kopiëren
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.
PostgreSQL van nul af aan implementeren op Kubernetes Link kopiëren
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.yamlMaak 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-pvcMaak het Secret voor de databasewachtwoorden:
kubectl create secret generic postgresql-secret --from-literal=POSTGRES_PASSWORD=Ze4hahshez6dop9vaingkubectl apply -f postgres-statefulset.yamlKomt 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-0Maak 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, replicatie en back-up Link kopiëren
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.
- Back-ups uitvoeren: maak een CronJob aan met het hulpprogramma pg_dump.
VolumeSnapshots zijn ook een optie voor extra zekerheid.
Best Practices Link kopiëren
- Resource Requests & Limits instellen: voorkom over- of onderprovisionering.
- Back-ups plannen met CronJobs of snapshots.
- Monitoring & logging: gebruik Prometheus + Grafana voor PostgreSQL-statistieken (query-prestaties, schijfgebruik, replicatiestatus).
- Pod Disruption Budgets (PDB’s) configureren om te voorkomen dat meerdere PostgreSQL-pods tegelijk offline gaan bij updates.
Conclusie Link kopiëren
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.
Conclusie Link kopiëren
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.