給小白的 PG 容器化部署教學(下)

2022-06-02 15:00:33

作者:王志斌

編輯:鍾華龍

本文來自社群小夥伴 王志斌 的投稿。從小白的角度,帶你一步步實現將 RadonDB PostgreSQL 叢集部署到 Kubernetes 上。文章分為上下兩部分,《第一部 Kubernetes 環境準備》已經發布。第二部分將帶大家部署一個 RadonDB PostgreSQL Operator 和叢集。

什麼是 RadonDB PostgreSQL Operator?

RadonDB PostgreSQL 是一款基於 PostgreSQL 使用 Operator 實現的資料庫容器化專案。

  • 被廣泛應用於地理空間和移動領域
  • 具備高可用、穩定性、資料完整性等效能
  • 支援線上水平擴充套件
  • 支援故障自動轉移 ,提供 HA 功能
  • 提供 PostgreSQL 常用引數介面,方便調整引數
  • 提供 PostGIS 外掛,具備儲存、查詢和修改空間關係的能力
  • 提供實時監控、健康檢查、紀錄檔自動清理等功能

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

安裝靜態本地盤控制器

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

部署資料庫叢集

啟用 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

二、連線 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

可以看到圖中為 3 節點叢集。至此,RadonDB PostgreSQL 容器化資料庫搭建完成。

參照連結

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

致謝

RadonDB 開源社群向本文的投稿作者表示感謝!也期待更多的社群小夥伴的投稿~