作者:王志斌
编辑:钟华龙
本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分为上下两部分,《第一部 Kubernetes 环境准备》已经发布。第二部分将带大家部署一个 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
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash本次实验 RadonDB PostgreSQL 集群数据持久化采用 Local Persistent Volumes,以下的步骤为配置集群所使用的本地持久化存储卷,配置一个一主一从的高可用集群,最低需要三个持久化存储卷:
实际使用可以根据具体的情况,灵活配置存储卷。
大体步骤:
fdisk -l可看到新加的虚拟硬盘,一般名为: Disk /dev/sdb
给新加的硬盘分区。
fdisk /dev/sdb#按照提示增加新分区 /dev/sdb1 /dev/sdb2 /dev/sdb13格式化磁盘分区。用 ext4 格式对 /dev/sdb1 进入格式化。
mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdb2mkfs.ext4 /dev/sdb3挂载分区,创建新的挂载点。
mkdir -p /data/pgdata/pv{1..3}将新磁盘分区挂载到 /work 目录下。
mount -t ext4 /dev/sdb1 /data/pgdata/pv1mount -t ext4 /dev/sdb3 /data/pgdata/pv2mount -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 2kubectl create namespace pgokubectl 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
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: ext4116 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
启用 PGO 客户端,创建数据库集群。
kubectl exec -it -n pgo $(kubectl get po -n pgo -l name=pgo-client -o jsonpath='{range .items[*]}{.metadata.name}{end}') -- bashpgo 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
通过执行 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 svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEpostgres-operator ClusterIP 10.96.64.37 <none> 8443/TCP,4171/TCP,4150/TCP 58mradondb ClusterIP 10.96.171.227 <none> 10000/TCP,9187/TCP,2022/TCP,5432/TCP 5m42sradondb-backrest-shared-repo ClusterIP 10.96.235.247 <none> 2022/TCP 5m42sradondb-pgbouncer ClusterIP 10.96.234.49 <none> 5432/TCP 4m16sradondb-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 radondbkubectl exec -it rp1-65798ccf5c-ftbp9 -n pgo -c database bash
可以看到图中为 3 节点集群。至此,RadonDB PostgreSQL 容器化数据库搭建完成。
1.local-static-provisioner:https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner
RadonDB 开源社区向本文的投稿作者表示感谢!也期待更多的社区小伙伴的投稿~