文章目录
-
- [一、为什么选择 Crunchy Data Operator?](#一、为什么选择 Crunchy Data Operator?)
-
- [1.1 核心价值](#1.1 核心价值)
- [1.2 架构概览](#1.2 架构概览)
- 二、环境准备
-
- [2.1 前置要求](#2.1 前置要求)
- [2.2 准备命名空间](#2.2 准备命名空间)
- [2.3 (可选)配置镜像仓库](#2.3 (可选)配置镜像仓库)
- [三、安装 Crunchy Data Operator](#三、安装 Crunchy Data Operator)
-
- [3.1 方法一:Helm 安装(推荐)](#3.1 方法一:Helm 安装(推荐))
-
- [添加 Helm 仓库](#添加 Helm 仓库)
- [安装 Operator](#安装 Operator)
- 验证安装
- [3.2 方法二:kubectl apply(YAML)](#3.2 方法二:kubectl apply(YAML))
- [四、创建 PostgreSQL 集群](#四、创建 PostgreSQL 集群)
-
- [4.1 编写 PostgresCluster CR(Custom Resource)](#4.1 编写 PostgresCluster CR(Custom Resource))
- [4.2 应用配置](#4.2 应用配置)
- [4.3 验证集群状态](#4.3 验证集群状态)
- 五、高可用与读写分离
-
- [5.1 配置只读副本(Replicas)](#5.1 配置只读副本(Replicas))
- [5.2 连接服务(Services)](#5.2 连接服务(Services))
- [5.3 故障转移(Failover)](#5.3 故障转移(Failover))
- 六、备份与恢复(PITR)
-
- [6.1 备份策略](#6.1 备份策略)
- [6.2 手动触发备份](#6.2 手动触发备份)
- [6.3 时间点恢复(PITR)](#6.3 时间点恢复(PITR))
- 七、监控与告警
-
- [7.1 启用 Metrics](#7.1 启用 Metrics)
- [7.2 暴露指标端点](#7.2 暴露指标端点)
- [7.3 集成 Prometheus + Grafana](#7.3 集成 Prometheus + Grafana)
- 八、安全加固
-
- [8.1 TLS 加密](#8.1 TLS 加密)
- [8.2 网络策略(NetworkPolicy)](#8.2 网络策略(NetworkPolicy))
- [8.3 密钥管理](#8.3 密钥管理)
- 九、连接应用
-
- [9.1 获取连接信息](#9.1 获取连接信息)
- [9.2 应用部署示例(Deployment)](#9.2 应用部署示例(Deployment))
- 十、升级与维护
-
- [10.1 升级 PostgreSQL 版本](#10.1 升级 PostgreSQL 版本)
- [10.2 升级 PGO Operator](#10.2 升级 PGO Operator)
- [10.3 扩容存储](#10.3 扩容存储)
- 十一、常见问题排查
-
- [11.1 Pod 无法启动](#11.1 Pod 无法启动)
- [11.2 备份失败](#11.2 备份失败)
- [11.3 连接拒绝](#11.3 连接拒绝)
在云原生时代,PostgreSQL 的 Kubernetes 化部署 已成为企业构建高可用、弹性、自动化数据库平台的标准路径。而 Crunchy Data Postgres Operator(PGO) 作为 CNCF 沙箱项目、Red Hat OpenShift 认证的开源方案,凭借其生产就绪、功能完整、社区活跃等优势,成为管理 Kubernetes 上 PostgreSQL 集群的事实标准之一。
本文将从 架构原理、环境准备、安装部署、集群创建、高可用配置、备份恢复、监控告警、安全加固、升级维护 等维度,详解如何在 Kubernetes 中部署并运维基于 Crunchy Data Operator 的 PostgreSQL 集群。
官方资源:
一、为什么选择 Crunchy Data Operator?
1.1 核心价值
- 自动化运维:自动创建主从复制、故障转移、备份、监控
- 声明式 API :通过
PostgresClusterCRD 定义数据库期望状态 - 企业级特性 :
- 同步/异步流复制
- 基于 pgBackRest 的全量/增量/ PITR 备份
- TLS 加密(客户端/副本间)
- RBAC 权限控制
- Prometheus + Grafana 监控集成
- 多云兼容:支持 AWS EKS、Azure AKS、GCP GKE、OpenShift、本地 K8s
1.2 架构概览
- Operator :运行在 K8s 控制平面,监听
PostgresCluster资源 - Primary/Replica:标准 PostgreSQL Pod,启用流复制
- pgBackRest:专用备份工具,支持压缩、加密、增量
- pgBouncer(可选):连接池,减少主库连接压力
二、环境准备
2.1 前置要求
| 组件 | 版本要求 |
|---|---|
| Kubernetes | v1.23+ |
| Helm | v3.7+(推荐) |
| kubectl | 与 K8s 版本兼容 |
| 存储类(StorageClass) | 支持动态卷供应(如 AWS EBS、GCE PD、Ceph RBD) |
| 备份存储 | S3 兼容对象存储 或 NFS |
注意:不支持 Docker Desktop 内置 K8s(资源不足),建议使用 minikube(≥4CPU/8GB RAM)或云厂商托管集群。
2.2 准备命名空间
bash
kubectl create namespace pgo
2.3 (可选)配置镜像仓库
若网络受限,可预先拉取镜像:
bash
# Crunchy 官方镜像(默认)
registry.developers.crunchydata.com/crunchydata/postgres-operator:ubi8-5.4.0
registry.developers.crunchydata.com/crunchydata/crunchy-postgres:ubi8-15.4-0
registry.developers.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.46-0
三、安装 Crunchy Data Operator
3.1 方法一:Helm 安装(推荐)
添加 Helm 仓库
bash
helm repo add crunchy https://charts.crunchydata.com
helm repo update
安装 Operator
bash
helm install pgo crunchy/postgres-operator \
--namespace pgo \
--version 5.4.0 \
--set image.repository=registry.developers.crunchydata.com/crunchydata/postgres-operator \
--set image.tag=ubi8-5.4.0
关键参数说明:
create_namespace=false:已手动创建pgo命名空间watched_namespace="":监控所有命名空间(默认仅pgo)metrics=true:启用 Prometheus 指标
验证安装
bash
kubectl get pods -n pgo
# 应看到 pgo-xxx 运行中
kubectl get crd | grep postgres
# 应包含 postgresclusters.postgres-operator.crunchydata.com
3.2 方法二:kubectl apply(YAML)
bash
kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v5.4.0/install.yaml
不推荐:难以定制化,升级复杂。
四、创建 PostgreSQL 集群
4.1 编写 PostgresCluster CR(Custom Resource)
创建 hippo.yaml:
yaml
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: hippo
namespace: pgo
spec:
image: registry.developers.crunchydata.com/crunchydata/crunchy-postgres:ubi8-15.4-0
postgresVersion: 15
instances:
- name: instance1
dataVolumeClaimSpec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: 10Gi
storageClassName: gp2 # AWS EBS 示例
backups:
pgbackrest:
image: registry.developers.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.46-0
repos:
- name: repo1
volume:
volumeClaimSpec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: 100Gi
storageClassName: gp2
users:
- name: myapp
databases:
- mydb
options: "SUPERUSER" # 生产环境慎用
4.2 应用配置
bash
kubectl apply -f hippo.yaml
4.3 验证集群状态
bash
# 查看集群状态
kubectl get postgresclusters -n pgo
# 查看 Pod
kubectl get pods -n pgo -l postgres-operator.crunchydata.com/cluster=hippo
# 预期输出:
# hippo-instance1-xxxxx (Primary)
# hippo-repo-host-xxxxx (Backup)
# hippo-instance1-xxxxx (Replica, 若配置了 replicas)
首次启动耗时较长(5~10 分钟),因需初始化数据目录、创建用户、启动备份。
五、高可用与读写分离
5.1 配置只读副本(Replicas)
在 instances 下添加 replicas 字段:
yaml
instances:
- name: instance1
replicas: 2 # 创建 2 个只读副本
...
原理 :Operator 自动配置流复制,副本通过
repmgr或原生primary_conninfo连接主库。
5.2 连接服务(Services)
PGO 自动创建以下 Service:
hippo-primary: 指向主库(写入)hippo-read-only: 负载均衡到所有副本(只读)hippo: 指向主库(兼容旧应用)
5.3 故障转移(Failover)
-
自动:主库 Pod 宕机后,Operator 在 30 秒内提升一个副本为主库
-
手动 :通过
pgo failover命令触发bashkubectl exec -n pgo deploy/pgo -- pgo failover hippo --target-standby=hippo-instance1-xxxxx
六、备份与恢复(PITR)
6.1 备份策略
PGO 使用 pgBackRest,支持:
- 全量备份(Full)
- 增量备份(Incremental)
- WAL 归档(连续归档)
默认每 1 小时增量备份,每天全量备份。
6.2 手动触发备份
bash
# 创建全量备份
kubectl exec -n pgo deploy/pgo -- pgo backup hippo --backup-type=full
# 查看备份状态
kubectl get postgresclusters -n pgo hippo -o jsonpath='{.status.backups.pgbackrest.repos[0].backupList}'
6.3 时间点恢复(PITR)
创建新集群,从备份恢复到指定时间:
yaml
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: hippo-restored
spec:
dataSource:
pgbackrest:
stanza: db
configuration:
- secret:
name: hippo-pgbackrest-config # 自动创建的 Secret
repo:
name: repo1
s3: ... # 若使用 S3
options:
- --type=time
- --target="2025-02-18 09:00:00+00"
# ... 其他配置同原集群
注意:恢复会创建全新集群,不影响原集群。
七、监控与告警
7.1 启用 Metrics
在安装 Operator 时设置 metrics=true,或更新 Helm Release:
bash
helm upgrade pgo crunchy/postgres-operator -n pgo --set metrics=true
7.2 暴露指标端点
每个 PostgreSQL Pod 暴露 /metrics(端口 9187),由 postgres_exporter 提供。
7.3 集成 Prometheus + Grafana
- Prometheus:通过 ServiceMonitor 自动发现目标
- Grafana Dashboard :导入 PGO 官方 Dashboard
yaml
# 示例 ServiceMonitor(若未自动创建)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: pgo-monitor
namespace: pgo
spec:
selector:
matchLabels:
postgres-operator.crunchydata.com/cluster: hippo
endpoints:
- port: exporter
interval: 15s
八、安全加固
8.1 TLS 加密
PGO 自动生成 TLS 证书(基于 cert-manager 或自签名):
yaml
spec:
patroni:
dynamicConfiguration:
postgresql:
parameters:
ssl: "on"
customTLSSecret:
name: hippo.tls # 指向自定义 Secret(含 tls.crt/tls.key)
8.2 网络策略(NetworkPolicy)
限制访问来源:
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-to-pg
spec:
podSelector:
matchLabels:
postgres-operator.crunchydata.com/cluster: hippo
ingress:
- from:
- podSelector:
matchLabels:
app: myapp
ports:
- protocol: TCP
port: 5432
8.3 密钥管理
- 用户密码存储在 Secret 中:
hippo-pguser-myapp - 备份密钥:
hippo-pgbackrest-repo1 - 禁止硬编码密码,应用通过 Secret 挂载获取
九、连接应用
9.1 获取连接信息
bash
# 获取用户名
kubectl get secrets -n pgo hippo-pguser-myapp -o go-template='{{index .data "user" | base64decode}}'
# 获取密码
kubectl get secrets -n pgo hippo-pguser-myapp -o go-template='{{index .data "password" | base64decode}}'
# 获取主库地址
hippo-primary.pgo.svc.cluster.local
# 获取只读地址
hippo-read-only.pgo.svc.cluster.local
9.2 应用部署示例(Deployment)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
containers:
- name: app
env:
- name: DB_HOST
value: "hippo-primary"
- name: DB_USER
valueFrom:
secretKeyRef:
name: hippo-pguser-myapp
key: user
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: hippo-pguser-myapp
key: password
十、升级与维护
10.1 升级 PostgreSQL 版本
PGO 支持滚动升级(需主版本兼容,如 14 → 15):
yaml
spec:
postgresVersion: 16 # 修改版本号
image: ...crunchy-postgres:ubi8-16.1-0
注意 :跨大版本需先执行
pg_upgrade,PGO v5+ 支持自动升级。
10.2 升级 PGO Operator
bash
helm upgrade pgo crunchy/postgres-operator -n pgo --version 5.5.0
兼容性 :确保新 Operator 支持现有
PostgresClusterCRD 版本。
10.3 扩容存储
直接修改 dataVolumeClaimSpec.resources.requests.storage,K8s 自动扩容(需 StorageClass 支持)。
十一、常见问题排查
11.1 Pod 无法启动
- 检查 PVC :
kubectl get pvc -n pgo - 查看日志 :
kubectl logs -n pgo <pod-name> database
11.2 备份失败
- 检查 repo Pod :
kubectl logs -n pgo hippo-repo-host-xxxxx - 验证存储权限:NFS/S3 是否可写
11.3 连接拒绝
- 确认 Service 存在 :
kubectl get svc -n pgo - 检查 NetworkPolicy:是否放行流量
总结:Crunchy Data Postgres Operator 将 PostgreSQL 的复杂运维抽象为声明式 YAML,实现了:
- 一键部署高可用集群
- 自动化备份与 PITR 恢复
- 无缝集成云原生监控体系
- 企业级安全与网络策略
通过本文的系统化部署指南,你已掌握从零搭建生产级 PG on K8s 的核心能力。下一步可探索:
- 多集群灾备(跨区域复制)
- 与 Istio 服务网格集成
- 自定义监控告警规则
在云原生数据库的浪潮中,PGO 不仅是工具,更是现代化数据基础设施的基石。