apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: postgresql namespace: postgresql spec: # PostgreSQL version imageName: ghcr.io/cloudnative-pg/postgresql:16.6 # Number of instances instances: 3 # 1 primary + 2 replicas for HA # Storage configuration - using local-path-retain for data protection storage: storageClass: local-path-retain size: 10Gi # Resource requests and limits resources: requests: memory: "256Mi" cpu: "30m" limits: memory: "384Mi" # PostgreSQL configuration postgresql: parameters: max_connections: "200" shared_buffers: "128MB" effective_cache_size: "384MB" maintenance_work_mem: "128MB" checkpoint_completion_target: "0.9" wal_buffers: "16MB" default_statistics_target: "100" random_page_cost: "1.1" effective_io_concurrency: "200" work_mem: "2621kB" min_wal_size: "1GB" max_wal_size: "4GB" # Bootstrap configuration bootstrap: initdb: database: app owner: app secret: name: postgresql-app-user # Monitoring monitoring: enablePodMonitor: true customQueriesConfigMap: - name: cnpg-default-monitoring key: queries # Add pod labels to metrics for Grafana dashboard compatibility podMonitorRelabelings: # Add cluster label from pod label - sourceLabels: [__meta_kubernetes_pod_label_cnpg_io_cluster] targetLabel: cluster # Add instance role label - sourceLabels: [__meta_kubernetes_pod_label_cnpg_io_instanceRole] targetLabel: role # Backup disabled - using Velero for backups instead # Affinity to spread replicas across nodes (soft - prefer different nodes) affinity: podAntiAffinityType: preferred tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoExecute" # Enable superuser access enableSuperuserAccess: true superuserSecret: name: postgresql-superuser # Note: databases created manually (CNPG managed databases not supported in this version) # - authelia