
点击蓝字关注我们
本文我们将介绍在 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 AGE
postgresql-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: v1
kind: Secret
metadata:
name: minio-creds
data:
ACCESS_KEY_ID: bWluaW8=
ACCESS_SECRET_KEY: bWluaW8xMjM=
---
apiVersion: v1
kind: Service
metadata:
name: minio-service
spec:
ports:
- port: 9000
targetPort: 9000
protocol: TCP
selector:
app: minio
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: standard
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
spec:
selector:
matchLabels:
app: minio
template:
metadata:
labels:
app: minio
spec:
volumes:
- name: data
persistentVolumeClaim:
claimName: minio-pv-claim
containers:
- name: minio
image: minio/minio:RELEASE.2024-11-10T18-41-49Z
args:
- server
- data
env:
- name: MINIO_ACCESS_KEY
valueFrom:
secretKeyRef:
name: minio-creds
key: ACCESS_KEY_ID
- name: MINIO_SECRET_KEY
valueFrom:
secretKeyRef:
name: minio-creds
key: ACCESS_SECRET_KEY
ports:
- containerPort: 9000
readinessProbe:
httpGet:
path: minio/health/ready
port: 9000
initialDelaySeconds: 30
livenessProbe:
httpGet:
path: minio/health/live
port: 9000
initialDelaySeconds: 30
复制
Apply MinIO 的配置:
kubectl apply -f minio.yaml
复制
验证MinIO部署:
kubectl get deployment minio
复制
输出如下:
NAME READY UP-TO-DATE AVAILABLE AGE
minio 1/1 1 1 70s
复制
三、部署HostPath CSI驱动
要启用卷快照进行备份,我们需要部署 HostPath CSI 驱动程序。
创建包含以下内容的deploy-hostpath-csi.sh 脚本:
#!/bin/env bash
CSI_BASE_URL=https://raw.githubusercontent.com/kubernetes-csi
CSI_DRIVER_HOST_PATH_VERSION=v1.11.0
SNAPSHOTTER_VERSION="v6.3.1"
PROVISIONER_VERSION="v3.6.1"
RESIZER_VERSION="v1.9.1"
ATTACHER_VERSION="v4.4.1"
## Install external snapshotter CRD
kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/csi-snapshotter/rbac-csi-snapshotter.yaml
## Install external provisioner
kubectl apply -f "${CSI_BASE_URL}"/external-provisioner/"${PROVISIONER_VERSION}"/deploy/kubernetes/rbac.yaml
## Install external attacher
kubectl apply -f "${CSI_BASE_URL}"/external-attacher/"${ATTACHER_VERSION}"/deploy/kubernetes/rbac.yaml
## Install external resizer
kubectl apply -f "${CSI_BASE_URL}"/external-resizer/"${RESIZER_VERSION}"/deploy/kubernetes/rbac.yaml
## Install driver and plugin
kubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-driverinfo.yaml
kubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-plugin.yaml
## create volumesnapshotclass
kubectl 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 class
kubectl 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 -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
default minio 1/1 1 1 2d19h
kube-system coredns 2/2 2 2 2d20h
kube-system snapshot-controller 2/2 2 2 2d19h
local-path-storage local-path-provisioner 1/1 1 1 2d20h
postgresql-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 AGE
kube-system snapshot-controller 2/2 2 2 53s
default minio 1/1 1 1 70s
postgresql-operator-system postgresql-operator-controller-manager 1/1 1 1 2m15s
复制
五、创建具有备份配置的PostgreSQL集群
创建一个 PostgreSQL 集群并将其配置为使用 MinIO 进行备份。
创建包含以下内容的 cluster-example-with-backup.yaml 文件:
apiVersion: postgresql.k8s.enterprisedb.io/v1
kind: Cluster
metadata:
name: cluster-example-backup
spec:
instances: 2
storage:
storageClass: csi-hostpath-sc
size: 1Gi
# Backup properties
# This assumes a local minio setup
backup:
volumeSnapshot:
className: csi-hostpath-snapclass
barmanObjectStore:
destinationPath: s3://cluster-backups/
endpointURL: http://minio-service:9000
s3Credentials:
accessKeyId:
name: minio-creds
key: ACCESS_KEY_ID
secretAccessKey:
name: minio-creds
key: ACCESS_SECRET_KEY
wal:
compression: gzip
data:
immediateCheckpoint: true
retentionPolicy: "30d"
复制
Apply配置:
kubectl apply -f cluster-example-with-backup.yaml
复制
验证集群状态:
kubectl cnp status cluster-example-backup
复制
输出如下:
Cluster Summary
Name: cluster-example-backup
Namespace: default
System ID: 7389252359945887770
PostgreSQL Image: quay.io/enterprisedb/postgresql:16.3
Primary instance: cluster-example-backup-1
Primary start time: 2024-11-08 13:13:19 +0000 UTC (uptime 2m39s)
Status: Cluster in healthy state
Instances: 2
Ready instances: 2
复制
六、创建卷快照备份
创建volume-snapshot-backup.yaml 文件,如下:
apiVersion: postgresql.k8s.enterprisedb.io/v1
kind: Backup
metadata:
name: volume-snapshot-backup
spec:
cluster: cluster-example-backup
method: volumesnapshot
volumesnapshot:
className: csi-hostpath-snapclass
复制
部署配置:
kubectl apply -f volume-snapshot-backup.yaml
复制
验证状态:
kubectl cnp status backup volume-snapshot-backup
复制
预期输出:
Backup Summary
Name: volume-snapshot-backup
Cluster: cluster-example-backup
Type: volumeSnapshot
Status: Completed
Start 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/v1
kind: Backup
metadata:
name: backup-example
spec:
cluster:
name: cluster-example-backup
复制
7.2 部署配置
kubectl apply -f backup.yaml
复制
7.3 验证备份
kubectl get backup
复制
预期输出:
NAME AGE CLUSTER METHOD PHASE ERROR
backup-example 18s cluster-example-backup barmanObjectStore completed
snapshot-backup-1.23.2 2d19h cluster-example-backup volumeSnapshot completed
复制
7.4 获取备份详细信息
kubectl describe backup backup-example
复制
输出如下:
Name: backup-example
Namespace: default
Labels: <none>
Annotations: <none>
API Version: postgresql.k8s.enterprisedb.io/v1
Kind: Backup
Metadata:
Creation Timestamp: 2024-11-11T08:21:30Z
Generation: 1
Resource Version: 81003
UID: edb065b4-41d9-433c-82d0-2f0deceee4c1
Spec:
Cluster:
Name: cluster-example-backup
Method: barmanObjectStore
Status:
Backup Id: 20241111T082133
Backup Name: backup-20241111082132
Begin LSN: 0/6008870
Begin Wal: 000000010000000000000006
Destination Path: s3://cluster-backups/
End LSN: 0/8000000
End Wal: 000000010000000000000008
Endpoint URL: http://minio-service:9000
Instance ID:
Container ID: containerd://ddcb4c8e5ddac49991b1a363d4619ec9b0e15bebbdab4e0f831bd57ac4057f55
Pod Name: cluster-example-backup-2
Method: barmanObjectStore
Phase: completed
s3Credentials:
Access Key Id:
Key: ACCESS_KEY_ID
Name: minio-creds
Secret Access Key:
Key: ACCESS_SECRET_KEY
Name: minio-creds
Server Name: cluster-example-backup
Started At: 2024-11-11T08:21:33Z
Stopped At: 2024-11-11T08:21:34Z
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Starting 89s cloud-native-postgresql-backup Starting backup for cluster cluster-example-backup
Normal Starting 88s instance-manager Backup started
Normal 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 -> 9000
Forwarding from [::1]:9000 -> 9000
Handling connection for 9000
Handling connection for 9000
Handling 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 微信群 |

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