Presentation about the CloudNativePG operator that was delivered at the PGDay Blumenau 2026 event, held in Building H at FURB University on May 30, 2026 (Saturday).
Below is the presentation that was shown during the event.
The content displayed during the demonstration section is also provided below.
##########################################################################
##@ 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