簡體   English   中英

Kubernetes 使用 pgpool 進行 postgres 復制

[英]Kubernetes postgres replication with pgpool

嘗試在 kubernetes ( https://github.com/paunin/PostDock/tree/master/k8s/example2-single-statefulset ) 中部署 postgres,

  1. 使用 pgpool-II(2 個副本)以及 1 個 postgres-master pod 和 2 個 slave pod。
kubectl get pods -n postgres
NAME                                       READY   STATUS    RESTARTS   AGE
psql-db-pgpool-8****c-7**k             1/1     Running   0          35d
psql-db-pgpool-8****c-m**5             1/1     Running   0          35d
psql-db-node-0                         1/1     Running   0          35d
psql-db-node-1                         1/1     Running   0          35d
psql-db-node-2                         1/1     Running   0          20h
  1. 使用 postgres 用戶從主 postgres 數據庫創建用戶“測試”。
  2. 嘗試從 pod(node-0)內部連接時,身份驗證成功,用戶為“test”。
root@postgres-db-node-0:/# psql -h localhost postgres -U test
psql (11.4 (Debian 11.4-1.pgdg90+1))
Type "help" for help.

postgres=> \l
  1. 嘗試連接 NodePort IP 和 kubernetes 集群的 NodePort 時,新用戶“test”身份驗證失敗, pool_passwd 文件不包含“test”條目
psql -h NODE_IP -U test -d postgres --port NODE_PORT
psql: FATAL:  md5 authentication failed
DETAIL:  pool_passwd file does not contain an entry for "test"
  1. 登錄 pgpool-II pod 了解一下
root@psql-db-pgpool-8****c-7**k:/# cat /usr/local/etc/pool_passwd
user1:md5****422f
replica_user:md5****3

在數據庫中創建的新用戶“test”不會反映在 pgpool 中。 它是否以這種方式工作,每次創建新用戶時創建和更新 pgpool? 還是我錯過了此用戶更新的某些內容。

您部署的 postgres 示例使用秘密 object 來存儲用戶和密碼憑據。 這是在 kubernetes 部署中管理敏感數據的推薦方法。

此示例中有以下說明

  • 通過kubectl create -f./namespace/創建命名空間
  • 創建配置: kubectl create -f./configs/
  • 創建卷kubectl create -f./volumes/
  • 創建服務kubectl create -f./services/
  • 創建節點kubectl create -f./nodes/
  • 創建 pgpool kubectl create -f./pgpool/

如果您按照正確的順序進行操作,則在從configs/secret.yml調用kubectl create -f./configs/時會創建mysystem-secret secret object。

apiVersion: v1
kind: Secret
metadata:
  namespace: mysystem
  name: mysystem-secret
type: Opaque
data:
  app.db.user: d2lkZQ== #wide
  app.db.password: cGFzcw== #pass
  app.db.cluster.replication.user: cmVwbGljYV91c2Vy #replica_user
  app.db.cluster.replication.password: cmVwbGljYV9wYXNz #replica_pass
  app.db.pool.users: d2lkZTpwYXNz #wide:pass
  app.db.pool.pcp.user: cGNwX3VzZXI= #pcp_user
  app.db.pool.pcp.password: cGNwX3Bhc3M= #pcp_pass

請注意,每個編碼密碼旁邊的注釋都是解碼密碼,因此在生產設置中應避免使用。

然后來自mysystem-secret的用戶和密碼憑證在kubectl create -f./nodes/kubectl create -f./pgpool/中用作所有副本中的環境值,可用於連接到數據庫。

...
            - name: "POSTGRES_USER"
              valueFrom:
                secretKeyRef:
                  name: mysystem-secret
                  key: app.db.user
            - name: "POSTGRES_PASSWORD"
              valueFrom:
                secretKeyRef:
                  name: mysystem-secret
                  key: app.db.password
...

如果您想使用您自己的用戶名和密碼您需要修改configs/secret.yml文件並將您希望修改的密碼替換為 base64 編碼的密碼。

您可以使用以下命令輕松地將任何密碼編碼為 base64:

echo -n 'admin' | base64
YWRtaW4=
echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

更新:

要在集群部署后添加可以使用 pgpool 的其他用戶,您可以使用工具postgres-operator 通過 exec 手動添加到 pod 並在本地創建的用戶不會傳播到其他節點。

按照這些說明安裝 Postgres Operator(pgo 客戶端)並將其配置為與 kubernetes 一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM