Clever Castle
696 words
3 minutes
部署PostgreSQL到k8s

postgresql有两个被经常使用的k8s operator

CrunchyData/postgres-operator

zalando/postgres-operator

前者由一家专业做Postgresql部署的公司提供,后者由服饰零售巨头zalando提供。

Zalando Operator的优缺点

优点

  1. Zalando是Patroni的官方维护者,Patroni是常用的Postgresql HA开源方案
  2. 使用pg_basebackup来备份恢复,支持多线程备份
  3. 功能更为强大,其中的Spilo提供了许多功能
  4. 默认支持逻辑备份

缺点

  1. 文档不够完善,没有example
  2. operator与namespace绑定,只作用与当前namespace
  3. 许多与db相关的配置需要写在operator的配置中,物理备份到s3的配置比较复杂
  4. 不太方便更改image

CrunchyData Operator的优缺点

优点:

  1. 文档较为完善,有example
  2. 更改image较为方便
  3. 功能完整,部署,备份,恢复等功能都已经完备
  4. 有cli工具

缺点:

  1. 默认提供pgo cli,许多文档pgo cli与k8s配置文件混杂,有所混乱

本次部署采用了CrunchyData的方案,下面又是也简称为pgo.

部署#

安装CRD#

配置文件#

配置文件中比较特殊的是备份相关的配置。一般来说,可以将备份存到s3中。

backups:
  pgbackrest:
    image: crunchy-pgbackrest:centos8-2.33-1
    configuration:
      - secret:
          name: pgo-s3-creds
    repoHost:
      dedicated: { }
    global:
      repo1-path: /pgbackrest/postgres/pg-ha/beta/repo1
      repo1-retention-full: "30"
      repo1-retention-full-type: time
    repos:
      - name: repo1
        schedules:
          full: "3 0 * * *"
          incremental: "13 */1 * * *"
        s3:
          bucket: "database-non-prod"
          endpoint: "oss-cn-hangzhou.aliyuncs.com"
          region: "oss‑cn‑hangzhou"

备份与恢复#

配置好pgbackrest,备份功能就已经开始工作。

恢复数据库有3种方式

PITR#

可以新建一个数据库来clone另外一个数据库。这种方式有两个前提,被克隆的数据必须正在运行,且必须有不晚于指定时间的备份。

spec:
  dataSource:
    postgresCluster:
      clusterName: hippo
      repoName: repo1
      options:
        - --type=time
        - --target="2021-06-09 14:15:11 EDT"

In-Place PITR#

可以将当前数据恢复到之前某一个时间点的数据状态

spec:
  backups:
    pgbackrest:
      restore:
        enabled: true
        repoName: repo1
        options:
          - --type=time
          - --target="2021-06-09 14:15:11 EDT"

Standby Cluster restore#

pgo提供了一种方法,可以跨k8s集群来部署Postgresql。这一便利可以用来从s3中恢复数据库

  1. 创建standby postgresql数据库,并将back指向有备份文件的s3仓库,此时该数据库只能读不能写
  2. prompt standby postgresql数据库,该数据库可以正常读写

第一步

spec:
  standby:
    enabled: true
    repoName: repo1

第二步

spec:
  standby:
    enabled: false

如何连接Postgresql#

连接postgres比较简单,pgo会生成多个service,可以选择pgbouncer或者pg-primary来连接,外部访问,只需要将这两个节点port-forward出来即可。

注意点#

下一步工作#

常用命令#

  1. 导入pg_dump备份的文件
cat db-backup-21-08-24-07-00.sql | psql -h localhost -p 5432 --username username
  1. 获取secret中某个值
kubectl -n postgres get secrets/hippo-ha-pguser-hippo-ha --template={{.data.password}} | base64 -d

使用crunchydata

  1. 恢复 利用standby
  2. 最后将standyby.enabled: false 来启动集群

pgbackrest info

pgbackrest —stanza=db —log-level-console=info check

部署PostgreSQL到k8s
https://blog.ivyxjc.com/posts/pg-k8s-operator/
Author
ivyxjc
Published at
2021-08-25