乐于分享
好东西不私藏

使用 Barman Cloud 插件在 CloudNativePG 上部署 Postgr

使用 Barman Cloud 插件在 CloudNativePG 上部署 Postgr

本文将演示如何在 CloudNativePG(CNPG)环境中,借助 Barman Cloud 插件完成备份与 WAL 归档,并在此基础上部署一套副本集群。


📋 环境说明

组件
版本
Operator
CloudNativePG(CNPG)1.28.1
数据库
EDB Postgres Advanced Server 18(EPAS)
备份方案
Barman Cloud Plugin v0.11.0
对象存储
AWS S3

第一步:创建命名空间与凭证

首先,分别为主集群和副本集群创建独立的命名空间,并在两个命名空间中存储 Barman 插件访问 S3 所需的 AWS 凭证。

 BASH

# 创建命名空间kubectl create ns primarykubectl create ns replica# 在 primary 命名空间中创建 AWS 凭证kubectl create secret generic aws-creds \  --from-literal=ACCESS_KEY_ID=xxxxxxxxN3GE5FSxxxxxx \  --from-literal=ACCESS_SECRET_KEY=xxxxxxxxGrS+xlfTlCZTaTxxxxxx \  -n primary# 在 replica 命名空间中创建相同的 AWS 凭证kubectl create secret generic aws-creds \  --from-literal=ACCESS_KEY_ID=xxxxxxxxN3GE5FSxxxxxx \  --from-literal=ACCESS_SECRET_KEY=xxxxxxxxGrS+xlfTlCZTaTxxxxxx \  -n replica


第二步:安装 Barman 插件

Barman 插件依赖 cert-manager 实现安全通信,需按顺序完成以下操作:

① 安装 cmctl 并部署 cert-manager

 BASH

brew install cmctlkubectl create namespace cert-managerkubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml# 验证 cert-manager 就绪kubectl get pods -n cert-managercmctl check api# 输出:The cert-manager API is ready

② 部署 Barman Cloud 插件

 BASH

kubectl apply -f https://github.com/cloudnative-pg/plugin-barman-cloud/releases/download/v0.11.0/manifest.yaml# 确认 Deployment 滚动更新完成kubectl rollout status deployment -n postgresql-operator-system barman-cloud# 输出:deployment "barman-cloud" successfully rolled out


第三步:创建 ObjectStore 资源

ObjectStore 资源用于告知插件备份文件和 WAL 日志的存储与读取位置,需分别在 primary 和 replica 命名空间中各创建一份。

primary 命名空间(ObjectStore-primary.yaml)

 YAML

apiVersion: barmancloud.cnpg.io/v1kind: ObjectStoremetadata:  name: s3-store  namespace: primaryspec:  configuration:    destinationPath: s3://swapnil-backup/cnp/    s3Credentials:      accessKeyId:        name: aws-creds        key: ACCESS_KEY_ID      secretAccessKey:        name: aws-creds        key: ACCESS_SECRET_KEY    wal:      compression: gzip

replica 命名空间(ObjectStore-replica.yaml)

配置与上面相同,仅 namespace 改为 replica

 YAML

apiVersion: barmancloud.cnpg.io/v1kind: ObjectStoremetadata:  name: s3-store  namespace: replica# ...其余配置相同

 BASH

kubectl apply -f ObjectStore-primary.yamlkubectl apply -f ObjectStore-replica.yaml


第四步:部署并验证主集群

cluster-primary.yaml 核心配置:

 YAML

apiVersion: postgresql.k8s.enterprisedb.io/v1kind: Clustermetadata:  name: cluster-primary  namespace: primaryspec:  instances: 3  imageName: docker.enterprisedb.com/k8s/edb-postgres-advanced:18-standard-ubi9  primaryUpdateStrategy: unsupervised  storage:    size: 1G  plugins:  - name: barman-cloud.cloudnative-pg.io    isWALArchiver: true    parameters:      barmanObjectName: s3-store  externalClusters:  - name: cluster-primary    plugin:      name: barman-cloud.cloudnative-pg.io      parameters:        barmanObjectName: s3-store        serverName: cluster-primary  - name: cluster-replica    plugin:      name: barman-cloud.cloudnative-pg.io      parameters:        barmanObjectName: s3-store        serverName: cluster-replica

 BASH

