给小白的 PG 容器化部署教程(下)

2022-06-02  本文已影响0人  RadonDB

作者:王志斌

编辑:钟华龙

本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分为上下两部分,《第一部 Kubernetes 环境准备》已经发布。第二部分将带大家部署一个 RadonDB PostgreSQL Operator 和集群。

什么是 RadonDB PostgreSQL Operator?

RadonDB PostgreSQL 是一款基于 PostgreSQL 使用 Operator 实现的数据库容器化项目。

RadonDB PostgreSQL Operator 可基于 KubeSphere、OpenShift、Rancher 等 Kubernetes 容器平台交付。可自动执行与运行 RadonDB PostgreSQL 集群有关的任务。

RadonDB PostgreSQL Operator基于 https://github.com/CrunchyData/postgres-operator 项目实现,进行了改进优化,后续会持续回馈给社区。

仓库地址:https://github.com/radondb/radondb-postgresql-operator

一、部署 RadonDB PostgreSQL 集群

安装 Helm

curl  https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

准备本地存储

本次实验 RadonDB PostgreSQL 集群数据持久化采用 Local Persistent Volumes,以下的步骤为配置集群所使用的本地持久化存储卷,配置一个一主一从的高可用集群,最低需要三个持久化存储卷:

  1. PostgreSQL Primary 数据卷
  2. PostgreSQL Replica 数据卷
  3. PostgreSQL 备份卷

实际使用可以根据具体的情况,灵活配置存储卷。

大体步骤:

  1. 虚拟机添加新硬盘(每台虚拟机分别添加一块)
  2. 重启虚拟机
  3. 查看现磁盘是否正常挂载
fdisk -l

可看到新加的虚拟硬盘,一般名为: Disk /dev/sdb
给新加的硬盘分区。

fdisk /dev/sdb

#按照提示增加新分区 
/dev/sdb1 /dev/sdb2 /dev/sdb13

格式化磁盘分区。用 ext4 格式对 /dev/sdb1 进入格式化。

mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkfs.ext4 /dev/sdb3

挂载分区,创建新的挂载点。

mkdir -p /data/pgdata/pv{1..3}

将新磁盘分区挂载到 /work 目录下。

mount -t ext4 /dev/sdb1 /data/pgdata/pv1
mount -t ext4 /dev/sdb3 /data/pgdata/pv2
mount -t ext4 /dev/sdb4 /data/pgdata/pv3

查看挂载

df -h

可以看到新加的硬盘: /dev/sdb1 /dev/sdb2 /dev/sdb3
实现开机自动挂载。

vim /etc/fstab

在最后一行加入:

/dev/sdb1 /data/pgdata/pv1 ext4 defaults 0 2
/dev/sdb2 /data/pgdata/pv2 ext4 defaults 0 2
/dev/sdb3 /data/pgdata/pv3 ext4 defaults 0 2

创建命名空间

kubectl create namespace pgo

部署 PostgreSQL Operator

kubectl apply -f https://github.com/radondb/radondb-postgresql-operator/blob/main/installers/kubectl/postgres-operator.yml -n pgo

# 查看状态
kubectl get all -n pgo --selector=name=postgres-operator
file

安装静态本地盘控制器

Kubernetes 当前支持静态分配的本地存储。可使用 local-static-provisioner[1] 项目中的 local-volume-provisioner 程序创建本地存储对象。

git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git 
cd sig-storage-local-static-provisioner 

# 主要修改行号
vi helm/provisioner/values.yaml 

66  classes: 
67  - name: fast-disks 
70  hostDir: /data/pgdata 
76  volumeMode: Filesystem 
81  fsType: ext4
116 image: quay.io/external_storage/local-volume-provisioner:v2.4.0 

# 
helm install localprovi . -n kube-system 

# podpv 
kubectl get po -n kube-system -l app.kubernetes.io/name=provisioner
file

部署数据库集群

启用 PGO 客户端,创建数据库集群。

kubectl exec -it -n pgo  $(kubectl get po -n pgo -l name=pgo-client  -o jsonpath='{range .items[*]}{.metadata.name}{end}')  -- bash
pgo create cluster radondb --storage-config=fast-disks

