当前位置:首页 > 问答 > 正文

树叶云里用CrunchyData PGO搞Postgres集群,怎么建连删一步步说给你听

主要依据Crunchy Data官方PGO项目文档(github.com/CrunchyData/postgres-operator)以及相关博客文章。

咱们得知道PGO是啥,PGO是个Kubernetes的Operator,你就把它想象成是一个住在Kubernetes集群里的超级管家,你只要告诉这个管家你想要一个什么样的PostgreSQL数据库(要多大容量、几个副本、什么密码),它就会自动帮你把数据库集群创建好、管理好,包括备份、恢复、扩容这些麻烦事,它都能替你干了,树叶云就是一个用了Kubernetes的云环境,所以在上面用PGO来管PostgreSQL非常合适。

第一步:安装PGO管家

在你开始创建Postgres集群之前,你得先把PGO这个管家请到你的Kubernetes集群里来,树叶云可能已经预装好了,如果没有,你需要自己安装。

  1. PGO提供了一个叫kustomize的配置文件包,你先得把这个配置包下载到你的本地电脑上。
  2. 你用kubectl apply命令,把PGO需要的各种部件(比如它的Deployment、ServiceAccount、Role等等)安装到Kubernetes一个叫postgres-operator的命名空间里。
  3. 安装完成后,你可以用kubectl get pods -n postgres-operator命令看看PGO管家的“小机器人”(Pod)有没有在正常运行,看到状态是Running就对了。

来源:PGO文档中的“Installation”部分。

第二步:创建第一个Postgres集群

树叶云里用CrunchyData PGO搞Postgres集群,怎么建连删一步步说给你听

管家就位了,现在可以下令让它创建数据库集群了,PGO管集群不是用我们常见的Kubernetes原生配置,而是用了一个它自己定义的资源类型,叫PostgresCluster

  1. 你需要编写一个YAML文件,比如叫my-cluster.yaml,在这个文件里,你会像填表格一样,告诉PGO你的数据库集群要长什么样。
  2. 在这个YAML里,最基本要写这几样东西:
    • metadata.name:给你的集群起个名字,比如hippo,这个名字以后会用到。
    • spec.image:用哪个版本的PostgreSQL镜像,比如registry.developers.crunchydata.com/crunchydata/crunchy-postgres:ubi8-14.5,这表示用PostgreSQL 14.5版本。
    • spec.postgresVersion:PostgreSQL的主版本号,比如14。
    • spec.instances:这是重头戏,定义实例,里面要写:
      • replicas:你要几个数据库副本,写2就是1个主库1个从库,提高可用性。
      • dataVolumeClaimSpec:数据库的数据存到哪里,这里要指定存储的大小(比如10Gi)和存储类型(比如树叶云提供的leaf-cloud-ssd这类StorageClass的名字)。
    • spec.users:定义数据库的初始用户,PGO会自动创建一个超级用户,你在这里可以指定用户名(比如hippo)并让PGO为你生成密码,或者你直接提供一个存有密码的Secret名字。
  3. 文件写好后,用kubectl apply -f my-cluster.yaml命令把这个配置提交给Kubernetes,PGO管家会监听到这个命令,然后开始忙活起来。
  4. 你可以用kubectl get postgrescluster命令查看集群的创建状态,用kubectl get pods可以看到数据库的Pod正在启动,等所有Pod都Running了,集群就创建好了。

来源:PGO文档中的“Tutorial”部分,特别是创建第一个集群的步骤。

第三步:怎么连接这个数据库

数据库集群跑起来了,你总得连上去用吧,连接需要几个信息:

树叶云里用CrunchyData PGO搞Postgres集群,怎么建连删一步步说给你听

  1. 找主机地址:PGO会给你的集群创建Service,你可以用kubectl get services命令查看,通常会有一个Service名字叫你的集群名(如hippo),还有一个叫hippo-replica,你连接主库读写就用hippo这个服务名,连接只读副本可以用hippo-replica
  2. 找密码:PGO会把密码存在一个Kubernetes的Secret里,Secret的名字一般是hippo-pguser-hippo(集群名-pguser-用户名),你可以用命令kubectl get secret hippo-pguser-hippo -o jsonpath='{.data.password}' | base64 -d来把密码解密显示出来,这个命令会输出明文密码,记下来。
  3. 组装信息:现在你有:
    • 主机名:hippo (因为在同一个Kubernetes命名空间内,直接用Service名就行)
    • 端口:5432 (PostgreSQL默认端口)
    • 数据库名:默认和用户名一样,比如hippo
    • 用户名:你在YAML里指定的,比如hippo
    • 密码:刚才用命令查出来的。
  4. 用任何PostgreSQL客户端(比如psql命令行,或者pgAdmin图形界面)拿着这些信息就能连了,比如在Kubernetes集群内部另一个Pod里,可以用psql postgresql://hippo:[密码]@hippo:5432/hippo这样的连接串来连接。

来源:PGO文档中关于“Connect to a Cluster”的部分。

第四步:删除集群

如果你不想要这个集群了,想清理掉,也非常简单,因为PGO是声明式的管理,你删除你声明的东西就行了。

  1. 直接用创建集群时用的那个YAML文件,执行删除命令:kubectl delete -f my-cluster.yaml
  2. 这个命令会告诉PGO管家:“我当初要的那个集群不要了”,管家就会开始清理工作,自动把相关的Pod、Service、Volume Claim等资源都删掉。
  3. 重要提醒:默认情况下,删除操作不会删除你的数据持久化卷(PVC),这是为了防止你误操作导致数据全部丢失,数据卷会保留在原地。
  4. 如果你确认数据也不要了,想彻底清空,你需要手动删除PVC,可以用命令kubectl get pvc找到和你集群相关的PVC(名字里会包含集群名如hippo),然后用kubectl delete pvc [PVC名字]一个一个删除。

来源:PGO文档和Kubernetes通用知识,关于资源删除和PVC保留策略。

总结一下就是在树叶云上,用PGO搞Postgres集群就是四步:先请管家(安装PGO),再下订单(用YAML创建PostgresCluster),然后根据管家给的门牌号和钥匙连接(通过Service和Secret),最后不要了就让管家清理(删除PostgresCluster资源),整个过程你不需要去手动处理复杂的数据库配置和运维,非常省心。