Apresentação PGDay Blumenau 2026 – Gerenciando ambientes PostgreSQL com o operador CloudNativePG

Apresentação sobre o operador CloudNativePG que foi apresentada no evento PGDay Blumenau 2026 que ocorreu no Bloco H da universidade FURB no dia 30/05/2026 (sábado.

Abaixo segue a apresentação exibida no evento.

Abaixo segue o conteúdo exibido na parte de demonstração.

##########################################################################
##@ Podman + Minikube install
############################################################
lemos@ubuntuserverpg:~$ sudo apt install podman podman-compose -y
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ podman --version
podman version 5.7.0
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube version
minikube version: v1.38.1
commit: c93a4cb9311efc66b90d33ea03f75f2c4120e9b0
lemos@ubuntuserverpg:~$ 

############################################################
##@ Minikube start
############################################################
lemos@ubuntuserverpg:~$ minikube config set rootless true
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube start --driver=podman --container-runtime=containerd --kubernetes-version=v1.35.1 --addons=csi-hostpath-driver --addons=volumesnapshots --addons=metrics-server
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get pods -A
...

############################################################
##@ Helm install
############################################################
lemos@ubuntuserverpg:~$ sudo apt-get install curl gpg apt-transport-https --yes
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ curl -fsSL https://packages.buildkite.com/helm-linux/helm-debian/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ echo "deb [signed-by=/usr/share/keyrings/helm.gpg] https://packages.buildkite.com/helm-linux/helm-debian/any/ any main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
deb [signed-by=/usr/share/keyrings/helm.gpg] https://packages.buildkite.com/helm-linux/helm-debian/any/ any main
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo apt-get update
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo apt-get install helm
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ helm version
version.BuildInfo{Version:"v3.20.0", GitCommit:"b2e4314fa0f229a1de7b4c981273f61d69ee5a59", GitTreeState:"clean", GoVersion:"go1.25.6"}

############################################################
##@ CNPG install
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl -- apply --server-side -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.29/releases/cnpg-1.29.1.yaml
namespace/cnpg-system serverside-applied
customresourcedefinition.apiextensions.k8s.io/backups.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/clusterimagecatalogs.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/clusters.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/databases.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/failoverquorums.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/imagecatalogs.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/poolers.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/publications.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/scheduledbackups.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/subscriptions.postgresql.cnpg.io serverside-applied
serviceaccount/cnpg-manager serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-database-editor-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-database-viewer-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-manager serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-publication-editor-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-publication-viewer-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-subscription-editor-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-subscription-viewer-role serverside-applied
clusterrolebinding.rbac.authorization.k8s.io/cnpg-manager-rolebinding serverside-applied
configmap/cnpg-default-monitoring serverside-applied
service/cnpg-webhook-service serverside-applied
deployment.apps/cnpg-controller-manager serverside-applied
mutatingwebhookconfiguration.admissionregistration.k8s.io/cnpg-mutating-webhook-configuration serverside-applied
validatingwebhookconfiguration.admissionregistration.k8s.io/cnpg-validating-webhook-configuration serverside-applied
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment -n cnpg-system cnpg-controller-manager
deployment "cnpg-controller-manager" successfully rolled out

############################################################
##@ CNPG plugin install
############################################################
lemos@ubuntuserverpg:~$ wget https://github.com/cloudnative-pg/cloudnative-pg/releases/download/v1.29.1/kubectl-cnpg_1.29.1_linux_x86_64.deb \
  --output-document kube-plugin.deb
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo dpkg -i kube-plugin.deb
[sudo: authenticate] Password:             
Selecting previously unselected package cnpg.
(Reading database ... 140563 files and directories currently installed.)
Preparing to unpack kube-plugin.deb ...
Unpacking cnpg (1.29.1) ...
Setting up cnpg (1.29.1) ...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg version
Build: {Version:1.29.1 Commit:a4060c152 Date:2026-05-08}

############################################################
##@ Barman cloud plugin install
############################################################
lemos@ubuntuserverpg:~$ sudo apt install golang-go
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o cmctl https://github.com/cert-manager/cmctl/releases/latest/download/cmctl_${OS}_${ARCH}
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ chmod +x cmctl
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo mv cmctl /usr/local/bin
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f \
  https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment \
  -n cnpg-system barman-cloud
deployment "barman-cloud" successfully rolled out

############################################################
##@ Namespace creation
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl create namespace cloudnative-pg
namespace/cloudnative-pg created

############################################################
##@ Minio deployment + Bucket + Object store
############################################################
lemos@ubuntuserverpg:~$ tee minio.yaml << 'EOF'
---
# 1. PersistentVolume — minikube hostPath
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv
  namespace: cloudnative-pg
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data/minio
---
# 2. PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pvc
  namespace: cloudnative-pg
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
# 3. MinIO Secret
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: cloudnative-pg
type: Opaque
stringData:
  rootUser: minioadmin
  rootPassword: minioadmin123
---
# 4. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
  namespace: cloudnative-pg
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      containers:
        - name: minio
          image: quay.io/minio/minio:RELEASE.2025-10-15T17-29-55Z
          args:
            - server
            - /data
            - --console-address
            - ":9001"
          env:
            - name: MINIO_ROOT_USER
              valueFrom:
                secretKeyRef:
                  name: minio-secret
                  key: rootUser
            - name: MINIO_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: minio-secret
                  key: rootPassword
          ports:
            - containerPort: 9000
            - containerPort: 9001
          volumeMounts:
            - name: storage
              mountPath: /data
          readinessProbe:
            httpGet:
              path: /minio/health/ready
              port: 9000
            initialDelaySeconds: 10
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /minio/health/live
              port: 9000
            initialDelaySeconds: 30
            periodSeconds: 30
      volumes:
        - name: storage
          persistentVolumeClaim:
            claimName: minio-pvc
---
# 5. Service — NodePort for minikube
apiVersion: v1
kind: Service
metadata:
  name: minio
  namespace: cloudnative-pg
spec:
  type: NodePort
  selector:
    app: minio
  ports:
    - name: s3-api
      port: 9000
      targetPort: 9000
      nodePort: 30900
    - name: console
      port: 9001
      targetPort: 9001
      nodePort: 30901
---
# 6. CNPG credentials Secret
apiVersion: v1
kind: Secret
metadata:
  name: minio-creds
  namespace: cloudnative-pg
type: Opaque
stringData:
  ACCESS_KEY_ID: minioadmin
  ACCESS_SECRET_KEY: minioadmin123
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f minio.yaml
persistentvolume/minio-pv created
persistentvolumeclaim/minio-pvc created
secret/minio-secret created
deployment.apps/minio created
service/minio created
secret/minio-creds created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment/minio -n cloudnative-pg
Waiting for deployment "minio" rollout to finish: 0 of 1 updated replicas are available...
deployment "minio" successfully rolled out
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment/minio -n cloudnative-pg
deployment "minio" successfully rolled out




lemos@ubuntuserverpg:~$ cat <<EOF > barman-minio-objectstore.yaml
apiVersion: barmancloud.cnpg.io/v1
kind: ObjectStore
metadata:
  name: minio-store
  namespace: cloudnative-pg
spec:
  retentionPolicy: "30d"
  configuration:
    destinationPath: s3://pg-backups/postgresql-cluster
    endpointURL: http://minio.cloudnative-pg.svc.cluster.local:9000
    s3Credentials:
      accessKeyId:
        name: minio-creds
        key: ACCESS_KEY_ID
      secretAccessKey:
        name: minio-creds
        key: ACCESS_SECRET_KEY
    wal:
      compression: gzip
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f barman-minio-objectstore.yaml
objectstore.barmancloud.cnpg.io/minio-store created

############################################################
##@ Prometheus + Grafana deployment + Zone label config
############################################################
lemos@ubuntuserverpg:~$ helm repo add prometheus-community \
  https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ helm upgrade --install \
  -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/docs/src/samples/monitoring/kube-stack-config.yaml \
  prometheus-community \
  prometheus-community/kube-prometheus-stack \
  --namespace cloudnative-pg
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply --namespace cloudnative-pg -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/docs/src/samples/monitoring/prometheusrule.yaml
prometheusrule.monitoring.coreos.com/cnpg-default-alerts created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- label node minikube topology.kubernetes.io/zone=example-zone-1a
node/minikube labeled
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get nodes -L topology.kubernetes.io/zone
NAME       STATUS   ROLES           AGE   VERSION   ZONE
minikube   Ready    control-plane   43m   v1.35.1   example-zone-1a
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ cat <<EOF > metrics_label.yaml
kube-state-metrics:
  extraArgs:
    - --metric-labels-allowlist=nodes=[topology.kubernetes.io/zone]
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ helm upgrade prometheus-community prometheus-community/kube-prometheus-stack \
  -f metrics_label.yaml \
  --namespace cloudnative-pg \
  --reuse-values
...



############################################################
##@ PostgreSQL cluster creation
############################################################
lemos@ubuntuserverpg:~$ tee postgresql-cluster.yaml << 'EOF'
---
apiVersion: v1
kind: Secret
metadata:
  name: minio-backup-credential
  namespace: cloudnative-pg
type: Opaque
data:
  ACCESS_KEY_ID: bWluaW9hZG1pbg==
  ACCESS_SECRET_KEY: bWluaW9hZG1pbjEyMw==
---
apiVersion: v1
data:
  username: YXBwdGVzdA==
  password: d2VsY29tZTE=
kind: Secret
metadata:
  name: postgresql-cluster-apptest-secret
  namespace: cloudnative-pg
type: kubernetes.io/basic-auth
---
apiVersion: barmancloud.cnpg.io/v1
kind: ObjectStore
metadata:
  name: minio-store
  namespace: cloudnative-pg
spec:
  configuration:
    destinationPath: s3://pg-backups/postgresql-cluster
    endpointURL: http://minio.cloudnative-pg.svc.cluster.local:9000
    s3Credentials:
      accessKeyId:
        name: minio-backup-credential
        key: ACCESS_KEY_ID
      secretAccessKey:
        name: minio-backup-credential
        key: ACCESS_SECRET_KEY
    wal:
      compression: gzip
    data:
      compression: gzip
  retentionPolicy: "30d"
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql-cluster
  namespace: cloudnative-pg
spec:
  instances: 3
  imageName: ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
  env:
    - name: TZ
      value: America/Sao_Paulo
  storage:
    storageClass: csi-hostpath-sc
    size: 10Gi
  walStorage:
    storageClass: csi-hostpath-sc
    size: 5Gi
  resources:
    requests:
      cpu: "300m"
      memory: "512Mi"
    limits:
      cpu: "1000m"
      memory: "1024Mi"

  managed:
    roles:
      - name: apptest
        ensure: present
        login: true
        superuser: false
        createdb: false
        createrole: false
        inherit: true
        passwordSecret:
          name: postgresql-cluster-apptest-secret

  bootstrap:
    initdb:
      dataChecksums: true

  postgresql:
    parameters:
      pg_stat_statements.max: "10000"
      pg_stat_statements.track: "all"
      timezone: "America/Sao_Paulo"

  plugins:
    - name: barman-cloud.cloudnative-pg.io
      isWALArchiver: true
      parameters:
        barmanObjectName: minio-store
---
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
  name: postgresql-cluster-dbtest
  namespace: cloudnative-pg
spec:
  name: dbtest
  owner: apptest
  cluster:
    name: postgresql-cluster
  extensions:
    - name: pg_stat_statements
      ensure: present
---
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: postgresql-cluster
  namespace: cloudnative-pg
spec:
  selector:
    matchLabels:
      cnpg.io/cluster: postgresql-cluster
  podMetricsEndpoints:
  - port: metrics
---
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: cnpg-controller-manager
  namespace: cnpg-system
spec:
  namespaceSelector:
    matchNames:
      - cnpg-system
  selector:
    matchLabels:
      app.kubernetes.io/name: cloudnative-pg
  podMetricsEndpoints:
    - port: metrics
      path: /metrics
---
apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: postgresql-cluster-pooler-rw
  namespace: cloudnative-pg
spec:
  cluster:
    name: postgresql-cluster
  instances: 2
  type: rw
  pgbouncer:
    poolMode: session
    parameters:
      max_client_conn: "1000"
      default_pool_size: "10"
  serviceTemplate:
    metadata:
      name: postgresql-cluster-pooler-rw-lb
    spec:
      type: LoadBalancer
---
apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: postgresql-cluster-pooler-ro
  namespace: cloudnative-pg
spec:
  cluster:
    name: postgresql-cluster
  instances: 2
  type: ro
  pgbouncer:
    poolMode: session
    parameters:
      max_client_conn: "1000"
      default_pool_size: "10"
  serviceTemplate:
    metadata:
      name: postgresql-cluster-pooler-ro-lb
    spec:
      type: LoadBalancer
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f postgresql-cluster.yaml
secret/minio-backup-credential created
secret/postgresql-cluster-apptest-secret created
objectstore.barmancloud.cnpg.io/minio-store configured
cluster.postgresql.cnpg.io/postgresql-cluster created
database.postgresql.cnpg.io/postgresql-cluster-dbtest created
podmonitor.monitoring.coreos.com/postgresql-cluster created
podmonitor.monitoring.coreos.com/cnpg-controller-manager created
pooler.postgresql.cnpg.io/postgresql-cluster-pooler-rw created
pooler.postgresql.cnpg.io/postgresql-cluster-pooler-ro created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster -n cloudnative-pg
NAME                 AGE     INSTANCES   READY   STATUS                     PRIMARY
postgresql-cluster   6m14s   3           3       Cluster in healthy state   postgresql-cluster-1
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get pods -n cloudnative-pg
NAME                                                      READY   STATUS    RESTARTS   AGE
alertmanager-prometheus-community-kube-alertmanager-0     2/2     Running   0          91m
minio-5f5f6747fc-h7zcf                                    1/1     Running   0          97m
postgresql-cluster-1                                      2/2     Running   0          5m26s
postgresql-cluster-2                                      2/2     Running   0          101s
postgresql-cluster-3                                      2/2     Running   0          49s
postgresql-cluster-pooler-ro-77bcdf6bb7-2wpd9             1/1     Running   0          6m12s
postgresql-cluster-pooler-ro-77bcdf6bb7-jt525             1/1     Running   0          6m12s
postgresql-cluster-pooler-rw-9864695f-vd7hj               1/1     Running   0          6m12s
postgresql-cluster-pooler-rw-9864695f-xfx5d               1/1     Running   0          6m12s
prometheus-community-grafana-f58fbb89c-fbfb6              3/3     Running   0          92m
prometheus-community-kube-operator-659758d864-5sx2w       1/1     Running   0          92m
prometheus-community-kube-state-metrics-f958c4957-54t5h   1/1     Running   0          90m
prometheus-prometheus-community-kube-prometheus-0         2/2     Running   0          91m
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get services -n cloudnative-pg
NAME                                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE
alertmanager-operated                     ClusterIP      None             <none>        9093/TCP,9094/TCP,9094/UDP      93m
minio                                     NodePort       10.102.7.248     <none>        9000:30900/TCP,9001:30901/TCP   99m
postgresql-cluster-pooler-ro              LoadBalancer   10.104.131.5     <pending>     5432:31968/TCP                  7m31s
postgresql-cluster-pooler-rw              LoadBalancer   10.110.23.160    <pending>     5432:32252/TCP                  7m31s
postgresql-cluster-r                      ClusterIP      10.107.215.244   <none>        5432/TCP                        7m35s
postgresql-cluster-ro                     ClusterIP      10.97.117.130    <none>        5432/TCP                        7m35s
postgresql-cluster-rw                     ClusterIP      10.111.73.215    <none>        5432/TCP                        7m35s
prometheus-community-grafana              ClusterIP      10.105.67.157    <none>        80/TCP                          93m
prometheus-community-kube-alertmanager    ClusterIP      10.99.18.55      <none>        9093/TCP,8080/TCP               93m
prometheus-community-kube-operator        ClusterIP      10.104.28.46     <none>        443/TCP                         93m
prometheus-community-kube-prometheus      ClusterIP      10.110.38.206    <none>        9090/TCP,8080/TCP               93m
prometheus-community-kube-state-metrics   ClusterIP      10.102.124.202   <none>        8080/TCP                        93m
prometheus-operated                       ClusterIP      None             <none>        9090/TCP                        93m
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get pvc -n cloudnative-pg
NAME                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
minio-pvc                  Bound    pvc-ea5104fb-1a58-419c-8bf9-3324eee4970b   10Gi       RWO            standard          <unset>                 99m
postgresql-cluster-1       Bound    pvc-202c750c-415c-42a7-a358-1510d8515cc2   10Gi       RWO            csi-hostpath-sc   <unset>                 8m9s
postgresql-cluster-1-wal   Bound    pvc-8a8aa2ba-88ed-4fa4-a785-a8781be2fed6   5Gi        RWO            csi-hostpath-sc   <unset>                 8m9s
postgresql-cluster-2       Bound    pvc-6682e7bf-6a5f-4de1-8b42-5ec6d39335b3   10Gi       RWO            csi-hostpath-sc   <unset>                 6m38s
postgresql-cluster-2-wal   Bound    pvc-a8ec8f7e-a831-4aa0-890b-f0dda41cac9d   5Gi        RWO            csi-hostpath-sc   <unset>                 6m38s
postgresql-cluster-3       Bound    pvc-91619487-13f2-41db-8715-aeebe7209896   10Gi       RWO            csi-hostpath-sc   <unset>                 3m14s
postgresql-cluster-3-wal   Bound    pvc-f7728ef4-af2e-4d06-af6c-dc2c8858aa95   5Gi        RWO            csi-hostpath-sc   <unset>                 3m14s
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get secrets -n cloudnative-pg
NAME                                                                                 TYPE                       DATA   AGE
alertmanager-prometheus-community-kube-alertmanager                                  Opaque                     1      95m
alertmanager-prometheus-community-kube-alertmanager-cluster-tls-config               Opaque                     1      94m
alertmanager-prometheus-community-kube-alertmanager-generated                        Opaque                     1      94m
alertmanager-prometheus-community-kube-alertmanager-tls-assets-0                     Opaque                     0      94m
alertmanager-prometheus-community-kube-alertmanager-web-config                       Opaque                     1      94m
minio-backup-credential                                                              Opaque                     2      9m30s
minio-creds                                                                          Opaque                     2      100m
minio-secret                                                                         Opaque                     2      100m
postgresql-cluster-app                                                               kubernetes.io/basic-auth   11     9m27s
postgresql-cluster-apptest-secret                                                    kubernetes.io/basic-auth   2      9m30s
postgresql-cluster-ca                                                                Opaque                     2      9m27s
postgresql-cluster-pooler                                                            kubernetes.io/tls          2      9m24s
postgresql-cluster-replication                                                       kubernetes.io/tls          2      9m27s
postgresql-cluster-server                                                            kubernetes.io/tls          2      9m27s
prometheus-community-grafana                                                         Opaque                     3      95m
prometheus-community-kube-admission                                                  Opaque                     3      95m
prometheus-prometheus-community-kube-prometheus                                      Opaque                     1      94m
prometheus-prometheus-community-kube-prometheus-thanos-prometheus-http-client-file   Opaque                     1      94m
prometheus-prometheus-community-kube-prometheus-tls-assets-0                         Opaque                     1      94m
prometheus-prometheus-community-kube-prometheus-web-config                           Opaque                     1      94m
sh.helm.release.v1.prometheus-community.v1                                           helm.sh/release.v1         1      95m
sh.helm.release.v1.prometheus-community.v2                                           helm.sh/release.v1         1      93m
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ MINIO_USER_NAME=minioadmin
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ MINIO_USER_PASSWORD=minioadmin123
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc \
  -n cloudnative-pg \
  --rm -it \
  --restart=Never \
  --image=minio/mc \
  --quiet \
  --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz

############################################################
##@ Scheduled backup configuration
############################################################
lemos@ubuntuserverpg:~$ cat <<EOF > scheduled_backup.yaml
apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: postgresql-cluster-sched-bkp
  namespace: cloudnative-pg
spec:
  schedule: "0 0 0 * * *"
  backupOwnerReference: self
  immediate: true
  method: plugin
  pluginConfiguration:
    name: barman-cloud.cloudnative-pg.io
  cluster:
    name: postgresql-cluster
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f scheduled_backup.yaml
scheduledbackup.postgresql.cnpg.io/postgresql-cluster-sched-bkp created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get backup -n cloudnative-pg -l cnpg.io/cluster=postgresql-cluster
NAME                                          AGE   CLUSTER              METHOD   PHASE       ERROR
postgresql-cluster-sched-bkp-20260528182802   46s   postgresql-cluster   plugin   completed   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- describe scheduledbackup postgresql-cluster-sched-bkp -n cloudnative-pg
Name:         postgresql-cluster-sched-bkp
Namespace:    cloudnative-pg
Labels:       <none>
Annotations:  <none>
API Version:  postgresql.cnpg.io/v1
Kind:         ScheduledBackup
Metadata:
  Creation Timestamp:  2026-05-28T18:28:02Z
  Generation:          1
  Resource Version:    18922
  UID:                 bb9abc28-f873-471b-952c-767e341505bc
Spec:
  Backup Owner Reference:  self
  Cluster:
    Name:     postgresql-cluster
  Immediate:  true
  Method:     plugin
  Plugin Configuration:
    Name:    barman-cloud.cloudnative-pg.io
  Schedule:  0 0 0 * * *
Status:
  Last Check Time:     2026-05-28T18:28:02Z
  Last Schedule Time:  2026-05-28T18:28:02Z
  Next Schedule Time:  2026-05-29T00:00:00Z
Events:
  Type    Reason          Age   From                            Message
  ----    ------          ----  ----                            -------
  Normal  BackupSchedule  60s   cloudnative-pg-scheduledbackup  Scheduled immediate backup now: 2026-05-28 18:28:02.344564687 +0000 UTC m=+7070.041333963
  Normal  BackupSchedule  60s   cloudnative-pg-scheduledbackup  Next backup scheduled by 2026-05-29 00:00:00 +0000 UTC
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc \
  -n cloudnative-pg \
  --rm -it \
  --restart=Never \
  --image=minio/mc \
  --quiet \
  --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-28 18:28:10 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/data.tar.gz
[2026-05-28 18:28:10 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/backup.info
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz

############################################################
##@ Backup on-demand
############################################################
lemos@ubuntuserverpg:~$ cat <<EOF > backup_on-demand.yaml
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
  name: backup-on-demand
  namespace: cloudnative-pg
spec:
  method: plugin
  pluginConfiguration:
    name: barman-cloud.cloudnative-pg.io
  cluster:
    name: postgresql-cluster
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f backup_on-demand.yaml
backup.postgresql.cnpg.io/backup-on-demand created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- describe backup backup-on-demand -n cloudnative-pg
Name:         backup-on-demand
Namespace:    cloudnative-pg
Labels:       <none>
Annotations:  <none>
API Version:  postgresql.cnpg.io/v1
Kind:         Backup
Metadata:
  Creation Timestamp:  2026-05-28T18:31:58Z
  Generation:          1
  Resource Version:    19521
  UID:                 789ffdc6-73c0-40ed-b607-43dd7685bfe2
Spec:
  Cluster:
    Name:  postgresql-cluster
  Method:  plugin
  Plugin Configuration:
    Name:  barman-cloud.cloudnative-pg.io
Status:
  Backup Id:    20260528T153159
  Backup Name:  backup-20260528153158
  Begin Lsn:    0/6000060
  Begin Wal:    000000010000000000000006
  End Lsn:      0/7000000
  End Wal:      000000010000000000000007
  Instance Id:
    Container Id:  containerd://f7bb99c13ca48d583fb55cca188c9d6139923f6a61241c0b8afaf464b45b68ca
    Pod Name:      postgresql-cluster-2
    Session Id:    5cec8154-b588-4e4e-838f-1451e686b1a3
  Major Version:   18
  Method:          plugin
  Online:          true
  Phase:           completed
  Plugin Metadata:
    Cluster UID:                 b61efa19-9442-401d-aa01-7485e8bb0926
    Display Name:                BarmanCloudInstance
    Name:                        barman-cloud.cloudnative-pg.io
    Plugin Name:                 barman-cloud.cloudnative-pg.io
    Timeline:                    1
    Version:                     0.12.0
  Reconciliation Started At:     2026-05-28T18:31:58Z
  Reconciliation Terminated At:  2026-05-28T18:32:06Z
  Started At:                    2026-05-28T18:31:59Z
  Stopped At:                    2026-05-28T18:32:04Z
Events:
  Type    Reason     Age   From                   Message
  ----    ------     ----  ----                   -------
  Normal  Starting   9s    cloudnative-pg-backup  Starting backup for cluster postgresql-cluster
  Normal  Starting   9s    local-webserver        Backup started
  Normal  Completed  1s    local-webserver        Backup completed
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get backup -n cloudnative-pg
NAME                                          AGE     CLUSTER              METHOD   PHASE       ERROR
backup-on-demand                              83s     postgresql-cluster   plugin   completed   
postgresql-cluster-sched-bkp-20260528182802   5m19s   postgresql-cluster   plugin   completed   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc \
  -n cloudnative-pg \
  --rm -it \
  --restart=Never \
  --image=minio/mc \
  --quiet \
  --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-28 18:32:04 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/data.tar.gz
[2026-05-28 18:32:04 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/backup.info
[2026-05-28 18:28:10 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/data.tar.gz
[2026-05-28 18:28:10 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/backup.info
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz

############################################################
##@ Manual switchover
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-1
Primary promotion time:  2026-05-28 15:17:23 -0300 -03 (21m59s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    136M
Current Write LSN:       0/7000000 (Timeline: 1 - WAL File: 000000010000000000000007)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000010000000000000006   @   2026-05-28T15:26:23.510593-03:00
Last Failed WAL:                -

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-2  0/7000000  0/7000000  0/7000000  0/7000000   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/7000000  0/7000000  0/7000000  0/7000000   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-1  0/7000000    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-2  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION

lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-1  0/7000000    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-2  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg promote postgresql-cluster postgresql-cluster-2 -n cloudnative-pg
{"level":"info","ts":"2026-05-28T15:41:12.924590897-03:00","msg":"Cluster has become unhealthy"}
Node postgresql-cluster-2 in cluster postgresql-cluster will be promoted
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-2
Primary promotion time:  2026-05-28 15:41:18 -0300 -03 (13s)
Status:                  Switchover in progress Switching over to postgresql-cluster-2
Instances:               3
Ready instances:         2
Size:                    152M
Current Write LSN:       0/80055A0 (Timeline: 2 - WAL File: 000000020000000000000008)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000010000000000000008.partial   @   2026-05-28T15:41:20.346773-03:00
Last Failed WAL:                00000002.history                   @   2026-05-28T15:41:17.76251-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-3  0/80055A0  0/80055A0  0/80055A0  0/80055A0   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status         QoS        Manager Version  Node
----                  -----------  ----------------  ------         ---        ---------------  ----
postgresql-cluster-2  0/80055A0    Primary           OK             Burstable  1.29.1           minikube
postgresql-cluster-3  0/80055A0    Standby (async)   OK             Burstable  1.29.1           minikube
postgresql-cluster-1  -            -                 InternalError  Burstable  -                minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION


Error(s) extracting status
-----------------------------------
failed to get status by proxying to the pod, you might lack permissions to get pods/proxy: an error on the server ("failed to connect to `user=postgres database=postgres`: /controller/run/.s.PGSQL.5432 (/controller/run): server error: FATAL: the database system is starting up (SQLSTATE 57P03)") has prevented the request from succeeding (get pods https:postgresql-cluster-1:8000)
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-2
Primary promotion time:  2026-05-28 15:41:18 -0300 -03 (48s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    152M
Current Write LSN:       0/80055D8 (Timeline: 2 - WAL File: 000000020000000000000008)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000010000000000000008.partial   @   2026-05-28T15:41:20.346773-03:00
Last Failed WAL:                00000002.history                   @   2026-05-28T15:41:17.76251-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-1  0/80055D8  0/80055D8  0/80055D8  0/80055D8   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/80055D8  0/80055D8  0/80055D8  0/80055D8   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/80055D8    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/80055D8    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-2
Primary promotion time:  2026-05-28 15:41:18 -0300 -03 (7m12s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    168M
Current Write LSN:       0/9000110 (Timeline: 2 - WAL File: 000000020000000000000009)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000020000000000000008   @   2026-05-28T15:46:18.871402-03:00
Last Failed WAL:                00000002.history           @   2026-05-28T15:41:17.76251-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-1  0/9000110  0/9000110  0/9000110  0/9000110   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/9000110  0/9000110  0/9000110  0/9000110   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/9000110    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION

############################################################
##@ Automatic failover triggered by pod deletion
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/9000110    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- delete pod postgresql-cluster-2 -n cloudnative-pg
pod "postgresql-cluster-2" deleted from cloudnative-pg namespace
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status         QoS        Manager Version  Node
----                  -----------  ----------------  ------         ---        ---------------  ----
postgresql-cluster-1  0/A005060    Primary           OK             Burstable  1.29.1           minikube
postgresql-cluster-3  0/A005060    Standby (async)   OK             Burstable  1.29.1           minikube
postgresql-cluster-2  -            -                 InternalError  Burstable  -                minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/9000110    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-1
Primary promotion time:  2026-05-28 15:48:43 -0300 -03 (29s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    232M
Current Write LSN:       0/A005060 (Timeline: 3 - WAL File: 00000003000000000000000A)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              00000002000000000000000A.partial   @   2026-05-28T15:48:46.35119-03:00
Last Failed WAL:                00000003.history                   @   2026-05-28T15:48:43.328507-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-2  0/A005060  0/A005060  0/A005060  0/A005060   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/A005060  0/A005060  0/A005060  0/A005060   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-1  0/A005060    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-2  0/A005060    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/A005060    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION

############################################################
##@ Backup recovery - New cluster bootstrap initialization
############################################################
lemos@ubuntuserverpg:~$ tee simulate_data_loss.sh << 'EOF'
#!/bin/bash
# =============================================================================
# cloudnative-pg Test Script
# Cluster     : postgresql-cluster
# Namespace   : cloudnative-pg
#
# Connects as the internal postgres superuser directly inside the primary pod
# via peer authentication (no password required).
# No PgBouncer, no temp pod needed.
# =============================================================================

set -euo pipefail

NAMESPACE="cloudnative-pg"
CLUSTER="postgresql-cluster"
DB_NAME="dbtest"

# ---------------------------------------------------------------------------
# Identify the primary pod
# ---------------------------------------------------------------------------
echo "==> Finding primary pod..."
PRIMARY_POD=$(minikube kubectl -- get pods -n "$NAMESPACE" \
  -l "cnpg.io/cluster=${CLUSTER},cnpg.io/instanceRole=primary" \
  -o jsonpath='{.items[0].metadata.name}')

if [[ -z "$PRIMARY_POD" ]]; then
  echo "ERROR: Could not find a primary pod for cluster '${CLUSTER}' in namespace '${NAMESPACE}'."
  exit 1
fi
echo "    Primary pod: ${PRIMARY_POD}"

# ---------------------------------------------------------------------------
# Helper: run SQL as postgres superuser via peer auth inside the primary pod
# ---------------------------------------------------------------------------
run_sql() {
  local sql="$1"
  minikube kubectl -- exec "$PRIMARY_POD" -n "$NAMESPACE" -c postgres -- \
    psql -U postgres -d "$DB_NAME" -At -c "$sql"
}

# ---------------------------------------------------------------------------
# 1) Create table and insert rows
# ---------------------------------------------------------------------------
echo ""
echo "==> [1] Creating table test_table and inserting rows..."
run_sql "DROP TABLE IF EXISTS test_table;"
run_sql "CREATE TABLE test_table (id INT PRIMARY KEY, data TEXT);"
run_sql "INSERT INTO test_table (id, data) VALUES (1, 'teste1'), (2, 'teste2');"
echo "    Rows inserted:"
run_sql "SELECT * FROM test_table ORDER BY id;"

# ---------------------------------------------------------------------------
# 2) Capture timestamp before deletion
# ---------------------------------------------------------------------------
echo ""
echo "==> [2] Capturing timestamp before deleting row id=2..."
PRE_DELETE_TIMESTAMP=$(run_sql "SELECT now();")
echo "    Pre-delete timestamp: $PRE_DELETE_TIMESTAMP"

# ---------------------------------------------------------------------------
# 3) Delete row with id=2
# ---------------------------------------------------------------------------
echo ""
echo "==> [3] Deleting row with id=2..."
run_sql "DELETE FROM test_table WHERE id = 2;"
echo "    Remaining rows:"
run_sql "SELECT * FROM test_table ORDER BY id;"

# ---------------------------------------------------------------------------
# 4) Get current WAL LSN and its file name
# ---------------------------------------------------------------------------
echo ""
echo "==> [4] Current WAL LSN and file name..."
WAL_LSN=$(run_sql "SELECT pg_current_wal_lsn();")
WAL_LSN_FILE=$(run_sql "SELECT pg_walfile_name(pg_current_wal_lsn());")
echo "    WAL LSN      : $WAL_LSN"
echo "    WAL LSN file : $WAL_LSN_FILE"

# ---------------------------------------------------------------------------
# 5) Get current timestamp
# ---------------------------------------------------------------------------
echo ""
echo "==> [5] Current database timestamp..."
DB_TIMESTAMP=$(run_sql "SELECT now();")
echo "    Timestamp: $DB_TIMESTAMP"

# ---------------------------------------------------------------------------
# 6) Delete record with id=2 (idempotent)
# ---------------------------------------------------------------------------
echo ""
echo "==> [6] Ensuring row id=2 is deleted (idempotent)..."
run_sql "DELETE FROM test_table WHERE id = 2;"
echo "    Done."

# ---------------------------------------------------------------------------
# 7) Switch WAL file
# ---------------------------------------------------------------------------
echo ""
echo "==> [7] Switching WAL file..."
SWITCHED_LSN=$(run_sql "SELECT pg_switch_wal();")
echo "    Switched at LSN: $SWITCHED_LSN"

# ---------------------------------------------------------------------------
# 8) Get current WAL file name
# ---------------------------------------------------------------------------
echo ""
echo "==> [8] Current WAL file name..."
WAL_FILE=$(run_sql "SELECT pg_walfile_name(pg_current_wal_lsn());")
echo "    WAL file: $WAL_FILE"

# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
echo ""
echo "====================================================="
echo " Summary"
echo "====================================================="
echo ""
echo "  [1] Created table test_table, inserted rows (1,teste1) and (2,teste2)"
echo "  [2] Pre-delete timestamp : $PRE_DELETE_TIMESTAMP"
echo "  [3] Deleted row id=2"
echo "  [4] WAL LSN              : $WAL_LSN"
echo "  [4] WAL LSN file         : $WAL_LSN_FILE"
echo "  [5] Post-WAL timestamp   : $DB_TIMESTAMP"
echo "  [6] Confirmed row id=2 deleted (idempotent)"
echo "  [7] Switched WAL         : $SWITCHED_LSN"
echo "  [8] WAL file             : $WAL_FILE"
echo "====================================================="
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ chmod u+x simulate_data_loss.sh
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ ./simulate_data_loss.sh
...
=====================================================
 Summary
=====================================================

  [1] Created table test_table, inserted rows (1,teste1) and (2,teste2)
  [2] Pre-delete timestamp : 2026-05-29 09:19:48.250085-03
  [3] Deleted row id=2
  [4] WAL LSN              : 0/F026BC8
  [4] WAL LSN file         : 00000003000000000000000F
  [5] Post-WAL timestamp   : 2026-05-29 09:19:49.646057-03
  [6] Confirmed row id=2 deleted (idempotent)
  [7] Switched WAL         : 0/F026BE0
  [8] WAL file             : 000000030000000000000010
=====================================================
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc   -n cloudnative-pg   --rm -it   --restart=Never   --image=minio/mc   --quiet   --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-29 12:19:50 UTC]  55KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000F.gz
[2026-05-29 12:17:16 UTC]  18KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000E.gz
[2026-05-29 12:12:54 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260529T091248/data.tar.gz
[2026-05-29 12:12:54 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260529T091248/backup.info
[2026-05-28 19:29:29 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000D.gz
[2026-05-28 19:24:28 UTC]  22KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000C.gz
[2026-05-28 18:56:52 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000B.gz
[2026-05-28 18:51:52 UTC]  54KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000A.gz
[2026-05-28 18:48:46 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000200000000/00000002000000000000000A.partial.gz
[2026-05-28 18:48:45 UTC]    67B STANDARD postgresql-cluster/postgresql-cluster/wals/00000003.history.gz
[2026-05-28 18:48:40 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000200000000/000000020000000000000009.gz
[2026-05-28 18:46:18 UTC]  19KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000200000000/000000020000000000000008.gz
[2026-05-28 18:41:20 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000008.partial.gz
[2026-05-28 18:41:19 UTC]    59B STANDARD postgresql-cluster/postgresql-cluster/wals/00000002.history.gz
[2026-05-28 18:41:13 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000007.gz
[2026-05-28 18:32:04 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/data.tar.gz
[2026-05-28 18:32:04 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/backup.info
[2026-05-28 18:28:10 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/data.tar.gz
[2026-05-28 18:28:10 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/backup.info
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ tee postgresql-cluster-recovery.yaml << 'EOF'
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql-cluster-recovery
  namespace: cloudnative-pg
spec:
  instances: 1
  imageName: ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie

  env:
    - name: TZ
      value: America/Sao_Paulo

  storage:
    storageClass: csi-hostpath-sc
    size: 10Gi
  walStorage:
    storageClass: csi-hostpath-sc
    size: 5Gi

  resources:
    requests:
      cpu: "300m"
      memory: "512Mi"
    limits:
      cpu: "1000m"
      memory: "1024Mi"

  managed:
    roles:
      - name: apptest
        ensure: present
        login: true
        superuser: false
        createdb: false
        createrole: false
        inherit: true
        passwordSecret:
          name: postgresql-cluster-apptest-secret

  bootstrap:
    recovery:
      source: minio-store-source
      recoveryTarget:
        targetTime: "2026-05-29 09:19:48.250085-03:00"
        exclusive: false

  externalClusters:
    - name: minio-store-source
      plugin:
        name: barman-cloud.cloudnative-pg.io
        parameters:
          barmanObjectName: minio-store
          serverName: postgresql-cluster  # folder name inside the bucket

  postgresql:
    parameters:
      pg_stat_statements.max: "10000"
      pg_stat_statements.track: "all"
      timezone: "America/Sao_Paulo"

  plugins:
    - name: barman-cloud.cloudnative-pg.io
      isWALArchiver: false
      parameters:
        barmanObjectName: minio-store
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f postgresql-cluster-recovery.yaml
cluster.postgresql.cnpg.io/postgresql-cluster-recovery created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster-recovery -n cloudnative-pg
NAME                          AGE   INSTANCES   READY   STATUS               PRIMARY
postgresql-cluster-recovery   5s    1                   Setting up primary   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get events -n cloudnative-pg --field-selector involvedObject.name=postgresql-cluster-recovery --sort-by='.lastTimestamp'
LAST SEEN   TYPE     REASON                        OBJECT                                MESSAGE
39s         Normal   CreatingPodDisruptionBudget   cluster/postgresql-cluster-recovery   Creating PodDisruptionBudget postgresql-cluster-recovery-primary
39s         Normal   CreatingServiceAccount        cluster/postgresql-cluster-recovery   Creating ServiceAccount
39s         Normal   CreatingRole                  cluster/postgresql-cluster-recovery   Creating Cluster Role
39s         Normal   CreatingInstance              cluster/postgresql-cluster-recovery   Primary instance (from backup)
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster-recovery -n cloudnative-pg
NAME                          AGE   INSTANCES   READY   STATUS                                       PRIMARY
postgresql-cluster-recovery   68s   1                   Waiting for the instances to become active   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster-recovery -n cloudnative-pg
NAME                          AGE    INSTANCES   READY   STATUS                     PRIMARY
postgresql-cluster-recovery   114s   1           1       Cluster in healthy state   postgresql-cluster-recovery-1
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- logs -n cloudnative-pg -l cnpg.io/cluster=postgresql-cluster-recovery -l role=primary -f
Defaulted container "postgres" out of: postgres, bootstrap-controller (init), plugin-barman-cloud (init)
Defaulted container "postgres" out of: postgres, bootstrap-controller (init), plugin-barman-cloud (init)
{"level":"info","ts":"2026-05-29T09:12:15.268113766-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.264 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"2","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"starting PostgreSQL 18.3 (Debian 18.3-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.268127554-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.265 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"3","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv4 address \"0.0.0.0\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.268148234-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.265 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"4","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv6 address \"::\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.274294275-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.273 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"5","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on Unix socket \"/controller/run/.s.PGSQL.5432\"","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.291311594-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.290 -03","process_id":"29","session_id":"6a19829f.1d","session_line_num":"1","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system was shut down at 2026-05-28 16:38:19 -03","backend_type":"startup","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.316622419-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.316 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"6","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system is ready to accept connections","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:17:15.339584768-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:17:15.339 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"1","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint starting: time","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.974594484-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.973 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"1","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"ending log output to stderr","hint":"Future log output will go to log destination \"csvlog\".","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.974929768-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.973 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"2","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"starting PostgreSQL 18.3 (Debian 18.3-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.97494521-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.974 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"3","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv4 address \"0.0.0.0\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.974955861-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.974 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"4","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv6 address \"::\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.977058246-03:00","msg":"Instance is still down, will retry in 1 second","logger":"instance-manager","logging_pod":"postgresql-cluster-recovery-1","controller":"instance-cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"postgresql-cluster-recovery","namespace":"cloudnative-pg"},"namespace":"cloudnative-pg","name":"postgresql-cluster-recovery","reconcileID":"f5a27391-336d-4f44-a3ae-0a5029e7b8e7","instance":"postgresql-cluster-recovery-1","cluster":"postgresql-cluster-recovery","namespace":"cloudnative-pg","logging_pod":"postgresql-cluster-recovery-1"}
{"level":"info","ts":"2026-05-29T09:17:15.630662491-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:17:15.630 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"2","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint complete: wrote 1 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.134 s, sync=0.027 s, total=0.292 s; sync files=3, longest=0.016 s, average=0.009 s; distance=4 kB, estimate=4 kB; lsn=0/F000060, redo lsn=0/E001260","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:22:15.663349127-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:22:15.663 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"3","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint starting: time","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:22:18.944349544-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:22:18.942 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"4","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint complete: wrote 31 buffers (0.2%), wrote 1 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=3.136 s, sync=0.110 s, total=3.280 s; sync files=28, longest=0.031 s, average=0.004 s; distance=32763 kB, estimate=32763 kB; lsn=0/100000B8, redo lsn=0/10000060","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.982713322-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.982 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"5","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on Unix socket \"/controller/run/.s.PGSQL.5432\"","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.992201871-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.992 -03","process_id":"29","session_id":"6a199049.1d","session_line_num":"1","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system was shut down at 2026-05-29 10:10:11 -03","backend_type":"startup","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:34.004906246-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:34.004 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"6","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system is ready to accept connections","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:34.990329119-03:00","msg":"Triggered a managed role reconciliation","logger":"instance-manager","logging_pod":"postgresql-cluster-recovery-1","controller":"instance-cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"postgresql-cluster-recovery","namespace":"cloudnative-pg"},"namespace":"cloudnative-pg","name":"postgresql-cluster-recovery","reconcileID":"90688aec-ee3a-4091-bb07-e21bc0854dc6","logging_pod":"postgresql-cluster-recovery-1"}
{"level":"info","ts":"2026-05-29T10:10:35.672782192-03:00","msg":"Triggered a managed role reconciliation","logger":"instance-manager","logging_pod":"postgresql-cluster-recovery-1","controller":"instance-cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"postgresql-cluster-recovery","namespace":"cloudnative-pg"},"namespace":"cloudnative-pg","name":"postgresql-cluster-recovery","reconcileID":"ab0b12ce-26bf-4987-a2ed-dbb88f9f4163","ogging_pod":"postgresql-cluster-recovery-1"}
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ tee select_table.sh << 'EOF'
#!/bin/bash
# =============================================================================
# cloudnative-pg - Check test_table content
# Cluster     : postgresql-cluster
# Namespace   : cloudnative-pg
# =============================================================================

set -euo pipefail

NAMESPACE="cloudnative-pg"
CLUSTER="postgresql-cluster-recovery"
DB_NAME="dbtest"

# ---------------------------------------------------------------------------
# Identify the primary pod
# ---------------------------------------------------------------------------
echo "==> Finding primary pod..."
PRIMARY_POD=$(minikube kubectl -- get pods -n "$NAMESPACE" \
  -l "cnpg.io/cluster=${CLUSTER},cnpg.io/instanceRole=primary" \
  -o jsonpath='{.items[0].metadata.name}')

if [[ -z "$PRIMARY_POD" ]]; then
  echo "ERROR: Could not find a primary pod for cluster '${CLUSTE}' in namespace '${NAMESPACE}'."
  exit 1
fi
echo "    Primary pod: ${PRIMARY_POD}"

# ---------------------------------------------------------------------------
# Select test_table content
# ---------------------------------------------------------------------------
echo ""
echo "==> Selecting content from test_table..."
minikube kubectl -- exec "$PRIMARY_POD" -n "$NAMESPACE" -c postgres -- \
  psql -U postgres -d "$DB_NAME" -c "SELECT * FROM test_table ORDER BY id;"
EOF
...

############################################################
##@ Prometheus + Grafana monitoring
############################################################
lemos@ubuntuserverpg:~$ curl -O https://raw.githubusercontent.com/cloudnative-pg/grafana-dashboards/main/charts/cluster/grafana-dashboard.json
  % Total    % Received % Xferd  Average Speed  Time    Time    Time   Current
                                 Dload  Upload  Total   Spent   Left   Speed
100 247.1k 100 247.1k   0      0 320.7k      0                              0
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- --namespace cloudnative-pg port-forward svc/prometheus-community-grafana 3000:80 --address 0.0.0.0
Forwarding from 0.0.0.0:3000 -> 3000
Handling connection for 3000##############################################
##@ Podman + Minikube install
############################################################
lemos@ubuntuserverpg:~$ sudo apt install podman podman-compose -y
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ podman --version
podman version 5.7.0
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube version
minikube version: v1.38.1
commit: c93a4cb9311efc66b90d33ea03f75f2c4120e9b0
lemos@ubuntuserverpg:~$ 

############################################################
##@ Minikube start
############################################################
lemos@ubuntuserverpg:~$ minikube config set rootless true
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube start --driver=podman --container-runtime=containerd --kubernetes-version=v1.35.1 --addons=csi-hostpath-driver --addons=volumesnapshots --addons=metrics-server
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get pods -A
...

############################################################
##@ Helm install
############################################################
lemos@ubuntuserverpg:~$ sudo apt-get install curl gpg apt-transport-https --yes
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ curl -fsSL https://packages.buildkite.com/helm-linux/helm-debian/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ echo "deb [signed-by=/usr/share/keyrings/helm.gpg] https://packages.buildkite.com/helm-linux/helm-debian/any/ any main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
deb [signed-by=/usr/share/keyrings/helm.gpg] https://packages.buildkite.com/helm-linux/helm-debian/any/ any main
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo apt-get update
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo apt-get install helm
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ helm version
version.BuildInfo{Version:"v3.20.0", GitCommit:"b2e4314fa0f229a1de7b4c981273f61d69ee5a59", GitTreeState:"clean", GoVersion:"go1.25.6"}

############################################################
##@ CNPG install
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl -- apply --server-side -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.29/releases/cnpg-1.29.1.yaml
namespace/cnpg-system serverside-applied
customresourcedefinition.apiextensions.k8s.io/backups.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/clusterimagecatalogs.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/clusters.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/databases.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/failoverquorums.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/imagecatalogs.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/poolers.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/publications.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/scheduledbackups.postgresql.cnpg.io serverside-applied
customresourcedefinition.apiextensions.k8s.io/subscriptions.postgresql.cnpg.io serverside-applied
serviceaccount/cnpg-manager serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-database-editor-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-database-viewer-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-manager serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-publication-editor-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-publication-viewer-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-subscription-editor-role serverside-applied
clusterrole.rbac.authorization.k8s.io/cnpg-subscription-viewer-role serverside-applied
clusterrolebinding.rbac.authorization.k8s.io/cnpg-manager-rolebinding serverside-applied
configmap/cnpg-default-monitoring serverside-applied
service/cnpg-webhook-service serverside-applied
deployment.apps/cnpg-controller-manager serverside-applied
mutatingwebhookconfiguration.admissionregistration.k8s.io/cnpg-mutating-webhook-configuration serverside-applied
validatingwebhookconfiguration.admissionregistration.k8s.io/cnpg-validating-webhook-configuration serverside-applied
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment -n cnpg-system cnpg-controller-manager
deployment "cnpg-controller-manager" successfully rolled out

############################################################
##@ CNPG plugin install
############################################################
lemos@ubuntuserverpg:~$ wget https://github.com/cloudnative-pg/cloudnative-pg/releases/download/v1.29.1/kubectl-cnpg_1.29.1_linux_x86_64.deb \
  --output-document kube-plugin.deb
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo dpkg -i kube-plugin.deb
[sudo: authenticate] Password:             
Selecting previously unselected package cnpg.
(Reading database ... 140563 files and directories currently installed.)
Preparing to unpack kube-plugin.deb ...
Unpacking cnpg (1.29.1) ...
Setting up cnpg (1.29.1) ...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg version
Build: {Version:1.29.1 Commit:a4060c152 Date:2026-05-08}

############################################################
##@ Barman cloud plugin install
############################################################
lemos@ubuntuserverpg:~$ sudo apt install golang-go
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o cmctl https://github.com/cert-manager/cmctl/releases/latest/download/cmctl_${OS}_${ARCH}
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ chmod +x cmctl
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ sudo mv cmctl /usr/local/bin
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f \
  https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment \
  -n cnpg-system barman-cloud
deployment "barman-cloud" successfully rolled out

############################################################
##@ Namespace creation
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl create namespace cloudnative-pg
namespace/cloudnative-pg created

############################################################
##@ Minio deployment + Bucket + Object store
############################################################
lemos@ubuntuserverpg:~$ tee minio.yaml << 'EOF'
---
# 1. PersistentVolume — minikube hostPath
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-pv
  namespace: cloudnative-pg
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data/minio
---
# 2. PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pvc
  namespace: cloudnative-pg
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
# 3. MinIO Secret
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: cloudnative-pg
type: Opaque
stringData:
  rootUser: minioadmin
  rootPassword: minioadmin123
---
# 4. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
  namespace: cloudnative-pg
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      containers:
        - name: minio
          image: quay.io/minio/minio:RELEASE.2025-10-15T17-29-55Z
          args:
            - server
            - /data
            - --console-address
            - ":9001"
          env:
            - name: MINIO_ROOT_USER
              valueFrom:
                secretKeyRef:
                  name: minio-secret
                  key: rootUser
            - name: MINIO_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: minio-secret
                  key: rootPassword
          ports:
            - containerPort: 9000
            - containerPort: 9001
          volumeMounts:
            - name: storage
              mountPath: /data
          readinessProbe:
            httpGet:
              path: /minio/health/ready
              port: 9000
            initialDelaySeconds: 10
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /minio/health/live
              port: 9000
            initialDelaySeconds: 30
            periodSeconds: 30
      volumes:
        - name: storage
          persistentVolumeClaim:
            claimName: minio-pvc
---
# 5. Service — NodePort for minikube
apiVersion: v1
kind: Service
metadata:
  name: minio
  namespace: cloudnative-pg
spec:
  type: NodePort
  selector:
    app: minio
  ports:
    - name: s3-api
      port: 9000
      targetPort: 9000
      nodePort: 30900
    - name: console
      port: 9001
      targetPort: 9001
      nodePort: 30901
---
# 6. CNPG credentials Secret
apiVersion: v1
kind: Secret
metadata:
  name: minio-creds
  namespace: cloudnative-pg
type: Opaque
stringData:
  ACCESS_KEY_ID: minioadmin
  ACCESS_SECRET_KEY: minioadmin123
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f minio.yaml
persistentvolume/minio-pv created
persistentvolumeclaim/minio-pvc created
secret/minio-secret created
deployment.apps/minio created
service/minio created
secret/minio-creds created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment/minio -n cloudnative-pg
Waiting for deployment "minio" rollout to finish: 0 of 1 updated replicas are available...
deployment "minio" successfully rolled out
lemos@ubuntuserverpg:~$ minikube kubectl -- rollout status deployment/minio -n cloudnative-pg
deployment "minio" successfully rolled out




lemos@ubuntuserverpg:~$ cat <<EOF > barman-minio-objectstore.yaml
apiVersion: barmancloud.cnpg.io/v1
kind: ObjectStore
metadata:
  name: minio-store
  namespace: cloudnative-pg
spec:
  retentionPolicy: "30d"
  configuration:
    destinationPath: s3://pg-backups/postgresql-cluster
    endpointURL: http://minio.cloudnative-pg.svc.cluster.local:9000
    s3Credentials:
      accessKeyId:
        name: minio-creds
        key: ACCESS_KEY_ID
      secretAccessKey:
        name: minio-creds
        key: ACCESS_SECRET_KEY
    wal:
      compression: gzip
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f barman-minio-objectstore.yaml
objectstore.barmancloud.cnpg.io/minio-store created

############################################################
##@ Prometheus + Grafana deployment + Zone label config
############################################################
lemos@ubuntuserverpg:~$ helm repo add prometheus-community \
  https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ helm upgrade --install \
  -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/docs/src/samples/monitoring/kube-stack-config.yaml \
  prometheus-community \
  prometheus-community/kube-prometheus-stack \
  --namespace cloudnative-pg
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply --namespace cloudnative-pg -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/docs/src/samples/monitoring/prometheusrule.yaml
prometheusrule.monitoring.coreos.com/cnpg-default-alerts created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- label node minikube topology.kubernetes.io/zone=example-zone-1a
node/minikube labeled
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get nodes -L topology.kubernetes.io/zone
NAME       STATUS   ROLES           AGE   VERSION   ZONE
minikube   Ready    control-plane   43m   v1.35.1   example-zone-1a
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ cat <<EOF > metrics_label.yaml
kube-state-metrics:
  extraArgs:
    - --metric-labels-allowlist=nodes=[topology.kubernetes.io/zone]
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ helm upgrade prometheus-community prometheus-community/kube-prometheus-stack \
  -f metrics_label.yaml \
  --namespace cloudnative-pg \
  --reuse-values
...



############################################################
##@ PostgreSQL cluster creation
############################################################
lemos@ubuntuserverpg:~$ tee postgresql-cluster.yaml << 'EOF'
---
apiVersion: v1
kind: Secret
metadata:
  name: minio-backup-credential
  namespace: cloudnative-pg
type: Opaque
data:
  ACCESS_KEY_ID: bWluaW9hZG1pbg==
  ACCESS_SECRET_KEY: bWluaW9hZG1pbjEyMw==
---
apiVersion: v1
data:
  username: YXBwdGVzdA==
  password: d2VsY29tZTE=
kind: Secret
metadata:
  name: postgresql-cluster-apptest-secret
  namespace: cloudnative-pg
type: kubernetes.io/basic-auth
---
apiVersion: barmancloud.cnpg.io/v1
kind: ObjectStore
metadata:
  name: minio-store
  namespace: cloudnative-pg
spec:
  configuration:
    destinationPath: s3://pg-backups/postgresql-cluster
    endpointURL: http://minio.cloudnative-pg.svc.cluster.local:9000
    s3Credentials:
      accessKeyId:
        name: minio-backup-credential
        key: ACCESS_KEY_ID
      secretAccessKey:
        name: minio-backup-credential
        key: ACCESS_SECRET_KEY
    wal:
      compression: gzip
    data:
      compression: gzip
  retentionPolicy: "30d"
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql-cluster
  namespace: cloudnative-pg
spec:
  instances: 3
  imageName: ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
  env:
    - name: TZ
      value: America/Sao_Paulo
  storage:
    storageClass: csi-hostpath-sc
    size: 10Gi
  walStorage:
    storageClass: csi-hostpath-sc
    size: 5Gi
  resources:
    requests:
      cpu: "300m"
      memory: "512Mi"
    limits:
      cpu: "1000m"
      memory: "1024Mi"

  managed:
    roles:
      - name: apptest
        ensure: present
        login: true
        superuser: false
        createdb: false
        createrole: false
        inherit: true
        passwordSecret:
          name: postgresql-cluster-apptest-secret

  bootstrap:
    initdb:
      dataChecksums: true

  postgresql:
    parameters:
      pg_stat_statements.max: "10000"
      pg_stat_statements.track: "all"
      timezone: "America/Sao_Paulo"

  plugins:
    - name: barman-cloud.cloudnative-pg.io
      isWALArchiver: true
      parameters:
        barmanObjectName: minio-store
---
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
  name: postgresql-cluster-dbtest
  namespace: cloudnative-pg
spec:
  name: dbtest
  owner: apptest
  cluster:
    name: postgresql-cluster
  extensions:
    - name: pg_stat_statements
      ensure: present
---
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: postgresql-cluster
  namespace: cloudnative-pg
spec:
  selector:
    matchLabels:
      cnpg.io/cluster: postgresql-cluster
  podMetricsEndpoints:
  - port: metrics
---
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: cnpg-controller-manager
  namespace: cnpg-system
spec:
  namespaceSelector:
    matchNames:
      - cnpg-system
  selector:
    matchLabels:
      app.kubernetes.io/name: cloudnative-pg
  podMetricsEndpoints:
    - port: metrics
      path: /metrics
---
apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: postgresql-cluster-pooler-rw
  namespace: cloudnative-pg
spec:
  cluster:
    name: postgresql-cluster
  instances: 2
  type: rw
  pgbouncer:
    poolMode: session
    parameters:
      max_client_conn: "1000"
      default_pool_size: "10"
  serviceTemplate:
    metadata:
      name: postgresql-cluster-pooler-rw-lb
    spec:
      type: LoadBalancer
---
apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: postgresql-cluster-pooler-ro
  namespace: cloudnative-pg
spec:
  cluster:
    name: postgresql-cluster
  instances: 2
  type: ro
  pgbouncer:
    poolMode: session
    parameters:
      max_client_conn: "1000"
      default_pool_size: "10"
  serviceTemplate:
    metadata:
      name: postgresql-cluster-pooler-ro-lb
    spec:
      type: LoadBalancer
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f postgresql-cluster.yaml
secret/minio-backup-credential created
secret/postgresql-cluster-apptest-secret created
objectstore.barmancloud.cnpg.io/minio-store configured
cluster.postgresql.cnpg.io/postgresql-cluster created
database.postgresql.cnpg.io/postgresql-cluster-dbtest created
podmonitor.monitoring.coreos.com/postgresql-cluster created
podmonitor.monitoring.coreos.com/cnpg-controller-manager created
pooler.postgresql.cnpg.io/postgresql-cluster-pooler-rw created
pooler.postgresql.cnpg.io/postgresql-cluster-pooler-ro created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster -n cloudnative-pg
NAME                 AGE     INSTANCES   READY   STATUS                     PRIMARY
postgresql-cluster   6m14s   3           3       Cluster in healthy state   postgresql-cluster-1
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get pods -n cloudnative-pg
NAME                                                      READY   STATUS    RESTARTS   AGE
alertmanager-prometheus-community-kube-alertmanager-0     2/2     Running   0          91m
minio-5f5f6747fc-h7zcf                                    1/1     Running   0          97m
postgresql-cluster-1                                      2/2     Running   0          5m26s
postgresql-cluster-2                                      2/2     Running   0          101s
postgresql-cluster-3                                      2/2     Running   0          49s
postgresql-cluster-pooler-ro-77bcdf6bb7-2wpd9             1/1     Running   0          6m12s
postgresql-cluster-pooler-ro-77bcdf6bb7-jt525             1/1     Running   0          6m12s
postgresql-cluster-pooler-rw-9864695f-vd7hj               1/1     Running   0          6m12s
postgresql-cluster-pooler-rw-9864695f-xfx5d               1/1     Running   0          6m12s
prometheus-community-grafana-f58fbb89c-fbfb6              3/3     Running   0          92m
prometheus-community-kube-operator-659758d864-5sx2w       1/1     Running   0          92m
prometheus-community-kube-state-metrics-f958c4957-54t5h   1/1     Running   0          90m
prometheus-prometheus-community-kube-prometheus-0         2/2     Running   0          91m
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get services -n cloudnative-pg
NAME                                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE
alertmanager-operated                     ClusterIP      None             <none>        9093/TCP,9094/TCP,9094/UDP      93m
minio                                     NodePort       10.102.7.248     <none>        9000:30900/TCP,9001:30901/TCP   99m
postgresql-cluster-pooler-ro              LoadBalancer   10.104.131.5     <pending>     5432:31968/TCP                  7m31s
postgresql-cluster-pooler-rw              LoadBalancer   10.110.23.160    <pending>     5432:32252/TCP                  7m31s
postgresql-cluster-r                      ClusterIP      10.107.215.244   <none>        5432/TCP                        7m35s
postgresql-cluster-ro                     ClusterIP      10.97.117.130    <none>        5432/TCP                        7m35s
postgresql-cluster-rw                     ClusterIP      10.111.73.215    <none>        5432/TCP                        7m35s
prometheus-community-grafana              ClusterIP      10.105.67.157    <none>        80/TCP                          93m
prometheus-community-kube-alertmanager    ClusterIP      10.99.18.55      <none>        9093/TCP,8080/TCP               93m
prometheus-community-kube-operator        ClusterIP      10.104.28.46     <none>        443/TCP                         93m
prometheus-community-kube-prometheus      ClusterIP      10.110.38.206    <none>        9090/TCP,8080/TCP               93m
prometheus-community-kube-state-metrics   ClusterIP      10.102.124.202   <none>        8080/TCP                        93m
prometheus-operated                       ClusterIP      None             <none>        9090/TCP                        93m
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get pvc -n cloudnative-pg
NAME                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
minio-pvc                  Bound    pvc-ea5104fb-1a58-419c-8bf9-3324eee4970b   10Gi       RWO            standard          <unset>                 99m
postgresql-cluster-1       Bound    pvc-202c750c-415c-42a7-a358-1510d8515cc2   10Gi       RWO            csi-hostpath-sc   <unset>                 8m9s
postgresql-cluster-1-wal   Bound    pvc-8a8aa2ba-88ed-4fa4-a785-a8781be2fed6   5Gi        RWO            csi-hostpath-sc   <unset>                 8m9s
postgresql-cluster-2       Bound    pvc-6682e7bf-6a5f-4de1-8b42-5ec6d39335b3   10Gi       RWO            csi-hostpath-sc   <unset>                 6m38s
postgresql-cluster-2-wal   Bound    pvc-a8ec8f7e-a831-4aa0-890b-f0dda41cac9d   5Gi        RWO            csi-hostpath-sc   <unset>                 6m38s
postgresql-cluster-3       Bound    pvc-91619487-13f2-41db-8715-aeebe7209896   10Gi       RWO            csi-hostpath-sc   <unset>                 3m14s
postgresql-cluster-3-wal   Bound    pvc-f7728ef4-af2e-4d06-af6c-dc2c8858aa95   5Gi        RWO            csi-hostpath-sc   <unset>                 3m14s
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get secrets -n cloudnative-pg
NAME                                                                                 TYPE                       DATA   AGE
alertmanager-prometheus-community-kube-alertmanager                                  Opaque                     1      95m
alertmanager-prometheus-community-kube-alertmanager-cluster-tls-config               Opaque                     1      94m
alertmanager-prometheus-community-kube-alertmanager-generated                        Opaque                     1      94m
alertmanager-prometheus-community-kube-alertmanager-tls-assets-0                     Opaque                     0      94m
alertmanager-prometheus-community-kube-alertmanager-web-config                       Opaque                     1      94m
minio-backup-credential                                                              Opaque                     2      9m30s
minio-creds                                                                          Opaque                     2      100m
minio-secret                                                                         Opaque                     2      100m
postgresql-cluster-app                                                               kubernetes.io/basic-auth   11     9m27s
postgresql-cluster-apptest-secret                                                    kubernetes.io/basic-auth   2      9m30s
postgresql-cluster-ca                                                                Opaque                     2      9m27s
postgresql-cluster-pooler                                                            kubernetes.io/tls          2      9m24s
postgresql-cluster-replication                                                       kubernetes.io/tls          2      9m27s
postgresql-cluster-server                                                            kubernetes.io/tls          2      9m27s
prometheus-community-grafana                                                         Opaque                     3      95m
prometheus-community-kube-admission                                                  Opaque                     3      95m
prometheus-prometheus-community-kube-prometheus                                      Opaque                     1      94m
prometheus-prometheus-community-kube-prometheus-thanos-prometheus-http-client-file   Opaque                     1      94m
prometheus-prometheus-community-kube-prometheus-tls-assets-0                         Opaque                     1      94m
prometheus-prometheus-community-kube-prometheus-web-config                           Opaque                     1      94m
sh.helm.release.v1.prometheus-community.v1                                           helm.sh/release.v1         1      95m
sh.helm.release.v1.prometheus-community.v2                                           helm.sh/release.v1         1      93m
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ MINIO_USER_NAME=minioadmin
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ MINIO_USER_PASSWORD=minioadmin123
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc \
  -n cloudnative-pg \
  --rm -it \
  --restart=Never \
  --image=minio/mc \
  --quiet \
  --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz

############################################################
##@ Scheduled backup configuration
############################################################
lemos@ubuntuserverpg:~$ cat <<EOF > scheduled_backup.yaml
apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: postgresql-cluster-sched-bkp
  namespace: cloudnative-pg
spec:
  schedule: "0 0 0 * * *"
  backupOwnerReference: self
  immediate: true
  method: plugin
  pluginConfiguration:
    name: barman-cloud.cloudnative-pg.io
  cluster:
    name: postgresql-cluster
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f scheduled_backup.yaml
scheduledbackup.postgresql.cnpg.io/postgresql-cluster-sched-bkp created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get backup -n cloudnative-pg -l cnpg.io/cluster=postgresql-cluster
NAME                                          AGE   CLUSTER              METHOD   PHASE       ERROR
postgresql-cluster-sched-bkp-20260528182802   46s   postgresql-cluster   plugin   completed   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- describe scheduledbackup postgresql-cluster-sched-bkp -n cloudnative-pg
Name:         postgresql-cluster-sched-bkp
Namespace:    cloudnative-pg
Labels:       <none>
Annotations:  <none>
API Version:  postgresql.cnpg.io/v1
Kind:         ScheduledBackup
Metadata:
  Creation Timestamp:  2026-05-28T18:28:02Z
  Generation:          1
  Resource Version:    18922
  UID:                 bb9abc28-f873-471b-952c-767e341505bc
Spec:
  Backup Owner Reference:  self
  Cluster:
    Name:     postgresql-cluster
  Immediate:  true
  Method:     plugin
  Plugin Configuration:
    Name:    barman-cloud.cloudnative-pg.io
  Schedule:  0 0 0 * * *
Status:
  Last Check Time:     2026-05-28T18:28:02Z
  Last Schedule Time:  2026-05-28T18:28:02Z
  Next Schedule Time:  2026-05-29T00:00:00Z
Events:
  Type    Reason          Age   From                            Message
  ----    ------          ----  ----                            -------
  Normal  BackupSchedule  60s   cloudnative-pg-scheduledbackup  Scheduled immediate backup now: 2026-05-28 18:28:02.344564687 +0000 UTC m=+7070.041333963
  Normal  BackupSchedule  60s   cloudnative-pg-scheduledbackup  Next backup scheduled by 2026-05-29 00:00:00 +0000 UTC
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc \
  -n cloudnative-pg \
  --rm -it \
  --restart=Never \
  --image=minio/mc \
  --quiet \
  --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-28 18:28:10 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/data.tar.gz
[2026-05-28 18:28:10 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/backup.info
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz

############################################################
##@ Backup on-demand
############################################################
lemos@ubuntuserverpg:~$ cat <<EOF > backup_on-demand.yaml
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
  name: backup-on-demand
  namespace: cloudnative-pg
spec:
  method: plugin
  pluginConfiguration:
    name: barman-cloud.cloudnative-pg.io
  cluster:
    name: postgresql-cluster
EOF
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f backup_on-demand.yaml
backup.postgresql.cnpg.io/backup-on-demand created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- describe backup backup-on-demand -n cloudnative-pg
Name:         backup-on-demand
Namespace:    cloudnative-pg
Labels:       <none>
Annotations:  <none>
API Version:  postgresql.cnpg.io/v1
Kind:         Backup
Metadata:
  Creation Timestamp:  2026-05-28T18:31:58Z
  Generation:          1
  Resource Version:    19521
  UID:                 789ffdc6-73c0-40ed-b607-43dd7685bfe2
Spec:
  Cluster:
    Name:  postgresql-cluster
  Method:  plugin
  Plugin Configuration:
    Name:  barman-cloud.cloudnative-pg.io
Status:
  Backup Id:    20260528T153159
  Backup Name:  backup-20260528153158
  Begin Lsn:    0/6000060
  Begin Wal:    000000010000000000000006
  End Lsn:      0/7000000
  End Wal:      000000010000000000000007
  Instance Id:
    Container Id:  containerd://f7bb99c13ca48d583fb55cca188c9d6139923f6a61241c0b8afaf464b45b68ca
    Pod Name:      postgresql-cluster-2
    Session Id:    5cec8154-b588-4e4e-838f-1451e686b1a3
  Major Version:   18
  Method:          plugin
  Online:          true
  Phase:           completed
  Plugin Metadata:
    Cluster UID:                 b61efa19-9442-401d-aa01-7485e8bb0926
    Display Name:                BarmanCloudInstance
    Name:                        barman-cloud.cloudnative-pg.io
    Plugin Name:                 barman-cloud.cloudnative-pg.io
    Timeline:                    1
    Version:                     0.12.0
  Reconciliation Started At:     2026-05-28T18:31:58Z
  Reconciliation Terminated At:  2026-05-28T18:32:06Z
  Started At:                    2026-05-28T18:31:59Z
  Stopped At:                    2026-05-28T18:32:04Z
Events:
  Type    Reason     Age   From                   Message
  ----    ------     ----  ----                   -------
  Normal  Starting   9s    cloudnative-pg-backup  Starting backup for cluster postgresql-cluster
  Normal  Starting   9s    local-webserver        Backup started
  Normal  Completed  1s    local-webserver        Backup completed
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get backup -n cloudnative-pg
NAME                                          AGE     CLUSTER              METHOD   PHASE       ERROR
backup-on-demand                              83s     postgresql-cluster   plugin   completed   
postgresql-cluster-sched-bkp-20260528182802   5m19s   postgresql-cluster   plugin   completed   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc \
  -n cloudnative-pg \
  --rm -it \
  --restart=Never \
  --image=minio/mc \
  --quiet \
  --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-28 18:32:04 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/data.tar.gz
[2026-05-28 18:32:04 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/backup.info
[2026-05-28 18:28:10 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/data.tar.gz
[2026-05-28 18:28:10 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/backup.info
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz

############################################################
##@ Manual switchover
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-1
Primary promotion time:  2026-05-28 15:17:23 -0300 -03 (21m59s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    136M
Current Write LSN:       0/7000000 (Timeline: 1 - WAL File: 000000010000000000000007)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000010000000000000006   @   2026-05-28T15:26:23.510593-03:00
Last Failed WAL:                -

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-2  0/7000000  0/7000000  0/7000000  0/7000000   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/7000000  0/7000000  0/7000000  0/7000000   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-1  0/7000000    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-2  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION

lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-1  0/7000000    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-2  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/7000000    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg promote postgresql-cluster postgresql-cluster-2 -n cloudnative-pg
{"level":"info","ts":"2026-05-28T15:41:12.924590897-03:00","msg":"Cluster has become unhealthy"}
Node postgresql-cluster-2 in cluster postgresql-cluster will be promoted
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-2
Primary promotion time:  2026-05-28 15:41:18 -0300 -03 (13s)
Status:                  Switchover in progress Switching over to postgresql-cluster-2
Instances:               3
Ready instances:         2
Size:                    152M
Current Write LSN:       0/80055A0 (Timeline: 2 - WAL File: 000000020000000000000008)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000010000000000000008.partial   @   2026-05-28T15:41:20.346773-03:00
Last Failed WAL:                00000002.history                   @   2026-05-28T15:41:17.76251-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-3  0/80055A0  0/80055A0  0/80055A0  0/80055A0   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status         QoS        Manager Version  Node
----                  -----------  ----------------  ------         ---        ---------------  ----
postgresql-cluster-2  0/80055A0    Primary           OK             Burstable  1.29.1           minikube
postgresql-cluster-3  0/80055A0    Standby (async)   OK             Burstable  1.29.1           minikube
postgresql-cluster-1  -            -                 InternalError  Burstable  -                minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION


Error(s) extracting status
-----------------------------------
failed to get status by proxying to the pod, you might lack permissions to get pods/proxy: an error on the server ("failed to connect to `user=postgres database=postgres`: /controller/run/.s.PGSQL.5432 (/controller/run): server error: FATAL: the database system is starting up (SQLSTATE 57P03)") has prevented the request from succeeding (get pods https:postgresql-cluster-1:8000)
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-2
Primary promotion time:  2026-05-28 15:41:18 -0300 -03 (48s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    152M
Current Write LSN:       0/80055D8 (Timeline: 2 - WAL File: 000000020000000000000008)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000010000000000000008.partial   @   2026-05-28T15:41:20.346773-03:00
Last Failed WAL:                00000002.history                   @   2026-05-28T15:41:17.76251-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-1  0/80055D8  0/80055D8  0/80055D8  0/80055D8   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/80055D8  0/80055D8  0/80055D8  0/80055D8   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/80055D8    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/80055D8    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/80055D8    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-2
Primary promotion time:  2026-05-28 15:41:18 -0300 -03 (7m12s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    168M
Current Write LSN:       0/9000110 (Timeline: 2 - WAL File: 000000020000000000000009)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              000000020000000000000008   @   2026-05-28T15:46:18.871402-03:00
Last Failed WAL:                00000002.history           @   2026-05-28T15:41:17.76251-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-1  0/9000110  0/9000110  0/9000110  0/9000110   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/9000110  0/9000110  0/9000110  0/9000110   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/9000110    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION

############################################################
##@ Automatic failover triggered by pod deletion
############################################################
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/9000110    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- delete pod postgresql-cluster-2 -n cloudnative-pg
pod "postgresql-cluster-2" deleted from cloudnative-pg namespace
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status         QoS        Manager Version  Node
----                  -----------  ----------------  ------         ---        ---------------  ----
postgresql-cluster-1  0/A005060    Primary           OK             Burstable  1.29.1           minikube
postgresql-cluster-3  0/A005060    Standby (async)   OK             Burstable  1.29.1           minikube
postgresql-cluster-2  -            -                 InternalError  Burstable  -                minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg | grep -i -A5 "Instances status"
Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-2  0/9000110    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-1  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/9000110    Standby (async)   OK      Burstable  1.29.1           minikube
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- cnpg status postgresql-cluster -n cloudnative-pg
Cluster Summary
Name                     cloudnative-pg/postgresql-cluster
System ID:               7645008293190053908
PostgreSQL Image:        ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie
Primary instance:        postgresql-cluster-1
Primary promotion time:  2026-05-28 15:48:43 -0300 -03 (29s)
Status:                  Cluster in healthy state 
Instances:               3
Ready instances:         3
Size:                    232M
Current Write LSN:       0/A005060 (Timeline: 3 - WAL File: 00000003000000000000000A)

Continuous Backup status (Barman Cloud Plugin)
ObjectStore / Server name:      minio-store/postgresql-cluster
First Point of Recoverability:  2026-05-28 15:28:10 -03
Last Successful Backup:         2026-05-28 15:32:04 -03
Last Failed Backup:             -
Working WAL archiving:          OK
WALs waiting to be archived:    0
Last Archived WAL:              00000002000000000000000A.partial   @   2026-05-28T15:48:46.35119-03:00
Last Failed WAL:                00000003.history                   @   2026-05-28T15:48:43.328507-03:00

Streaming Replication status
Replication Slots Enabled
Name                  Sent LSN   Write LSN  Flush LSN  Replay LSN  Write Lag  Flush Lag  Replay Lag  State      Sync State  Sync Priority  Replication Slot
----                  --------   ---------  ---------  ----------  ---------  ---------  ----------  -----      ----------  -------------  ----------------
postgresql-cluster-2  0/A005060  0/A005060  0/A005060  0/A005060   00:00:00   00:00:00   00:00:00    streaming  async       0              active
postgresql-cluster-3  0/A005060  0/A005060  0/A005060  0/A005060   00:00:00   00:00:00   00:00:00    streaming  async       0              active

Instances status
Name                  Current LSN  Replication role  Status  QoS        Manager Version  Node
----                  -----------  ----------------  ------  ---        ---------------  ----
postgresql-cluster-1  0/A005060    Primary           OK      Burstable  1.29.1           minikube
postgresql-cluster-2  0/A005060    Standby (async)   OK      Burstable  1.29.1           minikube
postgresql-cluster-3  0/A005060    Standby (async)   OK      Burstable  1.29.1           minikube

Plugins status
Name                            Version  Status  Reported Operator Capabilities
----                            -------  ------  ------------------------------
barman-cloud.cloudnative-pg.io  0.12.0   N/A     Reconciler Hooks, Lifecycle Service, TYPE_INSTANCE_SIDECAR_INJECTION

############################################################
##@ Backup recovery - New cluster bootstrap initialization
############################################################
lemos@ubuntuserverpg:~$ tee simulate_data_loss.sh << 'EOF'
#!/bin/bash
# =============================================================================
# cloudnative-pg Test Script
# Cluster     : postgresql-cluster
# Namespace   : cloudnative-pg
#
# Connects as the internal postgres superuser directly inside the primary pod
# via peer authentication (no password required).
# No PgBouncer, no temp pod needed.
# =============================================================================

set -euo pipefail

NAMESPACE="cloudnative-pg"
CLUSTER="postgresql-cluster"
DB_NAME="dbtest"

# ---------------------------------------------------------------------------
# Identify the primary pod
# ---------------------------------------------------------------------------
echo "==> Finding primary pod..."
PRIMARY_POD=$(minikube kubectl -- get pods -n "$NAMESPACE" \
  -l "cnpg.io/cluster=${CLUSTER},cnpg.io/instanceRole=primary" \
  -o jsonpath='{.items[0].metadata.name}')

if [[ -z "$PRIMARY_POD" ]]; then
  echo "ERROR: Could not find a primary pod for cluster '${CLUSTER}' in namespace '${NAMESPACE}'."
  exit 1
fi
echo "    Primary pod: ${PRIMARY_POD}"

# ---------------------------------------------------------------------------
# Helper: run SQL as postgres superuser via peer auth inside the primary pod
# ---------------------------------------------------------------------------
run_sql() {
  local sql="$1"
  minikube kubectl -- exec "$PRIMARY_POD" -n "$NAMESPACE" -c postgres -- \
    psql -U postgres -d "$DB_NAME" -At -c "$sql"
}

# ---------------------------------------------------------------------------
# 1) Create table and insert rows
# ---------------------------------------------------------------------------
echo ""
echo "==> [1] Creating table test_table and inserting rows..."
run_sql "DROP TABLE IF EXISTS test_table;"
run_sql "CREATE TABLE test_table (id INT PRIMARY KEY, data TEXT);"
run_sql "INSERT INTO test_table (id, data) VALUES (1, 'teste1'), (2, 'teste2');"
echo "    Rows inserted:"
run_sql "SELECT * FROM test_table ORDER BY id;"

# ---------------------------------------------------------------------------
# 2) Capture timestamp before deletion
# ---------------------------------------------------------------------------
echo ""
echo "==> [2] Capturing timestamp before deleting row id=2..."
PRE_DELETE_TIMESTAMP=$(run_sql "SELECT now();")
echo "    Pre-delete timestamp: $PRE_DELETE_TIMESTAMP"

# ---------------------------------------------------------------------------
# 3) Delete row with id=2
# ---------------------------------------------------------------------------
echo ""
echo "==> [3] Deleting row with id=2..."
run_sql "DELETE FROM test_table WHERE id = 2;"
echo "    Remaining rows:"
run_sql "SELECT * FROM test_table ORDER BY id;"

# ---------------------------------------------------------------------------
# 4) Get current WAL LSN and its file name
# ---------------------------------------------------------------------------
echo ""
echo "==> [4] Current WAL LSN and file name..."
WAL_LSN=$(run_sql "SELECT pg_current_wal_lsn();")
WAL_LSN_FILE=$(run_sql "SELECT pg_walfile_name(pg_current_wal_lsn());")
echo "    WAL LSN      : $WAL_LSN"
echo "    WAL LSN file : $WAL_LSN_FILE"

# ---------------------------------------------------------------------------
# 5) Get current timestamp
# ---------------------------------------------------------------------------
echo ""
echo "==> [5] Current database timestamp..."
DB_TIMESTAMP=$(run_sql "SELECT now();")
echo "    Timestamp: $DB_TIMESTAMP"

# ---------------------------------------------------------------------------
# 6) Delete record with id=2 (idempotent)
# ---------------------------------------------------------------------------
echo ""
echo "==> [6] Ensuring row id=2 is deleted (idempotent)..."
run_sql "DELETE FROM test_table WHERE id = 2;"
echo "    Done."

# ---------------------------------------------------------------------------
# 7) Switch WAL file
# ---------------------------------------------------------------------------
echo ""
echo "==> [7] Switching WAL file..."
SWITCHED_LSN=$(run_sql "SELECT pg_switch_wal();")
echo "    Switched at LSN: $SWITCHED_LSN"

# ---------------------------------------------------------------------------
# 8) Get current WAL file name
# ---------------------------------------------------------------------------
echo ""
echo "==> [8] Current WAL file name..."
WAL_FILE=$(run_sql "SELECT pg_walfile_name(pg_current_wal_lsn());")
echo "    WAL file: $WAL_FILE"

# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
echo ""
echo "====================================================="
echo " Summary"
echo "====================================================="
echo ""
echo "  [1] Created table test_table, inserted rows (1,teste1) and (2,teste2)"
echo "  [2] Pre-delete timestamp : $PRE_DELETE_TIMESTAMP"
echo "  [3] Deleted row id=2"
echo "  [4] WAL LSN              : $WAL_LSN"
echo "  [4] WAL LSN file         : $WAL_LSN_FILE"
echo "  [5] Post-WAL timestamp   : $DB_TIMESTAMP"
echo "  [6] Confirmed row id=2 deleted (idempotent)"
echo "  [7] Switched WAL         : $SWITCHED_LSN"
echo "  [8] WAL file             : $WAL_FILE"
echo "====================================================="
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ chmod u+x simulate_data_loss.sh
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ ./simulate_data_loss.sh
...
=====================================================
 Summary
=====================================================

  [1] Created table test_table, inserted rows (1,teste1) and (2,teste2)
  [2] Pre-delete timestamp : 2026-05-29 09:19:48.250085-03
  [3] Deleted row id=2
  [4] WAL LSN              : 0/F026BC8
  [4] WAL LSN file         : 00000003000000000000000F
  [5] Post-WAL timestamp   : 2026-05-29 09:19:49.646057-03
  [6] Confirmed row id=2 deleted (idempotent)
  [7] Switched WAL         : 0/F026BE0
  [8] WAL file             : 000000030000000000000010
=====================================================
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- run minio-mc   -n cloudnative-pg   --rm -it   --restart=Never   --image=minio/mc   --quiet   --command -- /bin/sh -c "
    mc alias set local http://minio.cloudnative-pg.svc.cluster.local:9000 ${MINIO_USER_NAME} ${MINIO_USER_PASSWORD} >/dev/null 2>&1 &&
    mc ls local/pg-backups --recursive | sort -rk1,2
  "
[2026-05-29 12:19:50 UTC]  55KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000F.gz
[2026-05-29 12:17:16 UTC]  18KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000E.gz
[2026-05-29 12:12:54 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260529T091248/data.tar.gz
[2026-05-29 12:12:54 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260529T091248/backup.info
[2026-05-28 19:29:29 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000D.gz
[2026-05-28 19:24:28 UTC]  22KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000C.gz
[2026-05-28 18:56:52 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000B.gz
[2026-05-28 18:51:52 UTC]  54KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000300000000/00000003000000000000000A.gz
[2026-05-28 18:48:46 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000200000000/00000002000000000000000A.partial.gz
[2026-05-28 18:48:45 UTC]    67B STANDARD postgresql-cluster/postgresql-cluster/wals/00000003.history.gz
[2026-05-28 18:48:40 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000200000000/000000020000000000000009.gz
[2026-05-28 18:46:18 UTC]  19KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000200000000/000000020000000000000008.gz
[2026-05-28 18:41:20 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000008.partial.gz
[2026-05-28 18:41:19 UTC]    59B STANDARD postgresql-cluster/postgresql-cluster/wals/00000002.history.gz
[2026-05-28 18:41:13 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000007.gz
[2026-05-28 18:32:04 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/data.tar.gz
[2026-05-28 18:32:04 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T153159/backup.info
[2026-05-28 18:28:10 UTC] 5.2MiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/data.tar.gz
[2026-05-28 18:28:10 UTC] 1.4KiB STANDARD postgresql-cluster/postgresql-cluster/base/20260528T152804/backup.info
[2026-05-28 18:26:23 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000006.gz
[2026-05-28 18:21:23 UTC]   197B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.00000028.backup.gz
[2026-05-28 18:21:22 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000005.gz
[2026-05-28 18:21:12 UTC]  16KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000004.gz
[2026-05-28 18:20:25 UTC]   203B STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.00000028.backup.gz
[2026-05-28 18:20:24 UTC] 190KiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000003.gz
[2026-05-28 18:18:11 UTC] 1.4MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000002.gz
[2026-05-28 18:17:25 UTC] 2.6MiB STANDARD postgresql-cluster/postgresql-cluster/wals/0000000100000000/000000010000000000000001.gz
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ tee postgresql-cluster-recovery.yaml << 'EOF'
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql-cluster-recovery
  namespace: cloudnative-pg
spec:
  instances: 1
  imageName: ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie

  env:
    - name: TZ
      value: America/Sao_Paulo

  storage:
    storageClass: csi-hostpath-sc
    size: 10Gi
  walStorage:
    storageClass: csi-hostpath-sc
    size: 5Gi

  resources:
    requests:
      cpu: "300m"
      memory: "512Mi"
    limits:
      cpu: "1000m"
      memory: "1024Mi"

  managed:
    roles:
      - name: apptest
        ensure: present
        login: true
        superuser: false
        createdb: false
        createrole: false
        inherit: true
        passwordSecret:
          name: postgresql-cluster-apptest-secret

  bootstrap:
    recovery:
      source: minio-store-source
      recoveryTarget:
        targetTime: "2026-05-29 09:19:48.250085-03:00"
        exclusive: false

  externalClusters:
    - name: minio-store-source
      plugin:
        name: barman-cloud.cloudnative-pg.io
        parameters:
          barmanObjectName: minio-store
          serverName: postgresql-cluster  # folder name inside the bucket

  postgresql:
    parameters:
      pg_stat_statements.max: "10000"
      pg_stat_statements.track: "all"
      timezone: "America/Sao_Paulo"

  plugins:
    - name: barman-cloud.cloudnative-pg.io
      isWALArchiver: false
      parameters:
        barmanObjectName: minio-store
EOF
...
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- apply -f postgresql-cluster-recovery.yaml
cluster.postgresql.cnpg.io/postgresql-cluster-recovery created
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster-recovery -n cloudnative-pg
NAME                          AGE   INSTANCES   READY   STATUS               PRIMARY
postgresql-cluster-recovery   5s    1                   Setting up primary   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get events -n cloudnative-pg --field-selector involvedObject.name=postgresql-cluster-recovery --sort-by='.lastTimestamp'
LAST SEEN   TYPE     REASON                        OBJECT                                MESSAGE
39s         Normal   CreatingPodDisruptionBudget   cluster/postgresql-cluster-recovery   Creating PodDisruptionBudget postgresql-cluster-recovery-primary
39s         Normal   CreatingServiceAccount        cluster/postgresql-cluster-recovery   Creating ServiceAccount
39s         Normal   CreatingRole                  cluster/postgresql-cluster-recovery   Creating Cluster Role
39s         Normal   CreatingInstance              cluster/postgresql-cluster-recovery   Primary instance (from backup)
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster-recovery -n cloudnative-pg
NAME                          AGE   INSTANCES   READY   STATUS                                       PRIMARY
postgresql-cluster-recovery   68s   1                   Waiting for the instances to become active   
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- get cluster postgresql-cluster-recovery -n cloudnative-pg
NAME                          AGE    INSTANCES   READY   STATUS                     PRIMARY
postgresql-cluster-recovery   114s   1           1       Cluster in healthy state   postgresql-cluster-recovery-1
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- logs -n cloudnative-pg -l cnpg.io/cluster=postgresql-cluster-recovery -l role=primary -f
Defaulted container "postgres" out of: postgres, bootstrap-controller (init), plugin-barman-cloud (init)
Defaulted container "postgres" out of: postgres, bootstrap-controller (init), plugin-barman-cloud (init)
{"level":"info","ts":"2026-05-29T09:12:15.268113766-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.264 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"2","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"starting PostgreSQL 18.3 (Debian 18.3-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.268127554-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.265 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"3","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv4 address \"0.0.0.0\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.268148234-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.265 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"4","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv6 address \"::\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.274294275-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.273 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"5","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on Unix socket \"/controller/run/.s.PGSQL.5432\"","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.291311594-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.290 -03","process_id":"29","session_id":"6a19829f.1d","session_line_num":"1","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system was shut down at 2026-05-28 16:38:19 -03","backend_type":"startup","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:12:15.316622419-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:12:15.316 -03","process_id":"21","session_id":"6a19829f.15","session_line_num":"6","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system is ready to accept connections","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:17:15.339584768-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:17:15.339 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"1","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint starting: time","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.974594484-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.973 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"1","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"ending log output to stderr","hint":"Future log output will go to log destination \"csvlog\".","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.974929768-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.973 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"2","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"starting PostgreSQL 18.3 (Debian 18.3-1.pgdg13+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.97494521-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.974 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"3","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv4 address \"0.0.0.0\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.974955861-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.974 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"4","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on IPv6 address \"::\", port 5432","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.977058246-03:00","msg":"Instance is still down, will retry in 1 second","logger":"instance-manager","logging_pod":"postgresql-cluster-recovery-1","controller":"instance-cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"postgresql-cluster-recovery","namespace":"cloudnative-pg"},"namespace":"cloudnative-pg","name":"postgresql-cluster-recovery","reconcileID":"f5a27391-336d-4f44-a3ae-0a5029e7b8e7","instance":"postgresql-cluster-recovery-1","cluster":"postgresql-cluster-recovery","namespace":"cloudnative-pg","logging_pod":"postgresql-cluster-recovery-1"}
{"level":"info","ts":"2026-05-29T09:17:15.630662491-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:17:15.630 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"2","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint complete: wrote 1 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.134 s, sync=0.027 s, total=0.292 s; sync files=3, longest=0.016 s, average=0.009 s; distance=4 kB, estimate=4 kB; lsn=0/F000060, redo lsn=0/E001260","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:22:15.663349127-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:22:15.663 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"3","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint starting: time","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T09:22:18.944349544-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-1","record":{"log_time":"2026-05-29 09:22:18.942 -03","process_id":"27","session_id":"6a19829f.1b","session_line_num":"4","session_start_time":"2026-05-29 09:12:15 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"checkpoint complete: wrote 31 buffers (0.2%), wrote 1 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=3.136 s, sync=0.110 s, total=3.280 s; sync files=28, longest=0.031 s, average=0.004 s; distance=32763 kB, estimate=32763 kB; lsn=0/100000B8, redo lsn=0/10000060","backend_type":"checkpointer","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.982713322-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.982 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"5","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"listening on Unix socket \"/controller/run/.s.PGSQL.5432\"","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:33.992201871-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:33.992 -03","process_id":"29","session_id":"6a199049.1d","session_line_num":"1","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system was shut down at 2026-05-29 10:10:11 -03","backend_type":"startup","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:34.004906246-03:00","logger":"postgres","msg":"record","logging_pod":"postgresql-cluster-recovery-1","record":{"log_time":"2026-05-29 10:10:34.004 -03","process_id":"22","session_id":"6a199049.16","session_line_num":"6","session_start_time":"2026-05-29 10:10:33 -03","transaction_id":"0","error_severity":"LOG","sql_state_code":"00000","message":"database system is ready to accept connections","backend_type":"postmaster","query_id":"0"}}
{"level":"info","ts":"2026-05-29T10:10:34.990329119-03:00","msg":"Triggered a managed role reconciliation","logger":"instance-manager","logging_pod":"postgresql-cluster-recovery-1","controller":"instance-cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"postgresql-cluster-recovery","namespace":"cloudnative-pg"},"namespace":"cloudnative-pg","name":"postgresql-cluster-recovery","reconcileID":"90688aec-ee3a-4091-bb07-e21bc0854dc6","logging_pod":"postgresql-cluster-recovery-1"}
{"level":"info","ts":"2026-05-29T10:10:35.672782192-03:00","msg":"Triggered a managed role reconciliation","logger":"instance-manager","logging_pod":"postgresql-cluster-recovery-1","controller":"instance-cluster","controllerGroup":"postgresql.cnpg.io","controllerKind":"Cluster","Cluster":{"name":"postgresql-cluster-recovery","namespace":"cloudnative-pg"},"namespace":"cloudnative-pg","name":"postgresql-cluster-recovery","reconcileID":"ab0b12ce-26bf-4987-a2ed-dbb88f9f4163","logging_pod":"postgresql-cluster-recovery-1"}
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ tee select_table.sh << 'EOF'
#!/bin/bash
# =============================================================================
# cloudnative-pg - Check test_table content
# Cluster     : postgresql-cluster
# Namespace   : cloudnative-pg
# =============================================================================

set -euo pipefail

NAMESPACE="cloudnative-pg"
CLUSTER="postgresql-cluster-recovery"
DB_NAME="dbtest"

# ---------------------------------------------------------------------------
# Identify the primary pod
# ---------------------------------------------------------------------------
echo "==> Finding primary pod..."
PRIMARY_POD=$(minikube kubectl -- get pods -n "$NAMESPACE" \
  -l "cnpg.io/cluster=${CLUSTER},cnpg.io/instanceRole=primary" \
  -o jsonpath='{.items[0].metadata.name}')

if [[ -z "$PRIMARY_POD" ]]; then
  echo "ERROR: Could not find a primary pod for cluster '${CLUSTER}' in namespace '${NAMESPACE}'."
  exit 1
fi
echo "    Primary pod: ${PRIMARY_POD}"

# ---------------------------------------------------------------------------
# Select test_table content
# ---------------------------------------------------------------------------
echo ""
echo "==> Selecting content from test_table..."
minikube kubectl -- exec "$PRIMARY_POD" -n "$NAMESPACE" -c postgres -- \
  psql -U postgres -d "$DB_NAME" -c "SELECT * FROM test_table ORDER BY id;"
EOF
...

############################################################
##@ Prometheus + Grafana monitoring
############################################################
lemos@ubuntuserverpg:~$ curl -O https://raw.githubusercontent.com/cloudnative-pg/grafana-dashboards/main/charts/cluster/grafana-dashboard.json
  % Total    % Received % Xferd  Average Speed  Time    Time    Time   Current
                                 Dload  Upload  Total   Spent   Left   Speed
100 247.1k 100 247.1k   0      0 320.7k      0                              0
lemos@ubuntuserverpg:~$ 
lemos@ubuntuserverpg:~$ minikube kubectl -- --namespace cloudnative-pg port-forward svc/prometheus-community-grafana 3000:80 --address 0.0.0.0
Forwarding from 0.0.0.0:3000 -> 3000
Handling connection for 3000

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima