Postgres Kubernetes backup cron job and restore

Dump your entire postgres db as part of your backup procedure

Mon, 25 Mar 2024

As part of my database maintanence I make a daily backup and once a week delete all backups older then 7 days old. I’m using a pvc as storage, that being said you could just as easily mount a nfs share to the pod. This tool will use pgdump_all which will dump absolutely everything.

---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: postgres-backup
  namespace: databases
spec:
  schedule: "@daily"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      backoffLimit: 0
      ttlSecondsAfterFinished: 600
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: postgres-backup
              image: postgres:alpine@sha256:884718395ee967fc70374563f3b4d72f0c61f48f81868decb9fa452915fe070e
              command: [/backups/backup_postgres.sh]
              env:
                - name: PGPASSWORD
                  value: PG_HOST_PASSWORD
                - name: POSTGRES_HOST_AUTH_METHOD
                  value: trust # this will allow us to make a connection to another instance
              volumeMounts:
                - name: nfs-backup-vol
                  mountPath: /backups
          volumes: # Using a PVC here, can easily make this a nfs share or storage of choice
            - name: nfs-backup-vol
              persistentVolumeClaim:
                claimName: pg-backups
---
# Deletes all files in the backup folder that are older then 7 days
apiVersion: batch/v1
kind: CronJob
metadata:
  name: postgres-dump-cleanup
  namespace: databases
spec:
  schedule: "@weekly"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      backoffLimit: 0
      ttlSecondsAfterFinished: 600
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: postgres-dump-cleanup
              image: busybox@sha256:ba76950ac9eaa407512c9d859cea48114eeff8a6f12ebaa5d32ce79d4a017dd8
              command: ["find", "/backups/sqldumps", "-type", "f", "-mtime", "+7", "-exec", "rm", "-f", "{}", "+"]
              volumeMounts:
                - name: nfs-backup-vol
                  mountPath: /backups
          volumes:
            - name: nfs-backup-vol
              persistentVolumeClaim:
                claimName: pg-backups

The contents of backup_postgres.sh are

#! /bin/sh
pg_dumpall -h pg_host -U pg_user -p 5432 -f /backups/sqldumps/tds-cluster-$(date +'%m-%d-%Y').db

If you needed to restore your db you can reverse the process a little. Instead of running backup_postgres.sh we can run restore_postgres.sh. You can also make this a job that you start manually, run it in a pod interactively or use pgadmin.

psql "postgresql://USER:PASSWORD@HOST:5432/*" -f ./tds-cluster-12-31-2023.db postgres

The postgres at the end is a fictatious db, the db does not need to exist in order for the restore process to start

Buy Me A CoffeeDigitalOcean Referral Badge
Loading...
Edward Beazer

Edward Beazer - I just like to build shit. Sometimes I get stuck for hours, even days while trying to figure out how to solve an issue or implement a new feature. Hope my tips and tutorials can save you some time.

DigitalOcean Referral Badge