Production-ready Helm chart for PgDog with high availability, security, and resource management features.
✅ Resource limits with guaranteed QoS (1GB:1CPU ratio)
✅ PodDisruptionBudget for high availability
✅ Pod anti-affinity for spreading across nodes
✅ ExternalSecrets integration for secure credential management
✅ ServiceAccount and RBAC with minimal permissions
✅ Pinned image versions for production deployments
- Install Helm
- Configure
kubectl
to point to your K8s cluster - Add our Helm repository:
helm repo add pgdogdev https://helm.pgdog.dev
- Configure databases and users in
values.yaml
- Install:
helm install <name> pgdogdev/pgdog -f values.yaml
All resources will be created in <name>
namespace.
Configuration is done via values.yaml
. All PgDog settings from
pgdog.toml
and users.toml
are supported. General settings
([general]
section) are top level. Use camelCase format instead
of snake_case, for example: checkout_timeout
becomes
checkoutTimeout
.
workers: 2
defaultPoolSize: 15
openMetricsPort: 9090
Pin to a specific version for production deployments:
image:
repository: ghcr.io/pgdogdev/pgdog
tag: "v1.2.3" # Pin to specific version
pullPolicy: IfNotPresent
Legacy format (still supported for backward compatibility):
image:
name: ghcr.io/pgdogdev/pgdog:main
pullPolicy: Always
Add databases to databases
list:
databases:
- name: "prod"
host: "10.0.0.1"
Add users to users
list:
users:
- name: "alice"
database: "prod"
password: "hunter2" # See ExternalSecrets for secure storage
Add mirrors to mirrors
list. For example:
mirrors:
- sourceDb: "prod"
destinationDb: "staging"
Ensures minimum pod availability during voluntary disruptions (enabled by default):
podDisruptionBudget:
enabled: true
minAvailable: 1 # At least 1 pod always available
Spreads pods across nodes for better reliability (enabled by default):
podAntiAffinity:
enabled: true
type: soft # "soft" (preferred) or "hard" (required)
Securely manage credentials using ExternalSecrets operator:
Option 1: Create ExternalSecret with chart
externalSecrets:
enabled: true
create: true
secretStoreRef:
name: aws-secrets-manager
kind: SecretStore
remoteRefs:
- secretKey: users.toml
remoteRef:
key: pgdog/users
Option 2: Use existing ExternalSecret
externalSecrets:
enabled: true
create: false
name: "platform-managed-secret"
secretName: "my-secret" # Name of Secret it creates
RBAC with minimal permissions is enabled by default:
serviceAccount:
create: true
annotations: {}
rbac:
create: true
Default resources use Guaranteed QoS with 1GB:1CPU ratio:
resources:
requests:
cpu: 1000m # 1 CPU
memory: 1Gi # 1GB
limits:
cpu: 1000m
memory: 1Gi
Prometheus metrics can be collected with a sidecar. Enable by
configuring prometheusPort
:
prometheusPort: 9091
# Resources for Prometheus sidecar
prometheusResources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 100m
memory: 100Mi
Make sure it's different from openMetricsPort
. You can configure
Prometheus in templates/prom/config.yaml
.
Contributions are welcome. Please open a pull request / issue with requested changes.
MIT