2025年05月最新!PostgreSQL开源项目在Kubernetes集群的实践指南

云信安装大师
90
AI 质量分
10 5 月, 2025
2 分钟阅读
0 阅读

2025年05月最新!PostgreSQL开源项目在Kubernetes集群的实践指南

引言

随着云原生技术的普及,越来越多的企业选择将PostgreSQL数据库部署在Kubernetes集群中。本文将详细介绍如何在2025年最新的Kubernetes环境中部署和管理PostgreSQL数据库,包括高可用配置、备份恢复等实用技巧。

准备工作

环境要求

  • Kubernetes集群(v1.28+)
  • kubectl命令行工具
  • Helm包管理器(v3.12+)
  • 至少2个可用节点,每个节点4GB以上内存
  • StorageClass配置(推荐使用本地存储或云存储)

前置知识

  • 基本的Kubernetes概念(Pod、Deployment、Service等)
  • PostgreSQL基础操作
  • Helm基础使用

详细步骤

1. 安装PostgreSQL Operator

我们推荐使用CloudNativePG这个开源Operator来管理PostgreSQL集群:

代码片段
# 添加CloudNativePG Helm仓库
helm repo add cnpg https://cloudnative-pg.github.io/charts

# 更新仓库
helm repo update

# 安装Operator
helm install cnpg \
    --namespace cnpg-system \
    --create-namespace \
    cnpg/cloudnative-pg \
    --version "2.5.0"

参数说明:
--namespace: 指定Operator安装的命名空间
--create-namespace: 如果命名空间不存在则创建
--version: 指定Operator版本(2025年5月最新稳定版)

2. 创建PostgreSQL集群

创建一个名为my-postgresql的3节点高可用集群:

代码片段
# postgresql-cluster.yaml
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: my-postgresql
spec:
  instances: 3
  imageName: ghcr.io/cloudnative-pg/postgresql:16.2-alpine

  storage:
    size: 10Gi
    storageClass: standard

  backup:
    barmanObjectStore:
      destinationPath: "s3://my-bucket/postgres-backups"
      s3Credentials:
        accessKeyId:
          name: aws-creds
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: aws-creds
          key: SECRET_ACCESS_KEY

    retentionPolicy: "30d"

  monitoring:
    enablePodMonitor: true

resources:
    requests:
      cpu: "500m"
      memory: "1Gi"

应用配置:

代码片段
kubectl apply -f postgresql-cluster.yaml -n my-database-ns

关键配置解析:
instances: PostgreSQL实例数量,实现高可用需要至少3个节点
imageName: PostgreSQL镜像版本(2025年最新稳定版)
storage.size: PVC大小,根据业务需求调整
backup: S3备份配置,确保数据安全

3. 验证部署状态

检查Pod运行状态:

代码片段
kubectl get pods -n my-database-ns -l cnpg.io/cluster=my-postgresql -w

# 预期输出:
NAME                READY   STATUS    RESTARTS   AGE
my-postgresql-1     1/1     Running   0          2m10s
my-postgresql-2     1/1     Running   0          2m8s 
my-postgresql-3     1/1     Running   0          2m5s 

检查集群状态:

代码片段
kubectl describe cluster my-postgresql -n my-database-ns

# 查看主节点信息:
kubectl exec -it my-postgresql-1 -n my-database-ns -- psql -c "SELECT * FROM pg_stat_replication;"

4. 连接PostgreSQL数据库

获取连接信息:

代码片段
# Service名称自动生成规则为<cluster-name>-rw(读写)和<cluster-name>-r(只读)
kubectl get svc -n my-database-ns | grep my-postgresql

# Port-forward本地连接测试(生产环境应使用Ingress或LoadBalancer)
kubectl port-forward svc/my-postgresql-rw -n my-database-ns 5432:5432 &

使用psql连接:

代码片段
psql -h localhost -U postgres

# Kubernetes自动生成的密码可以通过以下命令获取:
kubectl get secret my-postgresql-app -n my-database-ns -o jsonpath='{.data.password}' | base64 --decode; echo 

5. (可选)启用监控集成

如果你已经安装了Prometheus Operator:

代码片段
apiVersion: monitoring.coreos.com/v1 
kind: PodMonitor 
metadata:
 name: my-postgresql-monitor 
 namespace: monitoring 
spec:
 selector:
   matchLabels:
     cnpg.io/cluster: my-postgresql 
 podMetricsEndpoints:
   - port: metrics 
     path: /metrics 
 namespaceSelector:
   matchNames:
     - my-database-ns 

PostgreSQL高级配置实践

HPA自动伸缩配置

为应对流量高峰,可以配置Horizontal Pod Autoscaler:

代码片段
apiVersion: autoscaling/v2 
kind: HorizontalPodAutoscaler 
metadata:
 name: pg-hpa 
 namespace: my-database-ns 
spec:
 scaleTargetRef:
   apiVersion: postgresql.cnpg.io/v1 
   kind: Cluster 
   name: my-postgresql 
 minReplicas: x  
 maxReplicas:x  
 metrics:
   - type:Pods  
     pods:
       metricName:"connections"  
       targetAverageValue:"100"  
       container:"postgres"  

注意事项:
1. PostgreSQL不是无状态应用,自动伸缩需谨慎处理连接数指标而非CPU/Memory指标。
2. Kubernetes重启Pod时会导致客户端连接中断,建议结合连接池使用。

PostgreSQL备份与恢复实践

S3定时备份验证测试:

手动触发备份:
“`bash kubectl annotate cluster/my-postgresql \
-n my-database-ns \
cnpg.io/reload=”true” \
backup=”$(date +%Y%m%d%H%M%S)”

查看备份状态:

kubectl get backup –n my-database-ns

从备份恢复:

apiVersion:”postgre sql.cn pg.io/v l” kind:”Cluster” metadata:{name:”restored-cluster”} spec:{bootstrap:{recovery:{backup:{name:”backup-name”} targetTime:”2025–05–01T12 :00 :00Z”}}}}

代码片段
**实践经验分享:**
*定期验证备份有效性非常重要。建议每月执行一次恢复演练*

##常见问题解决  

*Q:* Pod启动失败并显示`Init :O/Create Secret Error`  

*A:*这通常是由于StorageClass不可用导致的。解决方案:

检查StorageClass是否可用:kubectl get storageclass

如果不可用,可以修改为hostPath(仅限测试环境):spec.storage.storageClass=””spec.storage.persistentVolumeReclaimPolicy=Retain

Q:主从切换后应用连接中断

A:建议:

使用Service的read-write和read-only endpoints而非直接连接Pod IP
在应用层实现重试逻辑
考虑使用PgBouncer作为中间层

总结

本文介绍了2025年最新版PostgreSQL在Kubernetes上的最佳实践,包括:

使用CloudNativePG Operator简化管理
三节点高可用架构
基于S3的自动备份方案
监控集成方法
常见问题解决方案

通过Kubernetes部署PostgreSQL可以获得以下优势:

自动化运维(扩缩容、故障转移) 声明式配置管理
与云原生生态无缝集成
资源利用率提升

后续可考虑进一步优化:

读写分离架构
跨区域部署实现灾备
性能调优(shared_buffers等参数)

原创 高质量