kubectl apply -f cluster-primary.yaml# 查看 Pod 状态与角色kubectl get pods -L role -n primary# NAME                READY   STATUS    ROLE# cluster-primary-1   2/2     Running   primary# cluster-primary-2   2/2     Running   replica# cluster-primary-3   2/2     Running   replica

验证 WAL 归档状态(关键输出):

 BASH

kubectl cnp status cluster-primary -n primary

重点关注以下字段: - Working WAL archiving: OK ✅ - WALs waiting to be archived: 0


第五步:执行手动备份

在部署副本集群之前,需要先触发一次完整备份,确保 S3 中已有基础数据供副本集群引导使用。

 BASH

# 触发备份kubectl cnp backup cluster-primary \  --method=plugin \  --plugin-name=barman-cloud.cloudnative-pg.io \  -n primary# 验证备份完成kubectl get backup -n primary# PHASE: completed ✅

再次查看集群状态,确认关键字段:

First Point of Recoverability:  2026-03-26 16:35:25 ISTLast Successful Backup:         2026-03-26 16:35:25 ISTWorking WAL archiving:          OK


第六步:部署并验证副本集群

副本集群配置的关键点:通过 bootstrap.recovery 从主集群的对象存储中恢复初始化,之后持续从 cluster-primary 同步 WAL。

cluster-replica.yaml 核心配置:

 YAML

apiVersion: postgresql.k8s.enterprisedb.io/v1kind: Clustermetadata:  name: cluster-replica  namespace: replicaspec:  instances: 3  imageName: docker.enterprisedb.com/k8s/edb-postgres-advanced:18-standard-ubi9  storage:    size: 1G  bootstrap:    recovery:      source: cluster-primary      # 从主集群恢复  replica:    primary: cluster-primary    source: cluster-primary        # 持续从主集群同步  plugins:  - name: barman-cloud.cloudnative-pg.io    isWALArchiver: true    parameters:      barmanObjectName: s3-store  externalClusters:  - name: cluster-primary    plugin:      name: barman-cloud.cloudnative-pg.io      parameters:        barmanObjectName: s3-store        serverName: cluster-primary  - name: cluster-replica    plugin:      name: barman-cloud.cloudnative-pg.io      parameters:        barmanObjectName: s3-store        serverName: cluster-replica

 BASH

kubectl apply -f cluster-replica.yamlkubectl get pods -L role -n replica# NAME                READY   STATUS    ROLE# cluster-replica-1   2/2     Running   primary(Designated Primary)# cluster-replica-2   2/2     Running   replica# cluster-replica-3   2/2     Running   replica

验证副本集群状态:

 BASH

kubectl cnp status cluster-replica -n replica# Source cluster:          cluster-primary# Working WAL archiving:   OK ✅


第七步:验证数据复制

在主集群写入数据:

 SQL

-- 连接主集群kubectl cnp psql cluster-primary -n primaryCREATE TABLE test(id int);INSERT INTO test VALUES (1);SELECT * FROM test;-- id: 1 ✅CHECKPOINT;SELECT * FROM pg_switch_wal();  -- 强制切换 WAL,触发归档

在副本集群读取数据:

 SQL

-- 连接副本集群kubectl cnp psql cluster-replica -n replica\dt-- 可见 test 表 ✅SELECT * FROM test;-- id: 1 ✅  数据已同步!


✅ 总结

本文成功演示了如何在 replica 命名空间中部署 cluster-replica,并通过 primary 命名空间中的 cluster-primary 完成引导与数据同步。

核心架构优势:

🗄️ 解耦架构:利用 S3 兼容对象存储同时承载全量备份和持续 WAL 归档,副本集群初始化阶段无需与主集群 Pod 直接建立网络连接

🔌 插件化设计:Barman Cloud Plugin 以标准化方式接入 CNPG,配置清晰、易于维护

🔄 高可用拓扑:两套集群各自拥有 3 个实例(1 主 + 2 从),具备完善的本地高可用能力


原文来源:EDB 官方博客