
点击蓝字关注我们
本文我们将介绍在 Kubernetes 集群上设置 PostgreSQL Operator、用于备份的 MinIO 和 HostPath CSI 驱动程序。
一、测试环境
Client Version:v1.30.2
Kustomize Version: v5.0.4-0
Server Version: v1.30.2
Database: PostgreSQL 16.3
Operator: cloud-native-postgresql 1.23.2
二、测试步骤
2.1 安装PostgreSQL Operator
首先,我们需要部署PostgreSQL Operator,它可以简化Kubernetes上PostgreSQL集群的管理。
kubectl apply --server-side -f https://get.enterprisedb.io/cnp/postgresql-operator-1.23.2.yaml
此命令部署 PostgreSQL Operator 以及管理 PostgreSQL 集群所需的相关自定义资源定义 (CRD)、服务帐户、角色和部署。
验证输出:
kubectl get deployment -n postgresql-operator-system postgresql-operator-controller-manager
输出如下:
NAME READY UP-TO-DATE AVAILABLE AGEpostgresql-operator-controller-manager 1/1 1 1 58s
2.2 设置 MinIO用于备份
MinIO 是一种高性能、与S3兼容的对象存储,我们将使用它来存储 PostgreSQL 备份。
2.2.1 创建 MinIO 部署
下面的 YAML 中提供的值是 Base64 编码的字符串。
ACCESS_KEY_ID: bWluaW8= 解码值: minio
ACCESS_SECRET_KEY:bWluaW8xMjM= 解码值:minio123
创建一个包含以下内容的 minio.yaml 文件:
apiVersion: v1kind: Secretmetadata:name: minio-credsdata:ACCESS_KEY_ID: bWluaW8=ACCESS_SECRET_KEY: bWluaW8xMjM=---apiVersion: v1kind: Servicemetadata:name: minio-servicespec:ports:- port: 9000targetPort: 9000protocol: TCPselector:app: minio---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: minio-pv-claimspec:accessModes:- ReadWriteOnceresources:requests:storage: 2GistorageClassName: standard---apiVersion: apps/v1kind: Deploymentmetadata:name: miniospec:selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:volumes:- name: datapersistentVolumeClaim:claimName: minio-pv-claimcontainers:- name: minioimage: minio/minio:RELEASE.2024-11-10T18-41-49Zargs:- server- dataenv:- name: MINIO_ACCESS_KEYvalueFrom:secretKeyRef:name: minio-credskey: ACCESS_KEY_ID- name: MINIO_SECRET_KEYvalueFrom:secretKeyRef:name: minio-credskey: ACCESS_SECRET_KEYports:- containerPort: 9000readinessProbe:httpGet:path: minio/health/readyport: 9000initialDelaySeconds: 30livenessProbe:httpGet:path: minio/health/liveport: 9000initialDelaySeconds: 30
Apply MinIO 的配置:
kubectl apply -f minio.yaml
验证MinIO部署:
kubectl get deployment minio
输出如下:
NAME READY UP-TO-DATE AVAILABLE AGEminio 1/1 1 1 70s
三、部署HostPath CSI驱动
要启用卷快照进行备份,我们需要部署 HostPath CSI 驱动程序。
创建包含以下内容的deploy-hostpath-csi.sh 脚本:
#!/bin/env bashCSI_BASE_URL=https://raw.githubusercontent.com/kubernetes-csiCSI_DRIVER_HOST_PATH_VERSION=v1.11.0SNAPSHOTTER_VERSION="v6.3.1"PROVISIONER_VERSION="v3.6.1"RESIZER_VERSION="v1.9.1"ATTACHER_VERSION="v4.4.1"## Install external snapshotter CRDkubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yamlkubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yamlkubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yamlkubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yamlkubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yamlkubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/csi-snapshotter/rbac-csi-snapshotter.yaml## Install external provisionerkubectl apply -f "${CSI_BASE_URL}"/external-provisioner/"${PROVISIONER_VERSION}"/deploy/kubernetes/rbac.yaml## Install external attacherkubectl apply -f "${CSI_BASE_URL}"/external-attacher/"${ATTACHER_VERSION}"/deploy/kubernetes/rbac.yaml## Install external resizerkubectl apply -f "${CSI_BASE_URL}"/external-resizer/"${RESIZER_VERSION}"/deploy/kubernetes/rbac.yaml## Install driver and pluginkubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-driverinfo.yamlkubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-plugin.yaml## create volumesnapshotclasskubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-snapshotclass.yaml## create storage classkubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/examples/csi-storageclass.yaml
运行脚本:
bash deploy-hostpath-csi.sh
四、Rollout 重启 Operator
% kubectl get deployment -ANAMESPACE NAME READY UP-TO-DATE AVAILABLE AGEdefault minio 1/1 1 1 2d19hkube-system coredns 2/2 2 2 2d20hkube-system snapshot-controller 2/2 2 2 2d19hlocal-path-storage local-path-provisioner 1/1 1 1 2d20hpostgresql-operator-system postgresql-operator-controller-manager 1/1 1 1 2d19h
重启 deployment:
% kubectl rollout restart deployment -n postgresql-operator-system postgresql-operator-controller-manager
输出:
deployment.apps/postgresql-operator-controller-manager restarted
验证CSI驱动deployment
kubectl get deployment -A
输出:
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGEkube-system snapshot-controller 2/2 2 2 53sdefault minio 1/1 1 1 70spostgresql-operator-system postgresql-operator-controller-manager 1/1 1 1 2m15s
五、创建具有备份配置的PostgreSQL集群
创建一个 PostgreSQL 集群并将其配置为使用 MinIO 进行备份。
创建包含以下内容的 cluster-example-with-backup.yaml 文件:
apiVersion: postgresql.k8s.enterprisedb.io/v1kind: Clustermetadata:name: cluster-example-backupspec:instances: 2storage:storageClass: csi-hostpath-scsize: 1Gi# Backup properties# This assumes a local minio setupbackup:volumeSnapshot:className: csi-hostpath-snapclassbarmanObjectStore:destinationPath: s3://cluster-backups/endpointURL: http://minio-service:9000s3Credentials:accessKeyId:name: minio-credskey: ACCESS_KEY_IDsecretAccessKey:name: minio-credskey: ACCESS_SECRET_KEYwal:compression: gzipdata:immediateCheckpoint: trueretentionPolicy: "30d"
Apply配置:
kubectl apply -f cluster-example-with-backup.yaml
验证集群状态:
kubectl cnp status cluster-example-backup
输出如下:
Cluster SummaryName: cluster-example-backupNamespace: defaultSystem ID: 7389252359945887770PostgreSQL Image: quay.io/enterprisedb/postgresql:16.3Primary instance: cluster-example-backup-1Primary start time: 2024-11-08 13:13:19 +0000 UTC (uptime 2m39s)Status: Cluster in healthy stateInstances: 2Ready instances: 2
六、创建卷快照备份
创建volume-snapshot-backup.yaml 文件,如下:
apiVersion: postgresql.k8s.enterprisedb.io/v1kind: Backupmetadata:name: volume-snapshot-backupspec:cluster: cluster-example-backupmethod: volumesnapshotvolumesnapshot:className: csi-hostpath-snapclass
部署配置:
kubectl apply -f volume-snapshot-backup.yaml
验证状态:
kubectl cnp status backup volume-snapshot-backup
预期输出:
Backup SummaryName: volume-snapshot-backupCluster: cluster-example-backupType: volumeSnapshotStatus: CompletedStart time: 2024-11-08 14:30:47 +0000 UTC (started 4s ago)End time: 2024-11-08 14:30:51 +0000 UTC (took 4s)Volume Snapshots: 2
七、Barman备份
通过Barman创建备份
7.1 创建backup.yaml 文件:
apiVersion: postgresql.k8s.enterprisedb.io/v1kind: Backupmetadata:name: backup-examplespec:cluster:name: cluster-example-backup
7.2 部署配置
kubectl apply -f backup.yaml
7.3 验证备份
kubectl get backup
预期输出:
NAME AGE CLUSTER METHOD PHASE ERRORbackup-example 18s cluster-example-backup barmanObjectStore completedsnapshot-backup-1.23.2 2d19h cluster-example-backup volumeSnapshot completed
7.4 获取备份详细信息
kubectl describe backup backup-example
输出如下:
Name: backup-exampleNamespace: defaultLabels: <none>Annotations: <none>API Version: postgresql.k8s.enterprisedb.io/v1Kind: BackupMetadata:Creation Timestamp: 2024-11-11T08:21:30ZGeneration: 1Resource Version: 81003UID: edb065b4-41d9-433c-82d0-2f0deceee4c1Spec:Cluster:Name: cluster-example-backupMethod: barmanObjectStoreStatus:Backup Id: 20241111T082133Backup Name: backup-20241111082132Begin LSN: 0/6008870Begin Wal: 000000010000000000000006Destination Path: s3://cluster-backups/End LSN: 0/8000000End Wal: 000000010000000000000008Endpoint URL: http://minio-service:9000Instance ID:Container ID: containerd://ddcb4c8e5ddac49991b1a363d4619ec9b0e15bebbdab4e0f831bd57ac4057f55Pod Name: cluster-example-backup-2Method: barmanObjectStorePhase: completeds3Credentials:Access Key Id:Key: ACCESS_KEY_IDName: minio-credsSecret Access Key:Key: ACCESS_SECRET_KEYName: minio-credsServer Name: cluster-example-backupStarted At: 2024-11-11T08:21:33ZStopped At: 2024-11-11T08:21:34ZEvents:Type Reason Age From Message---- ------ ---- ---- -------Normal Starting 89s cloud-native-postgresql-backup Starting backup for cluster cluster-example-backupNormal Starting 88s instance-manager Backup startedNormal Completed 84s instance-manager Backup completed
八、检查MinIO Web界面
在 MinIO Web 界面上验证备份:
端口转发 MinIO 服务
kubectl port-forward svc/minio-service 9000:9000
指示端口转发处于活动状态:
Forwarding from 127.0.0.1:9000 -> 9000Forwarding from [::1]:9000 -> 9000Handling connection for 9000Handling connection for 9000Handling connection for 9000
浏览器打开MinIO界面
http://localhost:9000
九、验证MinIO备份
访问MinIO界面
使用 minio-creds 密钥中定义的凭据(ACCESS_KEY_ID 和 ACCESS_SECRET_KEY )登录。
导航到 cluster-backups 存储桶。
应该看到一个名为 cluster-example-backup/ 的文件夹,其中包含 base/ 和 wals/ 目录,它们分别存储基本备份和 WAL 段。
这样就使用PostgreSQL Operator以及 Kubernetes上的MinIO和HostPath CSI驱动程序完成了设置、备份创建和验证过程。
关于公司
感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。
欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!
![]() | ![]() |
Elastic 微信群 | EDB 微信群 |

发现“分享”和“赞”了吗,戳我看看吧






