Skip to main content

PostgreSQL Storage

PostgreSQL is recommended for production deployments, supporting high availability and large datasets.

When to Use​

PostgreSQL is ideal for:

  • Production deployments
  • High-availability with multiple replicas
  • Large clusters (100+ CronJobs)
  • Long retention periods
  • Teams already running PostgreSQL

Prerequisites​

  • PostgreSQL 12 or later
  • Database created for CronJob Guardian
  • User with appropriate permissions

Configuration​

Create Credentials Secret​

kubectl create namespace cronjob-guardian
kubectl create secret generic postgres-credentials \
--namespace cronjob-guardian \
--from-literal=password=your-secure-password

Helm Values​

config:
storage:
type: postgres
postgres:
host: postgres.database.svc
port: 5432
database: guardian
username: guardian
existingSecret: postgres-credentials
sslMode: require

persistence:
enabled: false # Not needed with external database

SSL Configuration​

Require SSL​

config:
storage:
postgres:
sslMode: require

Verify CA​

config:
storage:
postgres:
sslMode: verify-ca
sslRootCert:
secretKeyRef:
name: postgres-ca
key: ca.crt

Full Verification​

config:
storage:
postgres:
sslMode: verify-full
sslRootCert:
secretKeyRef:
name: postgres-ca
key: ca.crt

Connection Pool​

Tune connection pool for performance:

config:
storage:
postgres:
maxOpenConns: 25
maxIdleConns: 10
connMaxLifetime: 5m
connMaxIdleTime: 1m

High Availability​

With PostgreSQL, run multiple operator replicas:

replicaCount: 2

leaderElection:
enabled: true
leaseDuration: 15s
renewDeadline: 10s
retryPeriod: 2s

config:
storage:
type: postgres
postgres:
host: postgres.database.svc
database: guardian
username: guardian
existingSecret: postgres-credentials

Complete Example​

values-postgres.yaml
replicaCount: 2

leaderElection:
enabled: true

config:
storage:
type: postgres
postgres:
host: postgres.database.svc.cluster.local
port: 5432
database: cronjob_guardian
username: guardian
existingSecret: postgres-credentials
sslMode: require
maxOpenConns: 25
maxIdleConns: 10
connMaxLifetime: 5m

persistence:
enabled: false

resources:
limits:
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi

Database Setup​

Create Database​

CREATE DATABASE cronjob_guardian;
CREATE USER guardian WITH ENCRYPTED PASSWORD 'secure-password';
GRANT ALL PRIVILEGES ON DATABASE cronjob_guardian TO guardian;

Schema Permissions​

CronJob Guardian creates tables automatically. Ensure the user has:

GRANT CREATE ON SCHEMA public TO guardian;
GRANT ALL ON ALL TABLES IN SCHEMA public TO guardian;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO guardian;

Managed PostgreSQL​

AWS RDS​

config:
storage:
postgres:
host: guardian.xxx.us-east-1.rds.amazonaws.com
port: 5432
database: guardian
username: guardian
existingSecret: rds-credentials
sslMode: require

Google Cloud SQL​

config:
storage:
postgres:
host: 10.0.0.3 # Private IP
port: 5432
database: guardian
username: guardian
existingSecret: cloudsql-credentials
sslMode: disable # If using Cloud SQL Proxy

Azure Database​

config:
storage:
postgres:
host: guardian.postgres.database.azure.com
port: 5432
database: guardian
username: guardian@guardian
existingSecret: azure-pg-credentials
sslMode: require

Monitoring​

Metrics​

Enable PostgreSQL connection metrics:

metrics:
enabled: true
serviceMonitor:
enabled: true

Exposed metrics include:

  • cronjob_guardian_db_connections_open
  • cronjob_guardian_db_connections_idle
  • cronjob_guardian_db_query_duration_seconds

Health Checks​

CronJob Guardian performs health checks on the database connection. Configure via:

config:
storage:
postgres:
healthCheckInterval: 30s

Backup​

Use standard PostgreSQL backup tools:

pg_dump​

pg_dump -h postgres.database.svc -U guardian cronjob_guardian > backup.sql

Restore​

psql -h postgres.database.svc -U guardian cronjob_guardian < backup.sql

Managed Service Backups​

Use your cloud provider's backup features for production.

Troubleshooting​

Connection Refused​

  • Verify host and port
  • Check network policies
  • Verify PostgreSQL is running

Authentication Failed​

  • Check secret contains correct password
  • Verify username exists in database
  • Check pg_hba.conf allows connections

SSL Errors​

  • Verify sslMode matches server configuration
  • Check CA certificate if using verify-ca/verify-full

Connection Pool Exhausted​

  • Increase maxOpenConns
  • Check for connection leaks
  • Review slow queries