PostgreSQL:如何在容器中部署 Crunchy Data Operator(Kubernetes 运维)

文章目录

    • [一、为什么选择 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 :通过 PostgresCluster CRD 定义数据库期望状态
  • 企业级特性
    • 同步/异步流复制
    • 基于 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 命令触发

    bash 复制代码
    kubectl 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 支持现有 PostgresCluster CRD 版本。

10.3 扩容存储

直接修改 dataVolumeClaimSpec.resources.requests.storage,K8s 自动扩容(需 StorageClass 支持)。


十一、常见问题排查

11.1 Pod 无法启动

  • 检查 PVCkubectl get pvc -n pgo
  • 查看日志kubectl logs -n pgo <pod-name> database

11.2 备份失败

  • 检查 repo Podkubectl 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 不仅是工具,更是现代化数据基础设施的基石

相关推荐
数据知道1 小时前
PostgreSQL:详解 PostgreSQL 与Hadoop与Spark的集成
hadoop·postgresql·spark
何中应1 小时前
Jenkins常用的任务触发器
运维·ci/cd·jenkins
AC赳赳老秦1 小时前
新能源AI趋势:DeepSeek分析光伏/风电数据,助力2026新能源运维升级
运维·人工智能·python·安全·架构·prometheus·deepseek
数据知道2 小时前
PostgreSQL:如何直接在数据库中查询 CSV/JSON文件?
数据库·postgresql·json
何中应2 小时前
如何在 Linux 系统中设置系统时间
linux·运维·服务器
only_Klein2 小时前
Jenkinsfile流水线设计解析
kubernetes·jenkins·argocd·cicd
雪碧聊技术2 小时前
4.CA证书的介绍?
运维·服务器
Web极客码2 小时前
如何使用 Sugar Calendar 插件打造一个可销售活动门票的 WordPress 网站
运维·服务器
leblancAndSherry3 小时前
阿里云轻量/ECS 实战:K3s + Helm + cert-manager + 云效 Codeup 全链路 CI/CD 落地(记录自用)
linux·运维·阿里云·ci/cd·kubernetes·云计算