作者:王志斌
編輯:鐘華龍
本文來自社區(qū)小伙伴 王志斌 的投稿辨泳。從小白的角度蓖扑,帶你一步步實現(xiàn)將 RadonDB PostgreSQL 集群部署到 Kubernetes 上唉铜。文章分為上下兩部分,《第一部 Kubernetes 環(huán)境準備》已經發(fā)布律杠。第二部分將帶大家部署一個 RadonDB PostgreSQL Operator 和集群打毛。
什么是 RadonDB PostgreSQL Operator柿赊?
RadonDB PostgreSQL 是一款基于 PostgreSQL 使用 Operator 實現(xiàn)的數據庫容器化項目。
- 被廣泛應用于地理空間和移動領域
- 具備高可用幻枉、穩(wěn)定性、數據完整性等性能
- 支持在線水平擴展
- 支持故障自動轉移 诡蜓,提供 HA 功能
- 提供 PostgreSQL 常用參數接口熬甫,方便調整參數
- 提供 PostGIS 插件,具備存儲蔓罚、查詢和修改空間關系的能力
- 提供實時監(jiān)控椿肩、健康檢查、日志自動清理等功能
RadonDB PostgreSQL Operator 可基于 KubeSphere豺谈、OpenShift郑象、Rancher 等 Kubernetes 容器平臺交付〔缒可自動執(zhí)行與運行 RadonDB PostgreSQL 集群有關的任務厂榛。
RadonDB PostgreSQL Operator基于 https://github.com/CrunchyData/postgres-operator 項目實現(xiàn),進行了改進優(yōu)化丽惭,后續(xù)會持續(xù)回饋給社區(qū)击奶。
倉庫地址: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
责掏,以下的步驟為配置集群所使用的本地持久化存儲卷柜砾,配置一個一主一從的高可用集群,最低需要三個持久化存儲卷:
- PostgreSQL Primary 數據卷
- PostgreSQL Replica 數據卷
- PostgreSQL 備份卷
實際使用可以根據具體的情況换衬,靈活配置存儲卷痰驱。
大體步驟:
- 虛擬機添加新硬盤(每臺虛擬機分別添加一塊)
- 重啟虛擬機
- 查看現(xiàn)磁盤是否正常掛載
fdisk -l
可看到新加的虛擬硬盤,一般名為: Disk /dev/sdb
給新加的硬盤分區(qū)瞳浦。
fdisk /dev/sdb
#按照提示增加新分區(qū)
/dev/sdb1 /dev/sdb2 /dev/sdb13
格式化磁盤分區(qū)担映。用 ext4 格式對 /dev/sdb1
進入格式化。
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkfs.ext4 /dev/sdb3
掛載分區(qū)术幔,創(chuàng)建新的掛載點另萤。
mkdir -p /data/pgdata/pv{1..3}
將新磁盤分區(qū)掛載到 /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
實現(xiàn)開機自動掛載诅挑。
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
創(chuàng)建命名空間
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
# 查看狀態(tài)
kubectl get all -n pgo --selector=name=postgres-operator
安裝靜態(tài)本地盤控制器
Kubernetes 當前支持靜態(tài)分配的本地存儲四敞。可使用 local-static-provisioner[1] 項目中的 local-volume-provisioner
程序創(chuàng)建本地存儲對象拔妥。
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
部署數據庫集群
啟用 PGO 客戶端忿危,創(chuàng)建數據庫集群。
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
部分參數可參見下表没龙,并可執(zhí)行 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 協(xié)議的對象存儲設置,主要用于備份迹缀。若備份存儲選擇了 s3 則需要設置這部分參數使碾。 |
--metrics | 啟用適用于 Prometheus 的指標收集器。 |
--pgbadger | 啟用 pgbadger裹芝。 |
--debug | 調試模式部逮。 |
執(zhí)行以下命令觀察集群創(chuàng)建過程。待所有 Pod 狀態(tài)切換為 Running嫂易,則集群創(chuàng)建完成兄朋。
kubectl get po -n pgo --watch
檢查 local pv 是否正常綁定
kubectl get pv -n pgo |grep ^local
二怜械、連接 RadonDB PostgreSQL 集群
通過執(zhí)行 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
可以看到圖中為 3 節(jié)點集群驾霜。至此案训,RadonDB PostgreSQL 容器化數據庫搭建完成。
引用鏈接
1.local-static-provisioner:https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner
致謝
RadonDB 開源社區(qū)向本文的投稿作者表示感謝粪糙!也期待更多的社區(qū)小伙伴的投稿~