DBAtlas · 数据库运维图谱

Kubernetes 上的数据库(operator)

症状

目标:借助 operator 在 Kubernetes 上运行数据库;使用 operator 提供的自动故障转移、持久存储和备份功能,而不是单纯的 StatefulSet。

1. 为什么需要 operator:仅有 StatefulSet 是不够的

普通的 StatefulSet 为你提供具有稳定标识的 pod 和 PVC,但不包含故障转移、复制搭建、备份和升级的逻辑。operator 将这些数据库特有的运维知识打包为 controller + 自定义资源(CRD)。你编写一个名为 'Cluster' 的 CR,operator 就会管理其背后的 StatefulSet、Service、Secret 和备份作业。在生产环境中,通常首选用 operator 运行数据库。

PostgreSQL

# operators for PostgreSQL:
#  - CloudNativePG (CNPG)
#  - Zalando postgres-operator
#  - Crunchy PGO

2. 选择并安装 operator

为你的引擎选择 operator:PostgreSQL 可选 CloudNativePG 或 Zalando postgres-operator;MySQL 和 MongoDB 常用 Percona 的 operator(Percona Operator for MySQL / for MongoDB)。用 Helm 或 bundle 清单安装 operator;这一步会向集群添加 CRD 和 controller pod。

PostgreSQL

# CloudNativePG installation
kubectl apply --server-side -f \
  https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/releases/cnpg-1.24.0.yaml

MySQL

# Percona Operator for MySQL (Helm)
helm install my-op percona/pxc-operator

MongoDB

# Percona Operator for MongoDB (Helm)
helm install psmdb-op percona/psmdb-operator

3. 规划存储(StorageClass / PVC)

数据库状态保存在 PVC 中;在 CR 中指定要使用的 StorageClass。选择提供低延迟块存储的 StorageClass,最好是接近本地的 SSD;大多数数据库不建议使用网络文件系统(NFS)。从一开始就正确设置 PVC 大小和可扩展性(allowVolumeExpansion),因为缩容很困难。

PostgreSQL

spec:
  storage:
    storageClass: fast-ssd
    size: 50Gi

4. 应用 Cluster CR(副本与自动故障转移)

在 CR 中指定实例/副本数;operator 会搭建同步/异步复制,并在主库故障时通过提升副本执行自动故障转移。应用应连接到 operator 创建的 '-rw'(读写)Service;该服务始终指向当前主库。因此故障转移期间连接目标不会改变。

PostgreSQL

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: app-db
spec:
  instances: 3
  storage:
    storageClass: fast-ssd
    size: 50Gi
# the application connects to: app-db-rw

5. 通过 CR 将备份写入 S3

operator 也以声明式方式管理备份:你在 CR 中定义主备份目标(对象存储/S3)和 WAL 归档。在 CloudNativePG 中,S3 信息通过 spec.backup.barmanObjectStore 指定(自 1.26 起已弃用;新部署请使用 Barman Cloud Plugin 及其 ObjectStore 资源);持续的 WAL 归档 + 基础备份可实现时间点恢复。凭据从 Kubernetes Secret 中引用。

PostgreSQL

spec:
  backup:
    barmanObjectStore:
      destinationPath: s3://company-backup/app-db
      s3Credentials:
        accessKeyId:
          name: s3-creds
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: s3-creds
          key: SECRET_ACCESS_KEY

6. 定时备份与还原 CR

一次性备份创建 Backup CR,定时备份创建 ScheduledBackup CR;用 cron 表达式定期执行基础备份。还原同样是声明式的:通过 'bootstrap.recovery' 从现有的对象存储备份引导一个新的 Cluster。定期进行还原演练;只做备份是不够的,要测试恢复。

PostgreSQL

apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: nightly-backup
spec:
  schedule: "0 0 2 * * *"
  cluster:
    name: app-db
在 DBAtlas 中打开 →