部分参数可参见下表,并可执行 pgo 命令行帮助 pgo --help 获取更详细的部署参数帮助。

命令行 命令说明
--pgbackrest-storage-type="s3" 备份存储的类型。支持 posix 、s3、gcs、posix,s3 和 posix,gcs五种类型。
--replica-count=3 PostgeSQL副本数量。
--ccp-image=radondb-postgres-ha 使用的镜像名称。 带 gis 插件的镜像,例如 radondb-postgres-gis-ha。 不带 gis 插件的镜像,例如 radondb-postgres-ha。
--ccp-image-prefix=docker.io/radondb 镜像仓库。
--ccp-image-tag=debian-14.2-2.1.1 dockerhub 上镜像的标签。
--pgbackrest-s3-endpoint=s3.pek3b.qingstor.com \ --pgbackrest-s3-key=xxxxx \ --pgbackrest-s3-key-secret=xxxx \ --pgbackrest-s3-bucket=xxxx \ --pgbackrest-s3-region=xxx \ --pgbackrest-s3-verify-tls=false 支持 s3 协议的对象存储设置,主要用于备份。若备份存储选择了 s3 则需要设置这部分参数。
--metrics 启用适用于 Prometheus 的指标收集器。
--pgbadger 启用 pgbadger。
--debug 调试模式。

执行以下命令观察集群创建过程。待所有 Pod 状态切换为 Running,则集群创建完成。

kubectl get po -n pgo --watch

检查 local pv 是否正常绑定

kubectl get pv -n pgo |grep ^local
file

二、连接 RadonDB PostgreSQL 集群

通过执行 pgo 命令连接,获取集群中用户账号信息。

pgo show user -n pgo radondb

以下以 RadonDB PostgreSQL 集群为示例,获取数据库账号并连接数据库。

 pgo show user -n pgo radondb --show-system-accounts
 CLUSTER  USERNAME    PASSWORD         EXPIRES STATUS ERROR 
--------- -------------- ------------------------ ------- ------ -----
radondb ccp_monitoring Dwpa|MCg,b4M+rY.>ZC0ONz4 never  ok        
radondb postgres    1a4R-d7Po=,PS@R:-=?[gP(9 never  ok      
radondb primaryuser   =B8x*Haf*dCq+V4hkGSfh/.} never  ok      
radondb testuser    yTFeeH1|^DX<Bx4[?:B_/Q;M never  ok 

此外,还可以通过 psql 工具连接。

查看服务:

kubectl -n pgo get svc
NAME               TYPE     CLUSTER-IP    EXTERNAL-IP  PORT(S)                 AGE
postgres-operator         ClusterIP  10.96.64.37   <none>     8443/TCP,4171/TCP,4150/TCP       58m
radondb             ClusterIP  10.96.171.227  <none>     10000/TCP,9187/TCP,2022/TCP,5432/TCP  5m42s
radondb-backrest-shared-repo  ClusterIP  10.96.235.247  <none>     2022/TCP                5m42s
radondb-pgbouncer        ClusterIP  10.96.234.49   <none>     5432/TCP                4m16s
radondb-replica         ClusterIP  10.96.67.45   <none>     10000/TCP,9187/TCP,2022/TCP,5432/TCP  3m50s

以 testuser 账号为示例,连接到数据库。

kubectl -n pgo port-forward svc/radondb 5432:5432 
PGPASSWORD='xxxxxxxxxxxxxxxxxxxxxxxx' psql -h localhost -p 5432 -U testuser radondb

查看集群

kubectl exec -it rp1-65798ccf5c-ftbp9 -n pgo -c database bash
file

可以看到图中为 3 节点集群。至此,RadonDB PostgreSQL 容器化数据库搭建完成。

引用链接

1.local-static-provisioner:https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner

致谢

RadonDB 开源社区向本文的投稿作者表示感谢!也期待更多的社区小伙伴的投稿~

上一篇 下一篇

猜你喜欢

热点阅读