【问题标题】:Kubernetes postgres replication with pgpool使用 pgpool 进行 Kubernetes postgres 复制
【发布时间】:2020-03-15 09:44:06
【问题描述】:

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

  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 数据库创建了一个用户“test”。
  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. 尝试连接 kubernetes 集群的 NodePort IP 和 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?还是我错过了此用户更新的某些内容。

【问题讨论】:

    标签: postgresql authentication kubernetes database-replication pgpool


    【解决方案1】:

    您部署的 postgres 示例使用机密对象来存储用户和密码凭据。这是管理敏感数据的推荐方式 Kubernetes 部署。

    本例中有以下instructions:

    • 由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 秘密对象。

    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
    

    请注意,每个编码密码旁边的 cmets 是解码密码,因此在生产设置中应避免使用它。

    然后来自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,然后在本地创建,不会传播到其他节点。

    按照these 的说明安装 Postgres Operator(pgo 客户端)并将其配置为与 kubernetes 一起使用。

    【讨论】:

    • 我对这一切都很清楚,并以适当的方式完成了它。我面临的问题是,我从 postgres 数据库中创建了一个新的 db_user 'test'。试图用这个用户“psql -h localhost postgres -U test”连接db。这让我从db_pod中登录。当我尝试同一个用户通过pg-pool登录时“psql -h NODE_IP -U test -d postgres - -port NODE_PORT"。它不让我登录。是不是说pgpool的user_list和db_users完全不同?不能用db_users通过pgpool登录吗?
    猜你喜欢
    • 2012-04-20
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2023-02-15
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多