locals { app_slug = "${var.instance}${var.component == "" ? "" : "-"}${var.component}" pg_labels = merge(var.labels, { "app.kubernetes.io/component" = "pg" }) pool_labels = merge(var.labels, { "app.kubernetes.io/component" = "pg-pool" }) } resource "kubectl_manifest" "pg" { yaml_body = join("", concat([<<-EOF apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: "${local.app_slug}-pg" namespace: "${var.namespace}" labels: ${jsonencode(local.pg_labels)} annotations: "k8up.io/backupcommand": "pg_dump -U postgres -d ${var.component} --clean" "k8up.io/file-extension": ".sql" spec: instances: ${var.replicas} imageName: "${var.images.postgresql.registry}/${var.images.postgresql.repository}:${var.images.postgresql.tag}" storage: size: "${var.storage.size}" bootstrap: initdb: database: "${var.component}" owner: "${var.component}" monitoring: enablePodMonitor: true EOF ], var.backups.enable&&var.backups.use_barman?[<<-EOF backup: barmanObjectStore: destinationPath: "s3://${local.app_slug}-${var.namespace}/" endpointURL: "${var.backups.endpoint}/barman" s3Credentials: accessKeyId: name: "${var.backups.secret_name}" key: "${var.backups.key_id_key}" secretAccessKey: name: "${var.backups.secret_name}" key: "${var.backups.secret_key}" EOF ]:[""])) } resource "kubectl_manifest" "pg_backup" { count = var.backups.enable ? 1:0 yaml_body = <<-EOF apiVersion: postgresql.cnpg.io/v1 kind: ScheduledBackup metadata: name: "${local.app_slug}-pg" namespace: "${var.namespace}" labels: ${jsonencode(local.pg_labels)} spec: schedule: "${var.backups.schedule.db}" backupOwnerReference: self cluster: name: "${local.app_slug}-pg" EOF } resource "kubectl_manifest" "pg_pool" { depends_on = [kubectl_manifest.pg] yaml_body = <<-EOF apiVersion: postgresql.cnpg.io/v1 kind: Pooler metadata: name: "${local.app_slug}-pool" namespace: "${var.namespace}" labels: ${jsonencode(local.pool_labels)} spec: cluster: name: "${local.app_slug}-pg" instances: 1 type: rw pgbouncer: poolMode: session parameters: max_client_conn: "1000" default_pool_size: "10" EOF } data "kubernetes_secret_v1" "credentials" { depends_on = [ kubectl_manifest.pg ] metadata { name = "${local.app_slug}-pg-app" namespace = var.namespace } }