
本文将演示如何在 CloudNativePG(CNPG)环境中,借助 Barman Cloud 插件完成备份与 WAL 归档,并在此基础上部署一套副本集群。
📋 环境说明
第一步:创建命名空间与凭证
首先,分别为主集群和副本集群创建独立的命名空间,并在两个命名空间中存储 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 官方博客
夜雨聆风