Postgresql on Kubernetes
Manually change the postgres user password
Upgrade postgres major version
Dump & restore
Preferred solution: Dump and restore
- How to properly handle major version upgrades?
 - bitnami docs: Create and restore PostgreSQL backups
 - Dump and restore a postgresql database on kubernetes
 
Issues / considerations:
- Don't use text file format, but custom file format (
-Fc), otherwise it could lead to text file issues like dos line endings and\Nissues. - Also, avoid piping from pod to local filesystem because of the above issue.
 
Manual dumps
Option 0: Use pg_dumpall like the automated bitname postgresql backup cronjob:
From inside the postgres container ()
export PGDUMP_DIR=/var/lib/postgresql/data
pg_dumpall --clean --if-exists --load-via-partition-root \
  --quote-all-identifiers --no-password \
  --file=${PGDUMP_DIR}/pg_dumpall-$(date '+%Y-%m-%d-%H-%M').pgdump"
Option 1: Dump directly on pg host:
export PG_PASSWORD=$(kubectl get secret -n plausible plausible-postgresql \
  -o jsonpath="{.data.postgres-password}" | base64 --decode)
echo $PG_PASSWORD
kubectl -n plausible exec -ti plausible-postgresql-0 -- pg_dump -Fc --host \
  plausible-postgresql -U postgres -d plausible -f /tmp/plausible.dump
kubectl -n plausible cp plausible-postgresql-0:/tmp/plausible.dump /tmp/plausible.dump
Option 2: Dump from dedicated pg client pod (WIP, still not working since the pod terminates after pg_dump)
export PG_PASSWORD=$(kubectl get secret -n plausible plausible-postgresql \
  -o jsonpath="{.data.postgres-password}" | base64 --decode)
export PG_IMAGE=$(kubectl -n plausible get pod plausible-postgresql-0 \
  -o jsonpath="{.spec.containers[0].image}")
kubectl run db-postgresql-client --rm --tty -i --restart='Never' \
  --namespace plausible --image $PG_IMAGE --env="PGPASSWORD=$PG_PASSWORD" \
  --command -- \
  pg_dump -Fc --host plausible-postgresql -U postgres -d plausible -f /tmp/plausible.dump
kubectl -n plausible cp plausible-postgresql-0:/tmp/plausible.dump /tmp/plausible.dump
- Remove Helmrelease
 - Remove Postgres PVC
 - Upgrade helmrelease to new Postgres major version
 - Scale down deployments/statefulsets (i.e. Plausible, Plausible-clickhouse )
 
Restore
kubectl -n plausible cp /tmp/plausible.dump plausible-postgresql-0:/tmp/plausible.dump
kubectl -n plausible exec -ti plausible-postgresql-0 -- \
  dropdb -U postgres plausible
kubectl -n plausible exec -ti plausible-postgresql-0 -- \
  createdb -U postgres plausible
kubectl -n plausible exec -ti plausible-postgresql-0 -- \
  pg_restore -U postgres -d plausible /tmp/plausible.dump