Melindungi data lab dengan strategi berlapis yang terjangkau: pg_dump berjadwal untuk database, rsync untuk media, instalasi dan penggunaan Velero sebagai proteksi seluruh cluster, serta uji restore berkala sebagai bagian dari disiplin mingguan

Melindungi data lab tidak berarti membeli solusi mahal — itu berarti disiplin berlapis dengan alat yang klasik: rutin dump database, sinkronisasi file media, dan proteksi cluster menyeluruh dengan Velero. Episode 20 merangkai semuanya menjadi jadwal yang realistis.
Tidak satu pun alat meng-cover segalanya. Kombinasi yang tepat untuk stack kita:
| Lapis | Data | Alat | Frekuensi |
|---|---|---|---|
| 1 | Database (PostgreSQL) | pg_dump + cron/K8s CronJob | 6 jam / harian |
| 2 | Media (NFS RWX) | rsync ke lokasi node lain | malam hari |
| 3 | Cluster resources + PVC | Velero | harian |
CronJob K8s yang mengeksekusi pg_dump terkompresi:
apiVersion: batch/v1
kind: CronJob
metadata:
name: pgdump
spec:
schedule: "0 */6 * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: pgdump
image: postgres:16-alpine
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD
command:
- /bin/sh
- -c
- |
PGPASSWORD=$PGPASSWORD pg_dump -h postgres -U laravel laravel \
| gzip > /backup/laravel-$(date +\%F_\%H).sql.gz
volumeMounts:
- name: backup
mountPath: /backup
volumes:
- name: backup
persistentVolumeClaim:
claimName: backup-storagekubectl apply -f cronjob-pgdump.yaml
kubectl get cronjobNote
Penyimpanan backup di PVC RWX aman — PVC dijamin tidak diakses dari aplikasi lain (isolasi satu PVC per aplikasi, episode 12). Simpan backup di PVC yang berbeda dari data aslinya.
Media di NFS RWX disinkronkan ke folder node lain (mis. node 2) tiap malam:
kubectl exec deploy/rwx-writer -- sh -c \
'rsync -avz --delete /shared/ pokok:/mnt/backups/media/'Atau CronJob yang menyalin dari volume NFS ke folder node:
schedule: "0 1 * * *"
# container utama: rsync -av /media/ /backup-lokasi/
command: ["rsync", "-av", "/media/", "/backup-lokasi/"]Sekali lagi target adalah lokasi berbeda dari sumber — mencegah satu kejadian menghapus keduanya.
Velero mencadangkan resources cluster DAN volume (fs-backup untuk hostpath):
velero install \
--provider aws --bucket <bucket-velero> \
--backup-location-config region=<region> \
--snapshot-location-config region=<region> \
--plugins velero/velero-plugin-for-aws:v1.9.0 \
--default-volumes-to-fs-backupBackup harian seluruh namespace apps:
velero schedule create daily-apps \
--schedule "0 2 * * *" \
--include-namespaces apps \
--ttl 720hvelero get backupsRestore cepat:
velero restore create from-schedule --from-schedule daily-apps
kubectl get pvc -AWarning
Backup yang tidak pernah di-restore bukanlah backup. Jadwalkan uji restore bulanan: restore ke namespace terpisah, bandingkan data, lalu bersihkan. Baru saat itulah proteksi benar-benar terverifikasi.
Rangkuman jadwal mingguan yang realistis:
Setiap 6 jam : pg_dump CronJob
Pukul 01.00 : rsync media lane node lain
Pukul 02.00 : Velero backup resources + PVC (fs-backup)
Ahad : uji restore cepat database ke namespace test poolTulis runbook di repo tim: nama backup yang dipakai, perintah restore, dan kapan harus memanggil siapa.
Pada episode 20 ini, data lab tidak lagi berjalan tanpa jaring pengaman:
Inti yang harus dibawa pulang:
0 */6 * * * untuk dump gzip terkompresi.--default-volumes-to-fs-backup untuk volume hostpath.Di episode 21 selanjutnya kita akan mengotomasi semuanya: CI/CD & GitOps — pipeline build image Laravel, penyematan konfigurasi storage, dan sinkronisasi manifest ke cluster secara otomatis. Sampai jumpa di episode 21!