Menempatkan database di lapisan yang tepat: memakai openebs-hostpath RWO untuk PostgreSQL single-node dengan performa lokal, menulis StatefulSet dengan PVC per-replica, dan memahami resiko Local PV yang terikat node beserta strategi backup

Media aplikasi sudah berbagi via NFS RWX. Sekarang tibalah pertanyaan penting: di mana database? Insting yang benar: JANGAN taruh PostgreSQL di volume RWX bersama media. Database punya kebutuhan sendiri — konsistensi I/O, latensi rendah, dan biasanya pola akses satu writer.
Untuk lab/small cluster, jawaban paling sehat: PostgreSQL di Local PV (openebs-hostpath) — volume RWO yang menempel pada node. Episode 8 membangun StatefulSet Postgres di atas Local PV, dan membahas jujur resiko "volume terikat node" beserta mitigasinya.
Mengapa tidak memakai NFS RWX untuk database?
Pemisahan arsitektural yang kita pakai:
Media aplikasi → openebs-nfs-rwx (RWX, shared, latensi ok)
Database → openebs-hostpath (RWO, lokal, cepat)Note
Untuk lab sederhana, satu instance PostgreSQL dengan backup teratur (pg_dump + Velero) jauh lebih masuk akal daripada replikasi streaming yang kompleks. Prioritas: data aman, bukan arsitektur megah.
StatefulSet memberi identitas stabil (postgres-0) dan skema volume per-replica:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: openebs-hostpath
resources:
requests:
storage: 5Gikubectl apply -f statefulset-postgres.yaml
kubectl get pod -l app=postgres
kubectl get pvc -l app.kubernetes.io/name=postgres -o widePVC dengan template otomatis bernama data-postgres-0 — menempel pada node tempat postgres-0 berjalan.
Local PV punya perilaku yang harus diingat:
Pending sampai node kembali — ia tidak otomatis pindah ke node lain.pg_dump harian + Velero (episode 20).Verifikasi data tersimpan di jalur hostpath:
ls -la /var/lib/openebs/openebs-hostpath/data-postgres-0/Warning
Jangan meng-copy folder hostpath dari node satu ke node lain sebagai "replikasi". Volume milik node spesifik; cara yang benar adalah backup/restore via tool database (pg_dump) atau Velero — bukan menggeser folder mentah.
Karena resiko terikat node, backup menjadi fitur keamanan utama:
kubectl exec postgres-0 -- pg_dump -U postgres laravel > laravel-$(date +%F).sqlUntuk simulasi recovery lab-to-lab, restore ke Postgres baru:
kubectl exec -i postgres-new -- psql -U postgres laravel < laravel-2026-08-16.sqlDetail backup lengkap (jadwal cron, Velero, uji restore) dibahas di episode 20.
Pada episode 8 ini, database telah menempati lapisan yang tepat:
Inti yang harus dibawa pulang:
volumeClaimTemplates menghasilkan PVC data-postgres-0.pg_dump + Velero; jangan memindah folder mentah antar node.Di episode 9 selanjutnya kita akan mempertimbangkan object storage: kapan MinIO di atas Local PV masuk akal, endpoint S3, integrasi Laravel Flysystem, dan kapan cukup shared filesystem saja. Sampai jumpa di episode 9!